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ť:
- Vlastné vylúčenie: adresy kancelárie, VPN a monitoringu patria do
ignoreip, skôr než sa jaily aktivujú. - 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.
- 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.
- 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.
- IPv6: útoky prichádzajú aj cez IPv6. Skontrolujte, či vaša akcia blokovania pokrýva oba protokoly.
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.