fail2ban contro i tentativi di indovinare le password
Modulo 5: Proteggere la rete · Tempo di lettura: 10 minuti
Obiettivo della lezione: Al termine di questa lezione Lei saprà configurare fail2ban per SSH, leggerne lo stato e il log, sbloccare di nuovo un indirizzo e spiegare che cosa fail2ban protegge e che cosa no.
Concetti chiave: brute force, jail, filtro, azione (banaction), maxretry, findtime, bantime, bantime.increment, ignoreip, backend systemd, jail.conf, jail.local e jail.d, fail2ban-client, recidive
Chi bussa alle porte di internet
Se guarda il log di SSH un giorno dopo l'installazione, lo vedrà subito: centinaia di tentativi di accesso, con nomi come root, admin, test, ubuntu e oracle, da indirizzi di tutto il mondo.
anna@web1:~$ sudo journalctl -u ssh --since today | grep -c "Invalid user"
412
anna@web1:~$ sudo journalctl -u ssh --since today | grep "Invalid user" | tail -n 3
nov 09 14:02:11 web1 sshd-session[20311]: Invalid user admin from 203.0.113.77 port 51522
nov 09 14:02:13 web1 sshd-session[20313]: Invalid user oracle from 203.0.113.77 port 51544
nov 09 14:02:16 web1 sshd-session[20315]: Invalid user test from 203.0.113.77 port 51560(Su Ubuntu il servizio si chiama ssh, su AlmaLinux e Rocky sshd. Il nome del processo può essere sshd o sshd-session, a seconda della versione di OpenSSH.) Questo è un attacco brute force: bot che provano semplicemente tutti i nomi utente e le password più comuni. Con l'accesso tramite chiavi e il login con password disattivato (lezione 2.2) non entreranno mai, per quante volte ci provino. Però riempiono il Suo log, consumano un po' di potenza di calcolo e, sui servizi in cui serve comunque una password (una webmail, un pannello di gestione), possono essere davvero pericolosi.
fail2ban legge i log, riconosce i tentativi falliti e blocca per un certo tempo nel firewall un indirizzo che fallisce troppe volte.
Come ragiona fail2ban: le jail
fail2ban lavora con le jail (celle). Una jail combina tre elementi:
- un filtro: espressioni regolari che riconoscono in un log i tentativi falliti (per esempio la riga "Invalid user ... from <adres>");
- un'azione: ciò che succede quando i tentativi sono troppi, di solito una regola del firewall che blocca l'indirizzo (
banaction, su Debian 13 per impostazione predefinita tramite nftables); - le soglie: quanti tentativi falliti (
maxretry) entro quale intervallo di tempo (findtime) portano a un blocco di quale durata (bantime).
I valori predefiniti di jail.conf sono: maxretry = 5, findtime = 10m, bantime = 10m. Quindi: cinque tentativi falliti entro dieci minuti comportano dieci minuti di blocco.
Installazione e la trappola di Debian 12
anna@web1:~$ sudo apt install fail2ban
anna@web1:~$ sudo systemctl status fail2banSu Debian e Ubuntu la jail per SSH ([sshd]) è già attiva dopo l'installazione, tramite il file /etc/fail2ban/jail.d/defaults-debian.conf.
C'è una trappola nota. fail2ban deve sapere dove si trova il log. In passato era il file di testo /var/log/auth.log. Da Debian 12 rsyslog non viene più installato per impostazione predefinita e i messaggi si trovano solo nel journal di systemd (lezione 6.2). Il pacchetto fail2ban di Debian 12 cercava ancora /var/log/auth.log, non lo trovava e non si avviava. Debian 13 ha risolto il problema impostando backend = systemd per SSH in defaults-debian.conf. Su Debian 12 lo risolve Lei stesso (vedi sotto) facendo la stessa cosa. Ubuntu ha ancora rsyslog per impostazione predefinita, ma anche lì backend = systemd funziona.
Le Sue impostazioni: jail.local
Non modifichi mai jail.conf: quel file viene sostituito a ogni aggiornamento. Inserisca le Sue impostazioni in /etc/fail2ban/jail.local oppure in un file in /etc/fail2ban/jail.d/ con l'estensione .local:
# /etc/fail2ban/jail.d/eigen.local
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
bantime.increment = true
ignoreip = 127.0.0.1/8 ::1 198.51.100.20
[sshd]
enabled = true
backend = systemdChe cosa fanno le righe:
bantime = 1h: un'ora di blocco invece di dieci minuti.bantime.increment = true: chi ritorna dopo un blocco riceve ogni volta un blocco più lungo.ignoreip: indirizzi che non vengono mai bloccati. Inserisca qui l'indirizzo IP fisso del Suo ufficio, se ne ha uno. Non inserisca qui grandi intervalli di indirizzi "per sicurezza".backend = systemd: legge il journal invece di un file di testo (necessario su Debian 12, consigliato ovunque). Per questo deve essere installato il pacchettopython3-systemd; di solito lo è già come dipendenza.
Ricaricare e verificare:
anna@web1:~$ sudo fail2ban-client -t # testare la configurazione
OK: configuration test is successful
anna@web1:~$ sudo systemctl reload fail2ban
anna@web1:~$ sudo fail2ban-client status
Status
|- Number of jail: 1
`- Jail list: sshdLeggere lo stato, bannare e sbloccare
anna@web1:~$ sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 3
| |- Total failed: 1288
| `- Journal matches: _SYSTEMD_UNIT=ssh.service + _COMM=sshd
`- Actions
|- Currently banned: 2
|- Total banned: 117
`- Banned IP list: 203.0.113.77 198.51.100.140"Currently failed" indica gli indirizzi che hanno già fatto dei tentativi ma non hanno ancora superato la soglia. "Currently banned" indica gli indirizzi bloccati in questo momento.
Se si è bloccato da solo (per esempio provando un paio di volte con la chiave o il nome utente sbagliati), acceda tramite un'altra rete o tramite la console e sblocchi il Suo indirizzo:
anna@web1:~$ sudo fail2ban-client set sshd unbanip 198.51.100.20Il log di fail2ban stesso si trova in /var/log/fail2ban.log e mostra quando un indirizzo è stato bloccato e quando sbloccato:
2026-11-09 14:02:16,903 fail2ban.actions [811]: NOTICE [sshd] Ban 203.0.113.77
2026-11-09 15:02:17,120 fail2ban.actions [811]: NOTICE [sshd] Unban 203.0.113.77I recidivi: recidive
Alcuni bot tornano semplicemente dopo ogni blocco. Per questo esistono due strumenti. bantime.increment (vedi sopra) rende il blocco ogni volta più lungo. Inoltre c'è la jail recidive: legge il log di fail2ban stesso e blocca per una settimana, su tutte le porte, un indirizzo che è stato bloccato spesso nell'arco di un giorno. Per attivarla nel Suo file .local:
[recidive]
enabled = trueChe cosa fa e che cosa non fa fail2ban
fail2ban è utile, ma non è la serratura della porta. La serratura è l'accesso con una chiave, con le password disattivate (lezione 2.2). Per questo è bene sapere anche che cosa fail2ban non può fare:
- Un attacco distribuito da migliaia di indirizzi, ciascuno con uno o due tentativi, non supera mai
maxretry. - Una password debole resta debole. fail2ban rallenta i tentativi di indovinarla, niente di più.
- Solo ciò che compare in un log: un servizio che non registra i tentativi falliti, o un log che fail2ban non legge, sfugge al suo controllo.
- Docker: i blocchi nella normale catena del firewall non valgono per le porte pubblicate dei container (lezione 9.3). Per i servizi nei container serve un'impostazione a parte (azione sulla catena
DOCKER-USER).
Ciò che fail2ban fa bene: mantenere tranquillo il log, ridurre il carico causato dai bot e proteggere i servizi in cui usa (ancora) password, come una webmail o un pannello di gestione. Per questi servizi esistono filtri per nginx, Postfix, Dovecot e molti altri.
Su AlmaLinux e Rocky Linux
Lì fail2ban proviene da EPEL: dnf install epel-release e poi dnf install fail2ban. Il pacchetto fail2ban installa anche l'integrazione con firewalld. Il servizio SSH si chiama sshd. Attivi la jail Lei stesso in un file .local; a differenza di Debian, non è attiva automaticamente.
Riepilogo
- I bot provano ad accedere tutto il giorno; con le chiavi e il login con password disattivato non entrano, e fail2ban li tiene in più a distanza.
- Una jail è filtro + azione + soglie (
maxretry,findtime,bantime); per impostazione predefinita 5 tentativi in 10 minuti, 10 minuti di blocco. - Le impostazioni proprie vanno in
jail.localojail.d/*.local, mai injail.conf; usibackend = systemd(necessario su Debian 12). fail2ban-client status sshdmostra gli indirizzi bannati,set sshd unbanipli sblocca; recidive ebantime.incrementsi occupano dei recidivi.- fail2ban non ferma attacchi distribuiti né password deboli e non vede da solo le porte di Docker.
Quiz
Esercizio
Esercizio Z5.3: Leggere un log di intrusione. Il file di esempio ssh-journal-1.txt contiene un estratto del journal di un server SSH con fail2ban, più l'output di fail2ban-client status sshd. Risponda: quale indirizzo ha provato più nomi utente, quale indirizzo è riuscito ad accedere con una chiave e con quale utente, quale indirizzo è stato bannato e a che ora, e quell'indirizzo sarebbe stato bannato anche con le impostazioni predefinite (maxretry = 5, findtime = 10m)? Il programma confronta le risposte con la soluzione fissa. Se ha un server proprio con fail2ban, controlli lì anche fail2ban-client status sshd.
Per approfondire
- Proteggere il suo VPS: i primi cinque minuti
- Sono bloccato? Il suo indirizzo IP e il nostro firewall
- fail2ban, configurazione predefinita
jail.conf: https://github.com/fail2ban/fail2ban/blob/master/config/jail.conf - Manuale di
jail.conf(5): https://manpages.debian.org/trixie/fail2ban/jail.conf.5.en.html
