Aktuálna situácia: PHP2Shell. Dve kritické zraniteľnosti PHP (CVSS 9.2) umožňujú spustenie škodlivého kódu bez prihlásenia. Záplaty od 21. 10. 2026.Čo treba urobiť teraz →

Nastavenie Fail2ban pre webové servery

Fail2ban blokuje adresy, ktoré sa v protokoloch opakovane objavujú. Pre webové servery prináša hotové filtre a niekoľkými riadkami pribudnú vlastné. Takto ho nastavíte bez vylúčenia seba alebo svojich zákazníkov.

Stav 5 min čítaniaHardening a konfigurácia

Stručne: Fail2ban číta súbory protokolov a vo firewalle blokuje adresy, ktoré sa v časovom okne objavia príliš často. Pre Nginx a Apache prináša hotové jaily ako nginx-botsearch alebo apache-noscript; vlastné filtre testujte pomocou fail2ban-regex. Nastavenia patria do jail.local, vaše vlastné adresy do ignoreip a opakovaných páchateľov zachytí jail recidive. Proti jednotlivým cieleným útokom Fail2ban nepomáha, proti hromadným skenom áno.

Keď sú protokoly plné skenerov

Kto si v týchto dňoch pozrie prístupové protokoly svojich webových serverov, často ich nájde plné požiadaviek na cesty, ktoré vôbec neexistujú: staré administrátorské rozhrania, testovacie súbory, známe zraniteľnosti iných produktov. V situácii ako PHP2Shell pribúda cielené hľadanie zraniteľných serverov: Cloudflare a Patchstack hlásili pokusy o útok, Unit 42 napočítal viac než 22,6 milióna exponovaných, potenciálne zraniteľných inštancií.

Fail2ban je osvedčený nástroj proti tejto hmote. Číta súbory protokolov, filtrami rozpoznáva nápadné záznamy a adresu odosielateľa zablokuje vo firewalle na stanovený čas. To odľahčuje server, znižuje šum v protokoloch a systematické skúšanie z jedného zdroja robí namáhavejším.

Čo Fail2ban nedokáže, je rovnako dôležité: jednotlivej požiadavke, ktorá zneužije zraniteľnosť, nezabráni. Proti PHP2Shell pomáha len aktualizácia PHP. Ako prebiehajú automatizované útoky, opisuje Hromadné skeny po nezáplatovanom PHP.

Fail2ban pre Nginx a Apache: dodávané jaily

Jail spája filter so súborom protokolu a akciou blokovania. Dodávaný jail.conf už obsahuje jaily pre webové servery. Sú štandardne vypnuté a aktivujú sa jednotlivo.

Jail Webový server Rozpoznáva
nginx-http-auth Nginx neúspešné prihlásenia HTTP Basic
nginx-limit-req Nginx požiadavky, ktoré prekračujú rate limit Nginx
nginx-botsearch Nginx hľadanie typických, neexistujúcich ciest
nginx-bad-request Nginx chybné požiadavky
apache-auth Apache neúspešné prihlásenia
apache-badbots Apache známe identifikátory škodlivých botov
apache-noscript Apache otvorenia neexistujúcich skriptov
apache-overflows Apache príliš dlhé požiadavky
apache-botsearch Apache hľadanie typických, neexistujúcich ciest
php-url-fopen oba určité vzory pokusov o vloženie URL
recidive oba adresy, ktoré Fail2ban opakovane zablokoval

Štandardné hodnoty dodávanej konfigurácie sú skôr mierne: blokovanie na 10 minút po 5 zásahoch za 10 minút. Pre webové servery s veľkým skenovacím prenosom sa oplatí dlhšie blokovanie a rastúci faktor pre opakovania.

Základná konfigurácia v jail.local

jail.conf sám uvádza, že sa nemá meniť, pretože ho aktualizácie nahrádzajú. Vlastné hodnoty patria do /etc/fail2ban/jail.local. Nasledujúci príklad pre Nginx nastavuje rozumné štandardy a aktivuje vhodné jaily:

# /etc/fail2ban/jail.local
[DEFAULT]
# Zapísať vlastné pevné adresy (nahradiť vzorovú adresu)
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

Pre Apache aktivujete namiesto toho napríklad apache-auth, apache-noscript a apache-botsearch. Cesty k protokolom prináša Fail2ban podľa distribúcie; ak sa vaše cesty líšia, nastavte logpath v príslušnom jaile. Ak váš systém číta protokoly len cez žurnál, pomôže backend = systemd.

Vlastný filter pre hromadné požiadavky na súbory PHP

Typickým vzorom v aktuálnej situácii je veľa požiadaviek v krátkom čase na súbory PHP, ktoré neexistujú. Vlastný filter to rozpozná podľa stavového kódu 404. Popisuje len to, čo je vo vašom vlastnom protokole:

