Текуща ситуация: PHP2Shell. Две критични уязвимости в PHP (CVSS 9,2) позволяват злонамерен код без вход. Корекции от 21.10.2026 г.Какво да направите сега →

Настройка на Fail2ban за уеб сървъри

Fail2ban блокира адреси, които многократно се набиват на очи в логовете. За уеб сървъри има готови филтри, а с няколко реда се добавят собствени. Така го настройвате, без да блокирате себе си или клиентите си.

Актуалност 5 мин. четенеЗаздравяване и конфигурация

Накратко: Fail2ban чете лог файлове и блокира в защитната стена адреси, които в рамките на времеви прозорец се набиват твърде често на очи. За Nginx и Apache той носи готови jail-ове като nginx-botsearch или apache-noscript; собствени филтри тествате с fail2ban-regex. Настройките принадлежат в jail.local, Вашите собствени адреси в ignoreip, повторните нарушители улавя jail-ът recidive. Срещу единични целенасочени атаки Fail2ban не помага, срещу масови сканирания помага.

Когато логовете са пълни със скенери

Който в тези дни разгледа протоколите за достъп на уеб сървърите си, често ги намира пълни със заявки към пътища, които изобщо не съществуват: стари администраторски интерфейси, тестови файлове, познати слабости на други продукти. При положение като PHP2Shell се добавя целенасочено търсене на уязвими сървъри: Cloudflare и Patchstack съобщиха за опити за атака, Unit 42 преброи повече от 22,6 милиона изложени, потенциално уязвими инстанции.

Fail2ban е доказан инструмент срещу тази маса. Той чете лог файлове, разпознава с филтри необичайни записи и блокира адреса на подателя за определено време в защитната стена. Това разтоварва сървъра, намалява шума в логовете и затруднява системното пробване от един източник.

Какво Fail2ban не може, е също толкова важно: единична заявка, която използва уязвимост, не се предотвратява. Срещу PHP2Shell помага само актуализацията на PHP. Как протичат автоматизираните атаки, описва Масови сканирания за непачнат PHP.

Fail2ban за Nginx и Apache: доставените jail-ове

Jail свързва филтър с лог файл и действие за блокиране. Доставеният jail.conf вече съдържа jail-ове за уеб сървъри. По подразбиране те са изключени и се активират поотделно.

Jail Уеб сървър Разпознава
nginx-http-auth Nginx неуспешни HTTP Basic входове
nginx-limit-req Nginx заявки, надвишаващи ограничението на честотата в Nginx
nginx-botsearch Nginx търсене на типични, несъществуващи пътища
nginx-bad-request Nginx грешни заявки
apache-auth Apache неуспешни входове
apache-badbots Apache познати вредни идентификатори на ботове
apache-noscript Apache извиквания на несъществуващи скриптове
apache-overflows Apache прекомерно дълги заявки
apache-botsearch Apache търсене на типични, несъществуващи пътища
php-url-fopen и двата определени модели на опити за включване на URL
recidive и двата адреси, които Fail2ban е блокирал многократно

Стойностите по подразбиране на доставената конфигурация са по-скоро меки: блокиране за 10 минути след 5 попадения за 10 минути. За уеб сървъри с много трафик от сканиране си струва по-дълго блокиране и нарастващ фактор при повторения.

Основната конфигурация в jail.local

jail.conf сам казва, че не бива да се променя, защото актуализациите го заменят. Собствените стойности принадлежат в /etc/fail2ban/jail.local. Следният пример за Nginx задава смислени стойности по подразбиране и активира подходящи jail-ове:

# /etc/fail2ban/jail.local
[DEFAULT]
# Въведете собствените си фиксирани адреси (заменете примерния адрес)
ignoreip = 127.0.0.1/8 ::1 203.0.113.10
bantime  = 1h
findtime = 10m
maxretry = 5
bantime.increment = true

[nginx-http-auth]
enabled = true

[nginx-botsearch]
enabled = true

[recidive]
enabled  = true
bantime  = 1w
findtime = 1d

За Apache активирайте вместо това например apache-auth, apache-noscript и apache-botsearch. Пътищата до логовете Fail2ban носи според дистрибуцията; ако Вашите пътища се различават, задайте logpath в съответния jail. Ако Вашата система чете логове само през журнала, помага backend = systemd.

Собствен филтър за масови заявки към PHP файлове

Типичен модел в сегашното положение са много заявки за кратко време към PHP файлове, които не съществуват. Собствен филтър го разпознава по кода на състоянието 404. Той описва само това, което стои във Вашия собствен лог:

# /etc/fail2ban/filter.d/nginx-php-404.conf
[Definition]
failregex = ^<HOST> -.*"(GET|POST|HEAD) [^"]*\.php[^"]*" 404
ignoreregex =
# Допълнение в /etc/fail2ban/jail.local
[nginx-php-404]
enabled  = true
port     = http,https
filter   = nginx-php-404
logpath  = /var/log/nginx/access.log
maxretry = 20
findtime = 1m
bantime  = 1h

Преди да активирате филтъра, проверете го срещу истинския лог. Така виждате колко реда улавя и има ли сред тях легитимни достъпи:

fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-php-404.conf
sudo systemctl restart fail2ban
sudo fail2ban-client status
sudo fail2ban-client status nginx-php-404
# Освобождаване на погрешно блокиран адрес
sudo fail2ban-client set nginx-php-404 unbanip 203.0.113.25

Изберете прага щедро. Робот за обхождане, който обработва остарели връзки, или услуга за мониторинг не бива да попада в блокировка.

Най-честите клопки

Fail2ban се инсталира бързо, но лесно се използва неправилно. Тези точки трябва да проверите преди продукционна употреба:

  1. Самоблокиране: адресите на офиса, VPN и мониторинга принадлежат в ignoreip, преди jail-овете да станат активни.
  2. Предходни услуги: зад CDN или балансьор на натоварването Fail2ban без адаптиране вижда само техните адреси. Повече по темата в ръководството Защита на администраторските входове срещу Brute Force.
  3. Ротация на логовете: след смяна на лог файла Fail2ban трябва да чете новия файл. След първата ротация проверете дали jail-овете продължават да броят попадения.
  4. Взаимодействие със защитната стена: Fail2ban записва блокировките в защитната стена. Който управлява защитната си стена с пълно презареждане на правилата, може при това да изтрие тези записи. Как да изградите самата защитна стена, е описано в Защитна стена за уеб сървъри: отваряйте само необходимите портове.
  5. IPv6: атаките идват и през IPv6. Проверете дали Вашето действие за блокиране покрива и двата протокола.
Съвет

Анализирайте редовно списъците с блокирани. Ако блокировките се трупат от определени мрежи или към определени пътища, това е знак за целенасочено търсене и повод да разгледате по-отблизо засегнатото приложение.

Извод: инструмент срещу масата, не срещу всичко

Fail2ban се настройва бързо и сваля от уеб сървърите част от непрекъснатия обстрел. Доставените jail-ове покриват типични модели, собствени филтри могат да се тестват безопасно срещу истински логове с fail2ban-regex, а jail-ът recidive гарантира, че упоритите източници остават навън по-дълго.

Не го надценявайте. Fail2ban реагира на повторение, не на първото попадение, и вижда само това, което е в логовете. Срещу уязвимост като PHP2Shell помага единствено актуализацията, срещу разпределени атаки от много адреси Fail2ban почти не помага. Стойността му се проявява като един слой между няколко: до пестелива защитна стена, заздравена конфигурация на уеб сървъра, двуфакторна автентикация и мониторинг, който необичайното не само блокира, но и съобщава.

Как помага PHP SOS конкретно?

  • Анализ на логовете: разглеждаме какви модели се появяват във Вашите протоколи за достъп и избираме подходящи jail-ове.
  • Настройка и тест: настройваме Fail2ban със собствени филтри, тестваме всеки филтър срещу истински логове и вписваме Вашите фиксирани адреси като изключение.
  • Изясняване на взаимодействието: CDN, балансьор на натоварването, защитна стена и ротация на логовете съгласуваме така, че блокировките да засягат правилните адреси.
  • Наблюдение: в рамките на мониторинга на сигурността анализираме текущо блокировките и необичайното.

Често задавани въпроси

Защитава ли Fail2ban от PHP2Shell?

Не. Fail2ban реагира едва след като един адрес многократно е бил забелязан в логовете. Единична успешна атака така не се предотвратява. Fail2ban обаче намалява натоварването от скенери и оскъпява повторните опити от един и същи източник.

Защо да не променям jail.conf директно?

Файлът се заменя при актуализации на пакета и сам го казва. Собствените настройки принадлежат в jail.local или във файлове под jail.d. Там те презаписват стойностите по подразбиране целенасочено.

Какво е recidive jail?

Jail, който анализира протокола на самия Fail2ban. Който многократно бива блокиран, получава значително по-дълга блокировка. В доставената конфигурация тя е една седмица.

Работи ли Fail2ban зад Cloudflare или балансьор на натоварването?

Само с допълнителна конфигурация. Без нея в логовете стои адресът на предходната услуга и блокиране би засегнало всички посетители. Уеб сървърът трябва тогава да поема истинския адрес на посетителя, а блокирането се прави по-добре при предходната услуга.

Източници

Незабавен контакт

Всеки час има значение. Пишете ни сега.

Опишете накратко системата, версията на PHP и какво сте забелязали. Ние се свързваме с Вас, уточняваме ситуацията и работим отдалечено, докато инцидентът бъде приключен и документиран.

Незабавна помощ