Sicurezza · 11 min read · Oct 23, 2025

Installazione e utilizzo di Fail2ban su Debian 12

Fail2ban monitora i file di log per i fallimenti di accesso e banna temporaneamente l’indirizzo IP sorgente soggetto a fallimenti dall’accesso all’host. Questa è una difesa contro gli attacchi di forza bruta per indovinare le password. È molto utile avere fail2ban su host esposti a Internet.

La versione di fail2ban su Debian 12 è 1.0.2.

root@posti:~# fail2ban-client version  
1.0.2

Per vedere se fail2ban è attualmente in esecuzione, invia al server il comando ping con fail2ban-client. Il server fail2ban risponde “pong” se è in esecuzione.

root@posti:/etc/fail2ban# fail2ban-client ping  
Server replied: pong  
root@posti:/etc/fail2ban#

Come funziona

Fail2ban raccoglie filtri, azioni e file monitorati in una prigione. Diverse prigioni vengono fornite con la distribuzione. Devono essere abilitate per iniziare a funzionare. Il filtro specifica come rilevare i fallimenti di autenticazione. L’azione definisce come avviene il ban e il ripristino.

I tentativi di intrusione attivano il ban se durante il tempo di ricerca vengono rilevati almeno maxretry fallimenti di accesso dallo stesso numero IP. Quindi l’IP viene bannato per bantime secondi. Dopo che il ban è stato in vigore per bantime secondi, il ban viene revocato e l’IP può nuovamente accedere all’host. Fail2ban può gestire sia IPv4 che IPv6.

Ulteriori informazioni possono essere lette dai file nella directory /usr/share/doc/fail2ban/.

Configurazione di Fail2ban

Su sistemi Debian GNU/Linux, fail2ban viene installato per impostazione predefinita con la prigione sshd abilitata con impostazioni ragionevoli. Questo avviene nel file /etc/fail2ban/jail.d/defaults-debian.conf. Questa è l’unica prigione funzionante per impostazione predefinita. Altre prigioni devono essere abilitate dall’amministratore di sistema.

Quindi, se desideri solo monitorare gli accessi ssh e bannare gli intrusi che si comportano male, non è necessaria alcuna configurazione aggiuntiva.

Sfortunatamente, su Debian 12, fail2ban potrebbe non funzionare con le impostazioni predefinite. Debian 12 ha contrassegnato il pacchetto rsyslog come opzionale, il che significa che potrebbe non essere installato, quindi i log vengono raccolti solo in journald [wiki.debian.org/Rsyslog].

Su sistemi ISPConfig, fail2ban funziona, poiché l’autoinstallatore ISPConfig installa rsyslog e il tutorial ISPConfig Perfect server istruisce a installare rsyslog.

Con rsyslog, i file di log appaiono nella directory /var/log/ - quindi la configurazione predefinita di fail2ban trova i file di log. Se rsyslog non è installato, la configurazione di fail2ban deve essere modificata affinché legga i log dal journal di systemd. Aggiungi alla sezione predefinita di jail.local backend = systemd, in questo modo

[DEFAULT]
backend = systemd

Abilitare una prigione

La documentazione raccomanda di mettere tutte le proprie modifiche nei file .local. Questo evita problemi quando i file forniti dalla distribuzione vengono aggiornati o modificati dal manutentore [Leggi il file /usr/share/doc/fail2ban/README.Debian.gz].

Come esempio, abilitare la prigione pure-ftpd viene fatto aggiungendo al file /etc/fail2ban/jail.local (crea il file se non esiste già) le righe

[pure-ftpd]
enabled = true

Il nome della prigione tra parentesi quadre inizia la sezione per le impostazioni di quella prigione.

Quando hai finito con le modifiche, forzare la rilettura dei file di configurazione con il comando

systemctl reload fail2ban

La prigione dovrebbe ora essere in esecuzione, il che può essere verificato con fail2ban-client:

