Pe scurt: Fail2ban citește fișiere de jurnal și blochează în firewall adresele care apar prea des într-un interval de timp. Pentru Nginx și Apache vine cu jail-uri gata făcute, precum nginx-botsearch sau apache-noscript; filtrele proprii le testați cu fail2ban-regex. Setările aparțin în jail.local, adresele dumneavoastră în ignoreip, iar recidiviștii sunt prinși de jail-ul recidive. Împotriva unor atacuri individuale țintite Fail2ban nu ajută, împotriva scanărilor în masă da.
Când jurnalele sunt pline de scannere
Cine privește în aceste zile jurnalele de acces ale serverelor sale web le găsește adesea pline de cereri către căi care nu există deloc: interfețe de administrare vechi, fișiere de test, vulnerabilități cunoscute ale altor produse. Într-o situație ca PHP2Shell se adaugă căutarea țintită de servere vulnerabile: Cloudflare și Patchstack au raportat tentative de atac, iar Unit 42 a numărat mai mult de 22,6 milioane de instanțe expuse, potențial vulnerabile.
Fail2ban este o unealtă verificată împotriva acestei mase. Citește fișiere de jurnal, recunoaște cu filtre intrările suspecte și blochează adresa expeditorului, pentru un timp stabilit, în firewall. Aceasta ușurează serverul, reduce zgomotul din jurnale și face mai anevoioasă încercarea sistematică dintr-o singură sursă.
Ce nu poate face Fail2ban este la fel de important: o singură cerere care exploatează o vulnerabilitate nu este împiedicată. Împotriva PHP2Shell ajută doar actualizarea PHP. Cum decurg atacurile automatizate descrie Scanări în masă după PHP nepatchuit.
Fail2ban pentru Nginx și Apache: jail-urile livrate
Un jail leagă un filtru de un fișier de jurnal și de o acțiune de blocare. jail.conf livrat conține deja jail-uri pentru servere web. Ele sunt implicit dezactivate și se activează individual.
| Jail | Server web | Recunoaște |
|---|---|---|
nginx-http-auth |
Nginx | autentificări HTTP Basic eșuate |
nginx-limit-req |
Nginx | cereri care depășesc rate-limit-ul Nginx |
nginx-botsearch |
Nginx | căutarea unor căi tipice, inexistente |
nginx-bad-request |
Nginx | cereri defectuoase |
apache-auth |
Apache | autentificări eșuate |
apache-badbots |
Apache | identificatori cunoscuți de boți dăunători |
apache-noscript |
Apache | apelări de scripturi inexistente |
apache-overflows |
Apache | cereri prea lungi |
apache-botsearch |
Apache | căutarea unor căi tipice, inexistente |
php-url-fopen |
ambele | anumite tipare de încercări de includere de URL |
recidive |
ambele | adrese pe care Fail2ban le-a blocat în mod repetat |
Valorile implicite ale configurației livrate sunt mai degrabă blânde: blocaj de 10 minute după 5 apariții în 10 minute. Pentru serverele web cu mult trafic de scanare merită un blocaj mai lung și un factor crescător pentru repetări.
Configurația de bază în jail.local
jail.conf spune el însuși că nu trebuie modificat, pentru că actualizările îl înlocuiesc. Valorile proprii aparțin în /etc/fail2ban/jail.local. Exemplul următor pentru Nginx stabilește valori implicite rezonabile și activează jail-urile potrivite:
# /etc/fail2ban/jail.local
[DEFAULT]
# Introduceți propriile adrese fixe (înlocuiți adresa exemplu)
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
Pentru Apache activați în schimb, de exemplu, apache-auth, apache-noscript și apache-botsearch. Căile jurnalelor le aduce Fail2ban pentru fiecare distribuție; dacă căile dumneavoastră diferă, stabiliți logpath în jail-ul respectiv. Dacă sistemul dumneavoastră citește jurnalele doar prin journal, ajută backend = systemd.
Un filtru propriu pentru cereri în masă către fișiere PHP
Un tipar tipic în situația actuală sunt multe cereri într-un timp scurt către fișiere PHP care nu există. Un filtru propriu recunoaște aceasta după codul de stare 404. El descrie doar ce se află în propriul jurnal:
# /etc/fail2ban/filter.d/nginx-php-404.conf
[Definition]
failregex = ^<HOST> -.*"(GET|POST|HEAD) [^"]*\.php[^"]*" 404
ignoreregex =
# Completare în /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
Înainte să activați filtrul, verificați-l pe jurnalul real. Astfel vedeți câte rânduri prinde și dacă între ele se află accesări legitime:
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
# Deblocarea unei adrese blocate din greșeală
sudo fail2ban-client set nginx-php-404 unbanip 203.0.113.25
Alegeți pragul cu generozitate. Un crawler care parcurge linkuri depășite sau un serviciu de monitorizare nu are voie să ajungă în blocaj.
Cele mai frecvente capcane
Fail2ban se instalează repede, dar se folosește ușor greșit. Verificați aceste puncte înainte de utilizarea în producție:
- Autoblocarea: Adresele de birou, VPN și monitorizare aparțin în
ignoreip, înainte ca jail-urile să devină active. - Servicii din față: În spatele unui CDN sau load balancer, Fail2ban vede fără adaptare doar adresele acestora. Mai multe în ghidul Protejarea autentificărilor de administrator împotriva brute force.
- Rotația jurnalelor: După schimbarea fișierului de jurnal, Fail2ban trebuie să citească fișierul nou. Verificați după prima rotație dacă jail-urile numără în continuare apariții.
- Colaborarea cu firewall-ul: Fail2ban introduce blocajele în firewall. Cine își administrează firewall-ul cu o reîncărcare completă a setului de reguli poate șterge aceste intrări. Cum construiți firewall-ul însuși se află la Firewall pentru servere web: deschideți doar porturile necesare.
- IPv6: Atacurile vin și prin IPv6. Verificați dacă acțiunea dumneavoastră de blocare acoperă ambele protocoale.
Evaluați regulat listele de blocaje. Dacă blocajele se acumulează din anumite rețele sau către anumite căi, este un indiciu de căutare țintită și un motiv de a privi mai atent aplicația afectată.
Concluzie: o unealtă împotriva maselor, nu împotriva a tot
Fail2ban se configurează repede și scutește serverele web de o parte din bombardamentul permanent. Jail-urile livrate acoperă tipare tipice, filtrele proprii pot fi testate fără pericol cu fail2ban-regex pe jurnale reale, iar jail-ul recidive face ca sursele încăpățânate să rămână mai mult timp afară.
Nu ar trebui să-l supraestimați. Fail2ban reacționează la repetare, nu la prima apariție, și vede doar ce se află în jurnale. Împotriva unei vulnerabilități ca PHP2Shell ajută doar actualizarea, iar împotriva atacurilor distribuite din multe adrese Fail2ban ajută puțin. Își dezvăluie valoarea ca strat printre mai multe: alături de un firewall suplu, o configurație întărită a serverului web, autentificare în doi factori și o monitorizare care nu doar blochează anomaliile, ci și le raportează.
Cum ajută PHP SOS concret?
- Evaluarea jurnalelor: Analizăm ce tipare apar în jurnalele dumneavoastră de acces și alegem jail-urile potrivite.
- Configurare și testare: Configurăm Fail2ban cu filtre proprii, testăm fiecare filtru pe jurnale reale și introducem adresele dumneavoastră fixe ca excepție.
- Clarificarea colaborării: Coordonăm CDN, load balancer, firewall și rotația jurnalelor astfel încât blocajele să lovească adresele corecte.
- Observare: În cadrul monitorizării de securitate evaluăm continuu blocajele și anomaliile.
Întrebări frecvente
Mă protejează Fail2ban de PHP2Shell?
Nu. Fail2ban reacționează abia după ce o adresă a apărut de mai multe ori în jurnale. Un singur atac reușit nu este astfel împiedicat. Fail2ban reduce însă încărcarea provocată de scannere și face mai costisitoare încercările repetate din aceeași sursă.
De ce să nu modific direct jail.conf?
Fișierul este înlocuit la actualizările de pachete și o spune el însuși. Setările proprii aparțin unui jail.local sau unor fișiere din jail.d. Acolo suprascriu țintit valorile implicite.
Ce este jail-ul recidive?
Un jail care evaluează jurnalul propriu al Fail2ban. Cine este blocat din nou și din nou primește un blocaj mult mai lung. În configurația livrată, acesta este de o săptămână.
Funcționează Fail2ban în spatele Cloudflare sau al unui load balancer?
Doar cu configurație suplimentară. Fără ea, în jurnale apare adresa serviciului din față, iar un blocaj ar lovi toți vizitatorii. Serverul web trebuie atunci să preia adresa reală a vizitatorului, iar blocajele se stabilesc mai bine la serviciul din față.