Na kratko: Fail2ban bere datoteke dnevnikov in v požarnem zidu blokira naslove, ki se v časovnem oknu preveč izpostavijo. Za Nginx in Apache prinaša pripravljene jaile, kot sta nginx-botsearch ali apache-noscript; lastne filtre preizkusite s fail2ban-regex. Nastavitve sodijo v jail.local, vaši lastni naslovi v ignoreip, ponavljalce ujame jail recidive. Proti posameznim ciljnim napadom Fail2ban ne pomaga, proti množičnim skeniranjem pa.
Ko so dnevniki polni skenerjev
Kdor si te dni ogleda dnevnike dostopov svojih spletnih strežnikov, jih pogosto najde polne zahtev za poti, ki sploh ne obstajajo: stari skrbniški vmesniki, testne datoteke, znane ranljivosti drugih izdelkov. V razmerah, kot je PHP2Shell, se pridruži ciljno iskanje ranljivih strežnikov: Cloudflare in Patchstack sta poročala o poskusih napadov, Unit 42 pa je naštel več kot 22,6 milijona izpostavljenih, potencialno ranljivih instanc.
Fail2ban je preizkušeno orodje proti tej množici. Bere datoteke dnevnikov, s filtri prepozna sumljive vnose in naslov pošiljatelja za določen čas blokira v požarnem zidu. To razbremeni strežnik, zmanjša šum v dnevnikih in sistematično preizkušanje iz enega vira naredi težje.
Kar Fail2ban ne zmore, je enako pomembno: posamezna zahteva, ki izkoristi ranljivost, ni preprečena. Proti PHP2Shell pomaga samo posodobitev PHP. Kako samodejni napadi potekajo, opisuje Množična skeniranja za nepopravljen PHP.
Fail2ban za Nginx in Apache: priloženi jaili
Jail povezuje filter z datoteko dnevnika in akcijo blokade. Priložena jail.conf že vsebuje jaile za spletne strežnike. Privzeto so izklopljeni in se aktivirajo posamično.
| Jail | Spletni strežnik | Prepozna |
|---|---|---|
nginx-http-auth |
Nginx | neuspele prijave HTTP Basic |
nginx-limit-req |
Nginx | zahteve, ki presegajo omejitev hitrosti Nginx |
nginx-botsearch |
Nginx | iskanje tipičnih, neobstoječih poti |
nginx-bad-request |
Nginx | napačne zahteve |
apache-auth |
Apache | neuspele prijave |
apache-badbots |
Apache | znane škodljive oznake botov |
apache-noscript |
Apache | klici neobstoječih skriptov |
apache-overflows |
Apache | predolge zahteve |
apache-botsearch |
Apache | iskanje tipičnih, neobstoječih poti |
php-url-fopen |
oba | določeni vzorci poskusov vključevanja URL |
recidive |
oba | naslovi, ki jih je Fail2ban večkrat blokiral |
Privzete vrednosti priložene konfiguracije so precej blage: blokada za 10 minut po 5 zadetkih v 10 minutah. Za spletne strežnike z veliko prometa skenerjev se splača daljša blokada in naraščajoči faktor za ponovitve.
Osnovna konfiguracija v jail.local
jail.conf sama pravi, da je ne smete spreminjati, ker jo posodobitve zamenjajo. Lastne vrednosti sodijo v /etc/fail2ban/jail.local. Naslednji primer za Nginx nastavi smiselne privzete vrednosti in aktivira ustrezne jaile:
# /etc/fail2ban/jail.local
[DEFAULT]
# Vnesite lastne stalne naslove (nadomestite vzorčni naslov)
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 namesto tega aktivirate na primer apache-auth, apache-noscript in apache-botsearch. Poti dnevnikov Fail2ban prinese po distribuciji; če se vaše poti razlikujejo, nastavite logpath v zadevnem jailu. Če vaš sistem dnevnike bere samo prek journala, pomaga backend = systemd.
Lasten filter za množične zahteve za datoteke PHP
Tipičen vzorec v trenutnih razmerah je veliko zahtev v kratkem času za datoteke PHP, ki ne obstajajo. Lasten filter to prepozna po kodi stanja 404. Opisuje samo to, kar je v vašem lastnem dnevniku:
# /etc/fail2ban/filter.d/nginx-php-404.conf
[Definition]
failregex = ^<HOST> -.*"(GET|POST|HEAD) [^"]*\.php[^"]*" 404
ignoreregex =
# Dopolnitev 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
Preden filter aktivirate, ga preverite z resničnim dnevnikom. Tako vidite, koliko vrstic zadene in ali so vmes legitimni dostopi:
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
# Sprostite pomotoma blokiran naslov
sudo fail2ban-client set nginx-php-404 unbanip 203.0.113.25
Prag izberite radodarno. Iskalni pajek, ki obdeluje zastarele povezave, ali storitev za spremljanje ne sme končati v blokadi.
Najpogostejše pasti
Fail2ban je hitro nameščen, a ga je lahko napačno uporabiti. Te točke preverite pred produktivno uporabo:
- Lastna izključitev: naslovi pisarne, VPN in spremljanja sodijo v
ignoreip, preden jaili postanejo aktivni. - Predhodne storitve: za CDN ali uravnoteževalnikom obremenitve Fail2ban brez prilagoditve vidi samo njihove naslove. Več o tem v vodniku Zaščita skrbniških prijav pred Brute Force.
- Rotacija dnevnikov: po zamenjavi datoteke dnevnika mora Fail2ban brati novo datoteko. Po prvi rotaciji preverite, ali jaili še naprej štejejo zadetke.
- Sodelovanje s požarnim zidom: Fail2ban vnaša blokade v požarni zid. Kdor požarni zid upravlja s popolnim ponovnim nalaganjem pravil, lahko te vnose pri tem izbriše. Kako požarni zid sami zgradite, piše pod Požarni zid za spletne strežnike: odprite samo potrebna vrata.
- IPv6: napadi prihajajo tudi prek IPv6. Preverite, ali vaša akcija blokade pokriva obe protokola.
Seznama blokad redno ovrednotite. Če se blokade kopičijo iz določenih omrežij ali na določene poti, je to namig na ciljno iskanje in povod, da si prizadeto aplikacijo ogledate natančneje.
Sklep: orodje proti množici, ne proti vsemu
Fail2ban je hitro postavljen in spletnim strežnikom odvzame del nenehnega obstreljevanja. Priloženi jaili pokrivajo tipične vzorce, lastne filtre je mogoče s fail2ban-regex brez tveganja preizkusiti na pravih dnevnikih, jail recidive pa poskrbi, da trdovratni viri ostanejo zunaj dlje.
Ne precenjujte ga. Fail2ban se odziva na ponavljanje, ne na prvi zadetek, in vidi samo to, kar je v dnevnikih. Proti ranljivosti, kot je PHP2Shell, pomaga samo posodobitev, proti porazdeljenim napadom iz številnih naslovov Fail2ban komaj pomaga. Svojo vrednost razvije kot ena plast med več: poleg vitkega požarnega zidu, utrjene konfiguracije spletnega strežnika, dvostopenjske prijave in spremljanja, ki nepravilnosti ne samo blokira, ampak tudi javi.
Kako PHP SOS pomaga konkretno?
- Ovrednotenje dnevnikov: pogledamo, kateri vzorci se pojavljajo v vaših dnevnikih dostopov, in izberemo ustrezne jaile.
- Postavitev in preizkus: Fail2ban vzpostavimo z lastnimi filtri, vsak filter preizkusimo na pravih dnevnikih in vaše stalne naslove vnesemo kot izjemo.
- Razjasnitev sodelovanja: CDN, uravnoteževalnik obremenitve, požarni zid in rotacijo dnevnikov uskladimo tako, da blokade zadenejo prave naslove.
- Opazovanje: v okviru varnostnega nadzora sproti ovrednotimo blokade in nepravilnosti.
Pogosta vprašanja
Ali Fail2ban ščiti pred PHP2Shell?
Ne. Fail2ban se odzove šele, ko se naslov večkrat izpostavi v dnevnikih. En sam uspešen napad s tem ni preprečen. Fail2ban pa zmanjša obremenitev zaradi skenerjev in ponavljajoče poskuse iz istega vira naredi dražje.
Zakaj ne bi smel neposredno spreminjati jail.conf?
Datoteka se pri posodobitvah paketa zamenja in to tudi sama pove. Lastne nastavitve sodijo v jail.local ali v datoteke pod jail.d. Tam ciljno prepišejo privzete vrednosti.
Kaj je jail recidive?
Jail, ki ovrednoti zapisnik samega Fail2ban. Kdor je znova in znova blokiran, dobi občutno daljšo blokado. V priloženi konfiguraciji znaša en teden.
Ali Fail2ban deluje za Cloudflare ali uravnoteževalnikom obremenitve?
Samo z dodatno konfiguracijo. Brez nje je v dnevnikih naslov predhodne storitve in blokada bi zadela vse obiskovalce. Spletni strežnik mora potem prevzeti pravi naslov obiskovalca, blokade pa je bolje nastaviti pri predhodni storitvi.