root@posti:/etc/fail2ban# fail2ban-client status pure-ftpd
Status for the jail: pure-ftpd
|- Filter
|  |- Currently failed:    0
|  |- Total failed:    106
|  `- File list:    /var/log/syslog
`- Actions
   |- Currently banned:    0
   |- Total banned:    4
   `- Banned IP list:    
root@posti:/etc/fail2ban# 

Poiché jail.local ha solo l’impostazione “enabled” per quella prigione, tutte le altre impostazioni sono impostazioni predefinite dalla distribuzione. Di solito hanno buoni valori, quindi ulteriori configurazioni non sono necessarie. Se necessario, la sezione jail.local per quella prigione può contenere impostazioni che sovrascrivono ciò che è stato impostato nei file .conf.

Questo esempio cambia findtime, maxretry e bantime per la prigione pure-ftpd:

[pure-ftpd]
enabled = true
findtime = 2h
maxretry = 6
bantime = 1d

Fail2ban-client mostra i tempi in secondi, ma i tempi possono essere inseriti nei file di configurazione in un formato più semplice, ad esempio 10h invece di 36000 secondi. man jail.conf nel capitolo “FORMATO ABBREVIATO DEL TEMPO” spiega i formati di input temporali user-friendly.

fail2ban-client ha l’opzione di convertire dal formato temporale user-friendly ai secondi.

# fail2ban-client --str2sec 1d3h7m  
97620

Seguire i log

Per determinare quali prigioni dovrebbero essere attivate, segui i log creati dai servizi in esecuzione sull’host. Uno strumento che crea riepiloghi dei log, come logwatch o pflogsumm, è utile. Leggere i log grezzi richiede tempo ed è noioso.

Controlla se c’è una prigione disponibile per un servizio in esecuzione sull’host, magari leggendo jail.conf.

Una volta che i log mostrano qualcosa di interessante o preoccupante, è il momento di esaminare. Ad esempio, pflogsumm ha inviato un riepilogo via e-mail con righe come questa:

136   unknown[91.224.92.40]: SASL LOGIN authentication failed: UGFzc3...
136   hostname srv-91-224-92-40.serveroffer.net does not resolve to a...
123   unknown[193.32.162.23]: SASL LOGIN authentication failed: UGFzc...
123   hostname mail.whatami.co does not resolve to address 193.32.162.23

Questo mostra che l’IP 91.224.92.40 ha fallito 136 volte l’accesso all’e-mail, e un altro caso simile. Fail2ban avrebbe dovuto prevenire così tanti tentativi. Per vedere perché ciò non è accaduto, esamina il log di fail2ban.

root@posti:/etc/apt/apt.conf.d# grep 91.224.92.40 /var/log/fail2ban.log | head
2024-02-18 00:01:38,718 fail2ban.filter         [996]: INFO    [postfix-sasl] Found 91.224.92.40 - 2024-02-18 00:01:38
2024-02-18 00:11:50,261 fail2ban.filter         [996]: INFO    [postfix-sasl] Found 91.224.92.40 - 2024-02-18 00:11:50
2024-02-18 00:21:54,337 fail2ban.filter         [996]: INFO    [postfix-sasl] Found 91.224.92.40 - 2024-02-18 00:21:54
2024-02-18 00:32:14,232 fail2ban.filter         [996]: INFO    [postfix-sasl] Found 91.224.92.40 - 2024-02-18 00:32:14
2024-02-18 00:42:37,921 fail2ban.filter         [996]: INFO    [postfix-sasl] Found 91.224.92.40 - 2024-02-18 00:42:37
2024-02-18 00:53:06,796 fail2ban.filter         [996]: INFO    [postfix-sasl] Found 91.224.92.40 - 2024-02-18 00:53:06
2024-02-18 01:03:35,293 fail2ban.filter         [996]: INFO    [postfix-sasl] Found 91.224.92.40 - 2024-02-18 01:03:35
2024-02-18 01:14:03,765 fail2ban.filter         [996]: INFO    [postfix-sasl] Found 91.224.92.40 - 2024-02-18 01:14:03
2024-02-18 01:24:24,628 fail2ban.filter         [996]: INFO    [postfix-sasl] Found 91.224.92.40 - 2024-02-18 01:24:24
2024-02-18 01:34:43,876 fail2ban.filter         [996]: INFO    [postfix-sasl] Found 91.224.92.40 - 2024-02-18 01:34:43
root@posti:/etc/apt/apt.conf.d#

Quell’IP prova a connettersi a intervalli di circa 10 minuti, e la prigione fail2ban postfix-sasl lo rileva.

È una buona idea scoprire se quell’IP appartiene a un utente legittimo dell’host, che ha solo una vecchia password nel suo smartphone o in qualche altro dispositivo che cerca di connettersi a intervalli regolari. Utilizzo geoiplookup, mostra da quale paese proviene l’IP. I miei utenti sono del mio paese, quindi gli utenti stranieri tendono a essere attori malintenzionati. geoiplookup proviene dai pacchetti Debian geoip-database e geoip-bin.

$ geoiplookup 91.224.92.40
GeoIP Country Edition: LT, Lituania

Per scoprire perché l’IP non è stato bannato, esamina il findtime di quella prigione:

root@posti:/etc/apt/apt.conf.d# fail2ban-client get postfix-sasl findtime
600
root@posti:/etc/apt/apt.conf.d#

Ho recentemente visto questi attacchi lenti, il colpevole sa che il findtime è di 10 minuti, quindi cerca di evitare di essere bannato provando accessi a intervalli più lunghi. Questo ha funzionato in questo caso. Per fare in modo che i fallimenti di accesso causino effettivamente dei ban, aumenta il findtime per la prigione, ad esempio a 10 ore. Aggiungi al file jail.local nella sezione [postfix-sasl]:

findtime = 10h

Quindi, dopo systemctl reload fail2ban, la prigione ha un findtime più lungo:

root@posti:/etc/fail2ban# fail2ban-client get postfix-sasl findtime
36000
root@posti:/etc/fail2ban#

Un altro modo in cui gli intrusi cercano di entrare è essere persistenti. Anche se l’intruso è bannato, aspetta semplicemente che il ban finisca e continua a indovinare la password. Il bantime potrebbe essere reso più lungo, ma ciò causa problemi per gli utenti legittimi, che potrebbero digitare male la password e poi non possono accedere al loro account fino alla scadenza del bantime. C’è una prigione per i recidivi chiamata recidive. Funziona cercando ripetuti ban per un IP nel log di fail2ban, e poi bannando per un lungo periodo, ad esempio una settimana.

Il seguente elenco proviene dal rapporto di logwatch:

--------------------- pam_unix Begin ------------------------   

 sshd:  

    Authentication Failures:  

       unknown (212.70.149.150): 59 Time(s)

Cercando quell’IP nel file di log si mostra:

2024-02-21 03:42:39,121 fail2ban.filter         [895]: INFO    [sshd] Found 212.70.149.150 - 2024-02-21 03:42:38
2024-02-21 03:42:39,508 fail2ban.actions        [895]: NOTICE  [sshd] Ban 212.70.149.150
2024-02-21 03:52:38,386 fail2ban.actions        [895]: NOTICE  [sshd] Unban 212.70.149.150
2024-02-21 03:54:33,560 fail2ban.filter         [895]: INFO    [sshd] Found 212.70.149.150 - 2024-02-21 03:54:33
2024-02-21 03:54:35,364 fail2ban.filter         [895]: INFO    [sshd] Found 212.70.149.150 - 2024-02-21 03:54:35
2024-02-21 04:00:37,017 fail2ban.filter         [895]: INFO    [sshd] Found 212.70.149.150 - 2024-02-21 04:00:36
2024-02-21 04:00:39,021 fail2ban.filter         [895]: INFO    [sshd] Found 212.70.149.150 - 2024-02-21 04:00:38
2024-02-21 04:06:43,036 fail2ban.filter         [895]: INFO    [sshd] Found 212.70.149.150 - 2024-02-21 04:06:42
2024-02-21 04:06:45,039 fail2ban.filter         [895]: INFO    [sshd] Found 212.70.149.150 - 2024-02-21 04:06:44
2024-02-21 04:06:45,426 fail2ban.actions        [895]: NOTICE  [sshd] Ban 212.70.149.150
2024-02-21 04:16:44,302 fail2ban.actions        [895]: NOTICE  [sshd] Unban 212.70.149.150
2024-02-21 04:19:04,868 fail2ban.filter         [895]: INFO    [sshd] Found 212.70.149.150 - 2024-02-21 04:19:04

Fail2ban funziona come previsto, trovando i login errati e emettendo un ban per 10 minuti. Durante questo ban, l’autore viene impedito di accedere a questo host, ma continua dopo che il ban è stato revocato. Questo sembra essere un caso di tentativo serio di intrusione. La soluzione è abilitare la prigione recidive con un maxretry basso e un bantime lungo.

Mi piace usare un breve ban iniziale, diciamo 10 minuti. Se un vero utente è stato bannato, è solo in attesa di quel tempo, sperando di usare il tempo per trovare qual è la password corretta e poi riprovare. Coloro che vengono bannati di nuovo lo stesso giorno, vengono bannati per una settimana. I valori predefiniti della prigione recidive possono essere trovati nel file jail.conf, c’è un bantime di 1 settimana e un findtime di 1 giorno, quelli mi sembrano OK. Ma imposto maxretry a 2, i colpevoli vengono bannati più rapidamente. Ho aggiunto al file jail.local:

[recidive]
enabled = true
maxretry = 2

Bans più lunghi di 1 settimana non valgono la pena, a mio avviso. Alla fine, il vecchio indirizzo IP viene bannato o messo in blacklist ovunque, quindi il colpevole ottiene un nuovo IP. Il vecchio IP viene dato a qualche nuovo utente Internet innocente, che non dovrebbe essere punito per le cattive azioni di cui è colpevole il precedente proprietario di quell’IP.

Risoluzione dei problemi

Dopo l’avvio del sistema operativo o il riavvio di fail2ban, lo stato viene ripristinato, quindi i ban continuano fino all’esaurimento del bantime. Pertanto, il test e la risoluzione dei problemi possono comportare riavvii.

Per testare la configurazione, c’è un’opzione di test:

fail2ban-server --test

Per scoprire se un IP è bannato, le versioni recenti di fail2ban possono fare

# fail2ban-client banned 43.131.9.186  
[['recidive']]

Il comando mostra l’elenco delle prigioni in cui l’IP dato è attualmente bannato.

Le versioni più vecchie di fail2ban non hanno quel comando. Testare ogni prigione una per una può essere fatto in questo modo:

# fail2ban-client status recidive | tr " " "\n" | grep 43.163.219.232  
43.163.219.232

Se l’output mostra l’IP, allora era nell’elenco dei numeri IP bannati. Il comando tr è lì per rompere l’elenco dei numeri IP bannati (è una lunga riga) in un IP per riga.

Per vedere cosa è successo con un dato IP, cercalo in fail2ban.log:

root@posti:/etc/mysql# grep 43.131.9.186 /var/log/fail2ban.log | cut --characters=-80  

2024-03-06 09:00:40,295 fail2ban.filter  [3574846]: INFO    [sshd] Found
2024-03-06 09:02:53,954 fail2ban.filter  [3574846]: INFO    [sshd] Found
2024-03-06 09:02:55,958 fail2ban.filter  [3574846]: INFO    [sshd] Found
2024-03-06 09:04:34,193 fail2ban.filter  [3574846]: INFO    [sshd] Found
2024-03-06 09:04:36,195 fail2ban.filter  [3574846]: INFO    [sshd] Found
2024-03-06 09:04:36,388 fail2ban.actions [3574846]: NOTICE  [sshd] Ban 43
2024-03-06 09:04:36,626 fail2ban.filter  [3574846]: INFO    [recidive] Fo
2024-03-06 09:14:35,180 fail2ban.actions [3574846]: NOTICE  [sshd] Unban
2024-03-06 09:15:10,073 fail2ban.filter  [3574846]: INFO    [sshd] Found
2024-03-06 09:16:55,919 fail2ban.filter  [3574846]: INFO    [sshd] Found
2024-03-06 09:16:58,522 fail2ban.filter  [3574846]: INFO    [sshd] Found
2024-03-06 09:18:44,972 fail2ban.filter  [3574846]: INFO    [sshd] Found
2024-03-06 09:20:30,018 fail2ban.filter  [3574846]: INFO    [sshd] Found
2024-03-06 09:20:30,499 fail2ban.actions [3574846]: NOTICE  [sshd] Ban 43
2024-03-06 09:20:30,620 fail2ban.filter  [3574846]: INFO    [recidive] Fo
2024-03-06 09:20:30,899 fail2ban.actions [3574846]: NOTICE  [recidive] Ba
2024-03-06 09:20:32,021 fail2ban.filter  [3574846]: INFO    [sshd] Found
2024-03-06 09:30:29,289 fail2ban.actions [3574846]: NOTICE  [sshd] Unban

Il dumping dettagliato della configurazione di fail2ban mostra le impostazioni per l’esame:

# fail2ban-client -vvv -d

Whitelisting dei propri indirizzi IP

Forse i tuoi stessi host vengono bannati o vuoi assicurarti che alcuni host stranieri non vengano mai bannati anche se si comportano male. Quei numeri IP possono essere messi in whitelist. Per impostazione predefinita, nulla è in whitelist, puoi verificare questo con:

root@posti:~# fail2ban-client get sshd ignoreip  
No IP address/network is ignored  
root@posti:~

L’impostazione ignoreip potrebbe essere impostata in ciascuna sezione delle prigioni, ma questa impostazione dovrebbe influenzare tutte le prigioni, quindi è meglio impostarla nella sezione DEFAULT. Potrebbe essere meglio impostare l’ignore sulla subnet interna, in modo che tutti i tuoi host evitino i ban. Questo è dall’inizio di jail.local:

[DEFAULT]
ignoreip = 92.237.123.96/27

La sezione predefinita può avere altre impostazioni che influenzano tutte le prigioni. Ad esempio, findtime = 10h potrebbe essere aggiunto lì.

Banning manuale

Per testare cosa succede quando si banna, imposta il ban manualmente. Testa prima con una prigione con bantime breve, così torni indietro eventualmente se ti banna erroneamente. Ad esempio

# fail2ban-client set sshd banip 8.8.4.4

Se qualche IP si comporta male ma non riesci a far rilevare a fail2ban e emettere ban, impostare un ban manuale nella prigione recidive elimina quell’IP per una settimana.

# fail2ban-client set recidive banip 8.8.4.4

Bannare una subnet funziona usando la notazione CIDR:

fail2ban-client set recidive banip 5.188.87.0/24

Unbanning manuale

Rimuovere un ban è possibile, ma considera che se il comportamento cattivo continua, l’IP verrà nuovamente bannato. Quindi dovresti scoprire cosa sta succedendo (leggendo i log, ad esempio) e risolvere il comportamento cattivo.

# fail2ban-client set recidive unbanip 8.8.4.4

L’IP potrebbe essere bannato in diverse prigioni. Per unban un IP in tutte le prigioni, usa

# fail2ban-client unban 8.8.4.4

Raramente ho bisogno di farlo, tuttavia. Ho un bantime di 10 minuti, tranne che la prigione recidive ha 1 settimana, quindi unban solo l’IP dalla prigione recidive, le altre prigioni sono già scadute. Se non usi la prigione recidive, l’IP potrebbe essere bannato in diverse prigioni contemporaneamente, quindi questo è utile.

Per unban tutti gli indirizzi IP da tutte le prigioni, fai

fail2ban-client unban --all

Conclusione

Fail2ban rende più difficile indovinare le password ma non previene completamente i cracker dal tentare di accedere all’host. Per SSH, forzare l’uso delle chiavi SSH offre maggiore protezione impedendo l’accesso con una password. Per altri servizi, l’autenticazione a più fattori impedisce l’accesso se solo la password è nota.

Share: X/Twitter LinkedIn

Ricevi i nuovi post nella tua casella di posta.

Nessuno spam. Disiscriviti in qualsiasi momento.