# /etc/fail2ban/filter.d/nginx-php-404.conf
[Definition]
failregex = ^<HOST> -.*"(GET|POST|HEAD) [^"]*\.php[^"]*" 404
ignoreregex =
# Doplnenie v /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

Skôr než filter aktivujete, otestujte ho proti skutočnému protokolu. Uvidíte, koľko riadkov zachytí a či sú medzi nimi legitímne prístupy:

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
# Uvoľniť omylom zablokovanú adresu
sudo fail2ban-client set nginx-php-404 unbanip 203.0.113.25

Prah zvoľte štedro. Prehľadávač, ktorý spracúva zastarané odkazy, alebo monitorovacia služba nesmie skončiť v blokovaní.

Najčastejšie pasce

Fail2ban sa nainštaluje rýchlo, ale ľahko sa nasadí nesprávne. Tieto body by ste mali pred produkčným nasadením skontrolovať:

  1. Vlastné vylúčenie: adresy kancelárie, VPN a monitoringu patria do ignoreip, skôr než sa jaily aktivujú.
  2. Predradené služby: za CDN alebo load balancerom vidí Fail2ban bez úpravy len ich adresy. Viac v sprievodcovi Ochrana prihlásení administrátorov proti brute force.
  3. Rotácia protokolov: po zmene súboru protokolu musí Fail2ban čítať nový súbor. Po prvej rotácii skontrolujte, či jaily naďalej počítajú zásahy.
  4. Súhra s firewallom: Fail2ban zapisuje blokovania do firewallu. Kto spravuje firewall úplným opätovným načítaním súboru pravidiel, môže tieto záznamy zmazať. Ako firewall zostaviť, uvádza Firewall pre webové servery: otvárať len potrebné porty.
  5. IPv6: útoky prichádzajú aj cez IPv6. Skontrolujte, či vaša akcia blokovania pokrýva oba protokoly.
Tip

Zoznamy blokovaní pravidelne vyhodnocujte. Ak sa blokovania z určitých sietí alebo na určité cesty hromadia, je to náznak cieleného hľadania a dôvod pozrieť sa na dotknutú aplikáciu podrobnejšie.

Záver: nástroj proti hmote, nie proti všetkému

Fail2ban sa nastaví rýchlo a odoberá webovým serverom časť trvalého ostreľovania. Dodávané jaily pokrývajú typické vzory, vlastné filtre sa dajú bez rizika testovať pomocou fail2ban-regex proti skutočným protokolom a jail recidive zabezpečí, že húževnaté zdroje zostanú vonku dlhšie.

Nepreceňujte ho však. Fail2ban reaguje na opakovanie, nie na prvý zásah, a vidí len to, čo je v protokoloch. Proti zraniteľnosti ako PHP2Shell pomáha jedine aktualizácia, proti distribuovaným útokom z mnohých adries Fail2ban pomáha sotva. Svoju hodnotu prejavuje ako jedna vrstva z viacerých: popri štíhlom firewalle, sprísnenej konfigurácii webového servera, dvojfaktorovom prihlasovaní a monitoringu, ktorý nápadnosti nielen blokuje, ale aj hlási.

Ako konkrétne pomáha PHP SOS?

  • Vyhodnotiť protokoly: pozrieme sa, aké vzory sa vyskytujú vo vašich prístupových protokoloch, a vyberieme vhodné jaily.
  • Zriadiť a otestovať: Fail2ban nastavíme s vlastnými filtrami, každý filter otestujeme proti skutočným protokolom a vaše pevné adresy zapíšeme ako výnimku.
  • Objasniť súhru: CDN, load balancer, firewall a rotáciu protokolov zosúladíme tak, aby blokovania zasahovali správne adresy.
  • Sledovať: v rámci sledovania bezpečnosti priebežne vyhodnocujeme blokovania a nápadnosti.

Časté otázky

Chráni Fail2ban pred PHP2Shell?

Nie. Fail2ban reaguje až potom, čo sa adresa v protokoloch objavila opakovane. Jednotlivý úspešný útok tým nezabráni. Fail2ban však znižuje zaťaženie od skenerov a opakované pokusy z toho istého zdroja robí nákladnejšími.

Prečo nemám meniť jail.conf priamo?

Súbor sa pri aktualizáciách balíka nahrádza a sám to uvádza. Vlastné nastavenia patria do jail.local alebo do súborov pod jail.d. Tam štandardné hodnoty prepisujú cielene.

Čo je jail recidive?

Jail, ktorý vyhodnocuje protokol samotného Fail2ban. Kto je opakovane blokovaný, dostane výrazne dlhšie blokovanie. V dodávanej konfigurácii je to jeden týždeň.

Funguje Fail2ban za Cloudflare alebo load balancerom?

Len s dodatočnou konfiguráciou. Bez nej je v protokoloch adresa predradenej služby a blokovanie by postihlo všetkých návštevníkov. Webový server potom musí preberať skutočnú adresu návštevníka a blokovania sa lepšie nastavujú u predradenej služby.

Zdroje

Okamžitý kontakt

Každá hodina sa počíta. Napíšte nám hneď.

Stručne opíšte systém, verziu PHP a svoje pozorovanie. Ozveme sa, vyjasníme situáciu a budeme pracovať na diaľku, kým nebude incident uzavretý a zdokumentovaný.

Okamžitá pomoc