Installazione e utilizzo di Fail2ban su Debian 12
In questa pagina
- Come funziona
Configurazione di Fail2ban
- Abilitazione di un carcere
- Segui i log
- Risoluzione dei problemi
- Whitelist dei propri indirizzi IP
- Vietare manualmente
- Sbloccare manualmente
- Conclusione
Fail2ban monitora i file di registro per individuare eventuali errori di accesso e vieta temporaneamente l'accesso all'host all'indirizzo IP di origine soggetto a errori. Questa è una difesa contro gli attacchi di forza bruta che indovinano la password. È molto utile avere fail2ban sugli 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, inviare 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. Con la distribuzione vengono fornite diverse carceri. Devono essere abilitati per iniziare a lavorare. filter specifica come rilevare gli errori di autenticazione. L'azione definisce come avviene l'esclusione e l'annullamento dell'esclusione.
I tentativi di intrusione attivano il ban se durante il tempo di ricerca vengono rilevati almeno maxretry login falliti dallo stesso numero IP. Quindi l'IP viene bannato per secondi di bantime. Dopo che il divieto è rimasto in vigore per alcuni secondi di bantime, il divieto viene revocato e l'IP può nuovamente accedere all'host. Fail2ban può gestire sia IPv4 che IPv6.
Maggiori informazioni possono essere lette dai file nella directory /usr/share/doc/fail2ban/.
Configurazione di Fail2ban
Sui sistemi Debian GNU/Linux installa fail2ban per impostazione predefinita con jail sshd abilitato con impostazioni ragionevoli. Questo viene fatto nel file /etc/fail2ban/jail.d/defaults-debian.conf. Questa è l'unica prigione che funziona per impostazione predefinita. Altre jail devono essere abilitate dall'amministratore di sistema.
Pertanto, se si desidera monitorare solo gli accessi ssh e vietare gli intrusi che si comportano in modo anomalo, 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 su journald [wiki.debian.org/Rsyslog].
Sui sistemi ISPConfig fail2ban funziona, poiché il programma di installazione automatica ISPConfig installa rsyslog e il tutorial del server ISPConfig Perfect indica di installare rsyslog.
Con rsyslog, i file di registro appaiono nella directory /var/log/, quindi la configurazione predefinita di fail2ban trova i file di registro. Se rsyslog non è installato, la configurazione di fail2ban deve essere modificata in modo che legga i log dal journal systemd. Aggiungi alla sezione predefinita jail.local backend=systemd, in questo modo
[DEFAULT]
backend = systemd
Abilitazione di un carcere
La documentazione consiglia di apportare tutte le proprie modifiche ai file .local. Ciò evita problemi quando i file forniti dalla distribuzione vengono aggiornati o modificati dal manutentore [Leggi il file /usr/share/doc/fail2ban/README.Debian.gz].
Ad esempio, l'abilitazione di pure-ftpd jail avviene aggiungendo al file /etc/fail2ban/jail.local (creare il file se non esiste già) le righe
[pure-ftpd]
enabled = true
Il nome della jail tra parentesi quadre inizia la sezione per le impostazioni di quella jail.
Al termine delle modifiche, forzare la rilettura dei file di configurazione con il comando
systemctl reload fail2ban
La jail dovrebbe ora essere in esecuzione, cosa che può essere verificata 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 "abilitata" per quella jail, tutte le altre impostazioni sono impostazioni predefinite della distribuzione. Di solito hanno buoni valori quindi non è necessaria un'ulteriore configurazione. Se necessario, la sezione jail.local per quella jail può contenere impostazioni che sovrascrivono quanto impostato nei file .conf.
Questo esempio modifica findtime, maxretry e bantime per il jail 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 10 ore invece di 36000 secondi. man jail.conf nel capitolo "FORMATO ABBREVIAZIONE DELL'ORA" spiega i formati di input dell'ora facili da usare.
fail2ban-client ha la possibilità di convertire dal formato ora intuitivo ai secondi.
# fail2ban-client --str2sec 1d3h7m
97620
Segui i log
Per determinare quali jail devono essere attivate, seguire i log creati dai servizi in esecuzione sull'host. È utile uno strumento che crea riepiloghi dei log, come logwatch o pflogsumm. La lettura dei log grezzi è lunga e noiosa.
Controlla se è disponibile una jail per un servizio in esecuzione sull'host, magari leggendo jail.conf.
Una volta che i registri mostrano qualcosa di interessante o preoccupante, è il momento di esaminare. Ad esempio, pflogsumm ha inviato un riepilogo via e-mail con righe come queste:
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
Ciò mostra che l'IP 91.224.92.40 non è riuscito 136 volte ad accedere alla posta elettronica e un altro caso simile. Fail2ban avrebbe dovuto impedire così tanti tentativi. Per capire perché ciò non è accaduto, esamina il registro 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 tenta di connettersi a intervalli di circa 10 minuti e fail2ban jail postfix-sasl lo rileva.
È una buona idea scoprire se quell'IP appartiene forse a un utente legittimo dell'host, che ha solo una vecchia password nello smartphone o in qualche altro dispositivo che tenta di connettersi a intervalli regolari. Utilizzo geoiplookup, mostra da quale paese proviene l'IP. I miei utenti provengono dal mio paese, quindi gli utenti stranieri tendono ad essere cattivi attori. geoiplookup proviene dai pacchetti Debian geoip-database e geoip-bin.
$ geoiplookup 91.224.92.40
GeoIP Country Edition: LT, Lithuania
Per scoprire perché l'IP non è stato bandito, esamina 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#
Recentemente ho visto questi attacchi lenti, l'autore del reato sa che il tempo di ricerca è di 10 minuti, quindi cerca di evitare di essere bannato provando ad accedere a intervalli più lunghi. Ha funzionato in questo caso. Per fare in modo che gli accessi falliti causino ban, aumenta il tempo di ricerca per la prigione, ad esempio a 10 ore. Aggiungi al file jail.local nella sezione [postfix-sasl]:
findtime = 10h
Quindi, dopo che systemctl ha ricaricato fail2ban, la jail ha un tempo di ricerca più lungo:
root@posti:/etc/fail2ban# fail2ban-client get postfix-sasl findtime
36000
root@posti:/etc/fail2ban#
Un altro modo in cui gli intrusi tentano di entrare è essere persistenti. Anche se l'intruso viene bannato, aspetta semplicemente la fine del ban e continua a indovinare la password. Il bantime potrebbe essere allungato, ma ciò causa problemi agli utenti legittimi, che potrebbero digitare erroneamente la password e quindi non poter accedere al proprio account fino al termine del bantime. Esiste un carcere per recidivi chiamato recidivo. Funziona cercando ban ripetuti per un IP nel registro fail2ban e quindi bannandoli per un lungo periodo, ad esempio una settimana.
L'elenco seguente proviene dal rapporto logwatch:
--------------------- pam_unix Begin ------------------------
sshd:
Authentication Failures:
unknown (212.70.149.150): 59 Time(s)
La ricerca di quell'IP nel file di registro 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, trova gli accessi errati ed emette un ban per 10 minuti. Durante questo divieto all'autore del reato non è consentito accedere a questo host, ma continua dopo la revoca del divieto. Questo sembra essere il caso di un serio tentativo di effrazione. Il rimedio è consentire la recidiva con un numero massimo di tentativi basso e un tempo di ban lungo.
Mi piace usare un ban iniziale breve, diciamo 10 minuti. Se un utente reale viene bannato, sta solo aspettando quel momento, si spera di utilizzare il tempo per trovare la password corretta e riprovare. Coloro che vengono nuovamente bannati lo stesso giorno, verranno bannati per una settimana. I valori predefiniti di recidive jail possono essere trovati nel file jail.conf, c'è bantime di 1 settimana e findtime di 1 giorno, mi sembrano OK. Ma se imposto il numero massimo di tentativi su 2, i trasgressori verranno bannati più rapidamente. Ho aggiunto al file jail.local:
[recidive]
enabled = true
maxretry = 2
Secondo me, non vale la pena bannare per più di una settimana. Alla fine, il vecchio indirizzo IP viene bandito o inserito nella lista nera ovunque, quindi l'autore del reato ottiene un nuovo IP. Il vecchio IP viene assegnato a qualche nuovo utente Internet innocente, che non dovrebbe essere punito per le cose cattive di cui è colpevole il precedente proprietario di quell'IP.
Risoluzione dei problemi
Dopo l'avvio del sistema operativo o il riavvio dello stato fail2ban viene ripristinato, quindi i divieti continuano fino allo scadere del bantime. Pertanto, i test e la risoluzione dei problemi possono comportare il riavvio.
Per testare la configurazione, c'è un'opzione di test:
fail2ban-server --test
Per scoprire se un IP è bannato, possono bastare le versioni recenti di fail2ban
# fail2ban-client banned 43.131.9.186
[['recidive']]
Il comando mostra l'elenco delle jail in cui un determinato IP è attualmente vietato.
Le versioni precedenti di fail2ban non hanno quel comando. Testare ogni jail uno per uno 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, significa che era nell'elenco dei numeri IP vietati. Il comando tr serve per suddividere l'elenco dei numeri IP vietati (è una lunga riga) in un IP per riga.
Per vedere cosa è successo con un determinato 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 dump dettagliato della configurazione fail2ban mostra le impostazioni da esaminare:
# fail2ban-client -vvv -d
Whitelist dei propri indirizzi IP
Forse i tuoi host vengono bannati o vuoi assicurarti che alcuni host stranieri non vengano mai bannati anche se si comportano male. Questi numeri IP possono essere inseriti nella whitelist. Per impostazione predefinita non c'è nulla nella whitelist, puoi verificarlo con:
root@posti:~# fail2ban-client get sshd ignoreip
No IP address/network is ignored
root@posti:~
L'impostazione ignoreip può essere impostata in ciascuna sezione delle jail, ma questa impostazione dovrebbe influenzare tutte le jail quindi è meglio impostarla nella sezione DEFAULT. Potrebbe essere meglio impostare Ignora sulla sottorete 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 influiscono su tutte le jail. Ad esempio, qui si potrebbe aggiungere findtime=10h.
Vietare manualmente
Per testare cosa succede durante l'esclusione, imposta l'esclusione manualmente. Prova prima con una prigione con un breve periodo di ban, così alla fine tornerai se ti banni per errore. Per esempio
# fail2ban-client set sshd banip 8.8.4.4</>
Se qualche IP si comporta male ma non puoi fare in modo che fail2ban lo rilevi ed emetta ban, l'impostazione del ban manuale nel jail recidivo elimina quell'IP per una settimana.
# fail2ban-client set recidive banip 8.8.4.4
L'esclusione di una sottorete funziona utilizzando la notazione CIDR:
fail2ban-client set recidive banip 5.188.87.0/24
Sbloccare manualmente
È possibile rimuovere un ban, ma considera che se il cattivo comportamento continua, l'IP verrà nuovamente bannato. Quindi dovresti scoprire cosa sta succedendo (leggendo i log, ad esempio) e correggere il cattivo comportamento.
# fail2ban-client set recidive unbanip 8.8.4.4
L'IP potrebbe essere vietato in diverse carceri. Per sbloccare un IP in tutte le jail, utilizzare
# fail2ban-client unban 8.8.4.4
Tuttavia, raramente ho bisogno di farlo. Ho 10 minuti di bantime, tranne che la prigione recidiva ha 1 settimana, quindi mi sbanco solo dalla prigione recidiva, le altre prigioni sono già scadute. Se non usi la jail recidiva, l'IP potrebbe essere vietato in più jail contemporaneamente, quindi questo è utile.
Lo faccio per sbloccare tutti gli indirizzi IP da tutte le carceri
fail2ban-client unban --all
Conclusione
Fail2ban rende più difficile indovinare le password ma non impedisce completamente ai cracker di 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 si conosce solo la password.