Ukratko: Fail2ban čita zapisničke datoteke i u vatrozidu blokira adrese koje se unutar vremenskog okvira previše ističu. Za Nginx i Apache donosi gotove jailove poput nginx-botsearch ili apache-noscript; vlastite filtre testirate pomoću fail2ban-regex. Postavke pripadaju u jail.local, Vaše vlastite adrese u ignoreip, a ponavljače hvata recidive jail. Protiv pojedinačnih ciljanih napada Fail2ban ne pomaže, protiv masovnih skeniranja pomaže.
Kad su zapisnici puni skenera
Tko ovih dana pogleda pristupne zapisnike svojih web-poslužitelja, često ih nalazi pune zahtjeva za putove koji uopće ne postoje: stara administratorska sučelja, testne datoteke, poznate slabosti drugih proizvoda. U situaciji poput PHP2Shella dolazi i ciljana potraga za ranjivim poslužiteljima: Cloudflare i Patchstack izvijestili su o pokušajima napada, a Unit 42 izbrojio je više od 22,6 milijuna izloženih, potencijalno ranjivih instanci.
Fail2ban je provjeren alat protiv te mase. Čita zapisničke datoteke, filtrima prepoznaje upadljive unose i adresu pošiljatelja blokira u vatrozidu na određeno vrijeme. To rasterećuje poslužitelj, smanjuje šum u zapisnicima i otežava sustavno isprobavanje iz jednog izvora.
Što Fail2ban ne može, jednako je važno: pojedinačan zahtjev koji iskorištava ranjivost ne sprječava se. Protiv PHP2Shella pomaže samo PHP ažuriranje. Kako teku automatizirani napadi, opisuje članak Masovna skeniranja nezakrpanog PHP-a.
Fail2ban za Nginx i Apache: isporučeni jailovi
Jail povezuje filtar sa zapisničkom datotekom i akcijom blokade. Isporučeni jail.conf već sadrži jailove za web-poslužitelje. Zadano su isključeni i aktiviraju se pojedinačno.
| Jail | Web-poslužitelj | Prepoznaje |
|---|---|---|
nginx-http-auth |
Nginx | neuspjele HTTP Basic prijave |
nginx-limit-req |
Nginx | zahtjeve koji premašuju rate limit Nginxa |
nginx-botsearch |
Nginx | potragu za tipičnim, nepostojećim putovima |
nginx-bad-request |
Nginx | neispravne zahtjeve |
apache-auth |
Apache | neuspjele prijave |
apache-badbots |
Apache | poznate štetne oznake botova |
apache-noscript |
Apache | pozive nepostojećih skripti |
apache-overflows |
Apache | preduge zahtjeve |
apache-botsearch |
Apache | potragu za tipičnim, nepostojećim putovima |
php-url-fopen |
oba | određene obrasce pokušaja uključivanja URL-ova |
recidive |
oba | adrese koje je Fail2ban već više puta blokirao |
Zadane vrijednosti isporučene konfiguracije prilično su blage: blokada 10 minuta nakon 5 pogodaka u 10 minuta. Za web-poslužitelje s mnogo prometa skenera isplati se dulja blokada i rastući faktor za ponavljanja.
Osnovna konfiguracija u jail.local
jail.conf sam kaže da se ne smije mijenjati jer ga ažuriranja zamjenjuju. Vlastite vrijednosti pripadaju u /etc/fail2ban/jail.local. Sljedeći primjer za Nginx postavlja smislene zadane vrijednosti i aktivira prikladne jailove:
# /etc/fail2ban/jail.local
[DEFAULT]
# Upisati vlastite fiksne adrese (zamijeniti primjer adrese)
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
Za Apache umjesto toga aktivirajte primjerice apache-auth, apache-noscript i apache-botsearch. Putove zapisnika Fail2ban donosi po distribuciji; ako se Vaši putovi razlikuju, postavite logpath u dotičnom jailu. Ako Vaš sustav zapisnike čita samo preko journala, pomaže backend = systemd.
Vlastiti filtar za masovne zahtjeve za PHP datotekama
Tipičan obrazac u aktualnoj situaciji su mnogi zahtjevi u kratkom vremenu za PHP datotekama koje ne postoje. Vlastiti filtar to prepoznaje po statusnom kodu 404. Opisuje samo ono što stoji u Vašem vlastitom zapisniku:
# /etc/fail2ban/filter.d/nginx-php-404.conf
[Definition]
failregex = ^<HOST> -.*"(GET|POST|HEAD) [^"]*\.php[^"]*" 404
ignoreregex =
# Dopuna u /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
Prije aktivacije filtra provjerite ga na stvarnom zapisniku. Tako vidite koliko redaka pogađa i ima li među njima legitimnih pristupa:
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
# Odblokirati nehotice blokiranu adresu
sudo fail2ban-client set nginx-php-404 unbanip 203.0.113.25
Prag odaberite velikodušno. Crawler koji obrađuje zastarjele poveznice ili usluga nadzora ne smije završiti u blokadi.
Najčešće zamke
Fail2ban se brzo instalira, ali lako pogrešno primjenjuje. Ove točke provjerite prije produkcijske uporabe:
- Zaključavanje samih sebe: adrese ureda, VPN-a i nadzora pripadaju u
ignoreipprije nego jailovi postanu aktivni. - Usluge ispred poslužitelja: iza CDN-a ili load balancera Fail2ban bez prilagodbe vidi samo njihove adrese. Više o tome u vodiču Zaštititi administratorske prijave od brute forcea.
- Rotacija zapisnika: nakon promjene zapisničke datoteke Fail2ban mora čitati novu datoteku. Nakon prve rotacije provjerite broje li jailovi i dalje pogotke.
- Suradnja s vatrozidom: Fail2ban blokade upisuje u vatrozid. Tko svoj vatrozid održava potpunim ponovnim učitavanjem skupa pravila, može pritom obrisati te unose. Kako sam vatrozid izgraditi, piše u članku Vatrozid za web-poslužitelje: otvoriti samo nužne portove.
- IPv6: napadi stižu i putem IPv6. Provjerite pokriva li Vaša akcija blokade oba protokola.
Redovito analizirajte popise blokada. Ako se blokade nagomilavaju iz određenih mreža ili na određene putove, to je znak ciljane potrage i povod da se pogođena aplikacija pomnije pogleda.
Zaključak: alat protiv mase, a ne protiv svega
Fail2ban se brzo postavlja i web-poslužiteljima skida dio stalne paljbe. Isporučeni jailovi pokrivaju tipične obrasce, vlastiti filtri mogu se bez opasnosti testirati naredbom fail2ban-regex na stvarnim zapisnicima, a recidive jail brine da ustrajni izvori dulje ostanu vani.
Ne precjenjujte ga. Fail2ban reagira na ponavljanje, a ne na prvi pogodak, i vidi samo ono što stoji u zapisnicima. Protiv ranjivosti poput PHP2Shella pomaže samo ažuriranje, a protiv distribuiranih napada s mnogo adresa Fail2ban jedva pomaže. Svoju vrijednost razvija kao jedan sloj među više njih: uz vitak vatrozid, ojačanu konfiguraciju web-poslužitelja, dvofaktorsku prijavu i nadzor koji neobičnosti ne samo blokira nego i prijavljuje.
Kako PHP SOS konkretno pomaže?
- Analizirati zapisnike: pregledavamo koji se obrasci pojavljuju u Vašim pristupnim zapisnicima i biramo prikladne jailove.
- Postaviti i testirati: postavljamo Fail2ban s vlastitim filtrima, svaki filtar testiramo na stvarnim zapisnicima i Vaše fiksne adrese upisujemo kao iznimku.
- Uskladiti suradnju: CDN, load balancer, vatrozid i rotaciju zapisnika usklađujemo tako da blokade pogađaju prave adrese.
- Promatrati: u sklopu sigurnosnog nadzora kontinuirano analiziramo blokade i neobičnosti.
Česta pitanja
Štiti li Fail2ban od PHP2Shella?
Ne. Fail2ban reagira tek nakon što se adresa više puta istakne u zapisnicima. Pojedinačan uspješan napad time se ne sprječava. Fail2ban ipak smanjuje opterećenje od skenera i poskupljuje ponovljene pokušaje iz istog izvora.
Zašto jail.conf ne bih mijenjao izravno?
Datoteka se pri ažuriranju paketa zamjenjuje, a to i sama kaže. Vlastite postavke pripadaju u jail.local ili u datoteke pod jail.d. Tamo ciljano nadjačavaju zadane vrijednosti.
Što je recidive jail?
Jail koji analizira zapisnik samog Fail2bana. Tko se stalno iznova blokira, dobiva znatno dulju blokadu. U isporučenoj konfiguraciji ona iznosi tjedan dana.
Radi li Fail2ban iza Cloudflarea ili load balancera?
Samo uz dodatnu konfiguraciju. Bez nje se u zapisnicima nalazi adresa usluge ispred poslužitelja i blokada bi pogodila sve posjetitelje. Web-poslužitelj tada mora preuzeti stvarnu adresu posjetitelja, a blokade je bolje postavljati kod usluge ispred poslužitelja.