Definizione di Fail2ban e Utilizzo
Fail2ban (Sito ufficiale) è un software che è nato per permettere di bloccare gli host che stanno tentando di effettuare un attacco di brute force via SSH.
Questo genere di attacco si basa su continui tentativi di accesso, provando o lo username root con password probabili (come password, root, toor e così via) oppure tramite coppie di username/password conosciute (create, ad esempio, da malware o da rootkit).
Con le ultime versioni, però, si è ampliato ed è in grado di coprire svariati servizi (che andranno, però, configurati manualmente), come ad esempio apache, vsftpd, ngix, postfix, etc.
Fail2Ban è in grado di ridurre il tasso di tentativi di autenticazione errati, tuttavia non può eliminare il rischio che presenta un’autenticazione debole. Configurare i servizi in modo che utilizzino solo meccanismi di autenticazione a due fattori o pubblici/privati ??se si desidera davvero proteggere i servizi.
Fail2ban funziona modificando dinamicamente le regole del firewall per vietare gli indirizzi che hanno tentato invano di accedere in un certo numero di volte. Come impostazione di base fail2ban configura iptables ma vedremo può essere facilmente impostato per lavorare con UFW.
Con fail2ban possiamo rendere il nostro server ancora più sicuro, potrà infatti riconoscere e bannare automaticamente gli IP troppo invadenti. Fail2ban è un software sviluppato in Python che esegue la scansione dei file di log (ad esempio /var/ log/nginx/access.log) e banna gli IP che mostrano comportamenti pericolosi o dannosi: troppi tentativi falliti di login, ricerca di exploit, ecc.
I tentativi di accessi brute force sono piuttosto frequenti contro un server SSH e altri servizi Internet protetti da password (come ftp, pop, …). Gli script automatici provano più combinazioni di nome utente/password (attacco brute force) e a volte la modifica della porta rispetto a quella predefinita non può essere eseguita.
È importante mantenere sicura la propria macchina installando continuamente tutti gli aggiornamenti che vengono proposti dal produttore e bloccare tutte le richieste che potrebbero rallentarla o addirittura danneggiarla.
Cosa fare per mitigare i tentativi di intrusione
Fail2ban tenta di alleviare questi problemi fornendo un modo automatico di identificare non solo i possibili tentativi di intrusione, ma di agire su di essi in modo rapido e semplice in modo definibile dall’utente.
I log, i file di registro contengono informazioni interessanti, in particolare sugli accessi non riusciti. Questa informazione può essere utilizzata in tempo reale per bloccare un client indesiderato ed è esattamente quello che fa Fail2ban. Il software esegue la scansione dei file di registro e rileva i modelli che corrispondono a possibili tentativi di intrusione o attacco, quindi esegue azioni di risposta. La maggior parte delle volte l’azione consiste nell’aggiungere una nuova regola nel firewall e inviare una notifica via e-mail all’amministratore di sistema.
Di seguito un elenco delle funzionalità più importanti disponibili in Fail2ban:
- Client/server
- Multithreaded
- Supporto Gamin
- Rilevamento automatico del formato data/ora
- Supporto jolly – wildcard in opzione logpath
- Supporto per molti servizi (sshd, nginx, apache, qmail, proftpd, sasl, wildcard, ecc.)
- Supporto per diverse azioni (iptables, tcp-wrapper, ufw, shorewall, notifiche di posta, ecc.)
- Monitoraggio dei file di registro
- Prevenzione delle intrusioni
- Protezione dictionary attack
- Protezione attacchi DoS
- Aggiorna le regole del firewall Netfilter / iptables o PF
- Protegge contro un attacco di brute-force distribuito
Funzionamento di fail2ban
L’idea alla base di fail2ban è monitorare i registri dei servizi comuni per individuare gli schemi nei fallimenti di autenticazione.
Quando fail2ban è configurato per monitorare i log di un servizio, esamina un filtro che è stato configurato specifico per quel servizio. Il filtro è progettato per identificare i fallimenti di autenticazione attraverso l’uso di espressioni regolari complesse. Fail2ban definisce questi modelli di espressioni regolari in una variabile chiamata failregex. che trovi archiviati nella cartella /etc/fail2ban/filter.d/.
Fortunatamente, fail2ban include diversi filtri precompilati per i servizi e web server più comuni. Quando una riga nel file di registro del servizio corrisponde a failregex nel suo filtro, l’azione definita viene eseguita per quel servizio. L’azione è una variabile che può essere configurata per fare molte cose diverse, a seconda delle preferenze dell’amministratore.
L’azione predefinita consiste nel bannare l’host/l’indirizzo IP offensivo modificando le regole del firewall iptables oppure, se presente, con UFW. È possibile espandere questa azione per inviare anche una e-mail all’amministratore con il rapporto whois dell’aggressore o le linee di log che hanno attivato l’azione.
Per impostazione predefinita, verrà intrapresa un’azione quando tre errori di autenticazione sono stati rilevati in 10 minuti e il tempo di ban predefinito è di 10 minuti. L’impostazione predefinita per il numero di errori di autenticazione necessari per attivare un ban è sovrascritta nella parte SSH del file di configurazione predefinito per consentire 6 errori prima che il blocco abbia luogo. Questo è interamente configurabile dall’amministratore.
Quando si utilizza la destinazione iptables predefinita per il traffico SSH, fail2ban crea una nuova catena all’avvio del servizio. Aggiunge una nuova regola alla catena INPUT che invia tutto il traffico TCP diretto alla porta 22 alla nuova catena. Nella nuova catena, inserisce una singola regola che ritorna alla catena INPUT.
Questo fa solo saltare il traffico verso la nuova catena per poi tornare indietro, non ha alcun effetto sul traffico all’inizio. Tuttavia, quando un IP raggiunge la soglia per i fallimenti di autenticazione, viene aggiunta una regola in cima alla nuova catena per eliminare il traffico da quell’IP. Quando il periodo di divieto è scaduto, la regola di iptables viene rimossa. La catena e le regole associate vengono rimosse quando termina il servizio fail2ban.
Requisiti
- Un server linux (nel mio caso Linux Mint 21.1)
- Un account utente non root con privilegio sudo impostato sul tuo server.
Installazione di fail2ban
Aggiornare l’indice del pacchetto locale e installare fail2ban digitando i comandi:
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install fail2ban -y
Questo installerà il software. Per impostazione predefinita, fail2ban è configurato per bloccare solo i tentativi di accesso SSH non riusciti. Dobbiamo abilitare alcune regole che lo configureranno per controllare i nostri log di Nginx per i pattern che indicano attività dannose.
A questo punto va riavviato il servizio:
$ sudo service fail2ban restart
E contestualmente va controllato lo stato del servizio riavviato:
$ sudo service fail2ban status
Configurazione di fail2ban
Fail2ban è configurato attraverso una varietà di file situati all’interno di una gerarchia sotto la directory /etc/fail2ban/.
Il file fail2ban.conf configura alcune impostazioni operative di base come il modo in cui il daemon registra le informazioni e il socket e il file pid che utilizzerà. La configurazione principale ha luogo nei file che definiscono le “jail”.
Per impostazione predefinita, fail2ban viene fornito con un file jail.conf. Tuttavia, questo file può essere sovrascritto negli aggiornamenti futuri, quindi ti consiglio di copiare questo file in un nuovo file jail.local e apportare modifiche lì.
Crea un file jail.local:
$ touch /etc/fail2ban/jail.local
Oppure copia quello di default:
$ sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Ora va editato il nuovo file:
$ sudo nano /etc/fail2ban/jail.local
Dovremmo iniziare valutando i valori predefiniti impostati all’interno del file per vedere se soddisfano i nostri bisogni. Questi si troveranno nella sezione [DEFAULT] all’interno del file. Questi elementi impostano la politica generale e possono essere sovrascritti in specifiche jail.
Uno dei primi elementi da esaminare è l’elenco di client che non sono soggetti alle politiche fail2ban. Questo è impostato dalla direttiva ignoreip. A volte è una buona idea aggiungere il proprio indirizzo IP o la propria rete all’elenco delle eccezioni per evitare di bloccarsi. È possibile aggiungere ulteriori indirizzi IP o reti delimitate da uno spazio all’elenco esistente.
[DEFAULT]
ignoreip = 127.0.0.1/8 192.168.188.25 10.12.10.10/30
bantime = 3600
findtime = 600
maxretry = 5
[sshd]enabled = true
Un altro elemento che potresti voler aggiustare è il bantime, che controlla quanti secondi per cui un IP è bannato. È ideale impostarlo su un tempo sufficientemente lungo per disturbare il malintenzionato, ma anche abbastanza breve da consentire agli utenti legittimi di correggere gli errori. Per impostazione predefinita, questo è impostato su 600 secondi (10 minuti). Aumenta o diminuisci questo valore come meglio credi. Impostare il bantime a -1 comporterà un divieto permanente di tale indirizzo IP. Considera attentamente questa opzione!
I due elementi successivi determinano l’ambito delle righe di registro utilizzate per determinare un client incriminato. Il findtime specifica una quantità di tempo in secondi e la direttiva maxretry indica il numero di tentativi da tollerare entro quel tempo. Se un cliente effettua più di un tentativo di maxretry entro il tempo impostato dal findtime, verrà bannato.
Riavvia fail2ban per rendere affettive le modifiche:
$ service fail2ban restart
Ogni volta che riavvii fail2ban, il software rilegge il file di configurazione. Nel caso dovessero esserci errori di configurazione, la shell mostra un avvertimento. Correggi il problema e prova di nuovo a riavviare. Se Fail2ban non si avvia correttamente dopo aver creato il file di configurazione, è possibile che sia un errore di battitura nel file di configurazione /etc/fail2ban/jail.local. Controlla i contenuti del file e riprova!
Verifica lo stato di fail2ban:
$ service fail2ban status
Verifica la “cella” delle connessioni SSH:
$ fail2ban-client status sshd
Aggiungere un IP in white list
Per evitare di essere bannati è opportuno inserire il proprio IP in white list in modo che venga ignorato dal servizio fail2ban. Per aggiunge un IP in white list devi editare uno dei due file a scelta:
# opzione 1
/etc/fail2ban/jail.conf
# opzione 2
/etc/fail2ban/jail.local
Non serve editarli entrambi, io ad esempio ho modificato solo il file jail.local. Se decidi di editare il file jail.conf aprilo e cerca la riga che inizia così:
ignoreip =
Ora aggiungi l’IP che vuoi ignorare:
ignoreip = 192.168.188.25 192.168.120.0/32
Invece per riavviare semplicemente il servizio senza arrestarlo, ad esempio per abilitare la nuova configurazione, digita il seguente comando:
$ service fail2ban restart
Configurazione di Fail2Ban per monitorare i registri Nginx
Ora che disponiamo di alcune delle impostazioni generali di fail2ban, possiamo concentrarci sull’attivazione di alcune jail specifiche di Nginx che monitoreranno i registri del web server per specifici modelli di comportamento.
Ogni prigione all’interno del file di configurazione è contrassegnata da un’intestazione contenente il nome della prigione in parentesi quadre. Per impostazione predefinita, solo la [ssh] jail è abilitata.
Abilitiamo altre jail custom modificando il file jail.local.
[nginx-http-auth]
Per abilitare il monitoraggio dei log per i tentativi di accesso a Nginx, abiliteremo la jail [nginx-http-auth]. Modifica nel file /etc/fail2ban/jail.local la direttiva abilitata all’interno di questa sezione in modo che il parametro enabled sia “true”:
[nginx-http-auth]
enabled = true
filter = nginx-http-auth
port = http,https
logpath = /var/log/nginx/error.log
. . .
Questa potrebbe essere l’unica jail specifica per Nginx inclusa nel pacchetto fail2ban di Ubuntu, dipende da quale versione hai installato. Tuttavia, possiamo creare le nostre jail custom per aggiungere funzionalità aggiuntive. Puoi trovare ispirazione partendo da qui e qui.
[nginx-noscript]
Possiamo creare un jail [nginx-noscript] per escludere i client che stanno cercando script eseguibili sul sito web di cui sfruttare vulnerabilità. Attenzione perchè questa jail individua richieste HTTP a file con estensioni php, asp, exe|, pl, cgi e scgi quindi non attivarla se le pagine del tuo sito web usano queste estensioni.
Puoi aggiungere nel file /etc/fail2ban/jail.local questa jail per vietare a chi richiede questi tipi di risorse:
[nginx-noscript]
enabled = true
port = http,https
filter = nginx-noscript
logpath = /var/log/nginx/access.log
maxretry = 6
. . .
[wordpress]
Nel mio server ho aggiunto una regola per proteggere la pagina di login di WordPress, il filtro banna IP che falliscono tre volte l’autenticazione. Aggiungi questa sezione al tuo file jail.local:
[wordpress]
enabled = true
port = http,https
filter = wordpress
action = iptables-multiport[name=wordpress, port="http,https", protocol=tcp]
logpath = /var/log/nginx/access.log
maxretry = 3
[nginx-badbots]
Possiamo aggiungere una sezione chiamata [nginx-badbots] per fermare alcuni modelli di richieste di bot malevoli noti:
[nginx-badbots]
enabled = true
port = http,https
filter = nginx-badbots
logpath = /var/log/nginx/access.log
maxretry = 2
[nginx-noproxy]
Perché non bannare i client che tentano di utilizzare il nostro server Nginx come open proxy? Aggiungiamo una jail [nginx-noproxy] per soddisfare queste richieste:
[nginx-noproxy]
enabled = true
port = http,https
filter = nginx-noproxy
logpath = /var/log/nginx/access.log
maxretry = 2
Quando hai finito di apportare le modifiche necessarie al file jail.local, salva e chiudi il file.
Ora dobbiamo aggiungere i filtri custom per le jail che abbiamo creato. Spostiamoci nella cartella filter.d e creiamo i file necessari:
$ cd /etc/fail2ban/filter.d
In questa cartella troviamo tutti i filtri precompilati, qui dovremo aggiungere quelli che invece vogliamo creare noi e che abbiamo richiamato nel file jail.local. Partiamo dal primo.
[nginx-noscript]
Creiamo il primo filtro custom [nginx-noscript]:
$ sudo nano nginx-noscript.conf
Incolla la seguente definizione all’interno del nuovo file /etc/fail2ban/filter.d/nginx-noscript.conf. Sentiti libero di modificare o aggiungere i suffissi dello script:
[Definition]
failregex = ^<HOST> -.*GET.*(\.php|\.asp|\.exe|\.pl|\.cgi|\.scgi)
ignoreregex =
[wordpress]
Adesso creiamo il filtro custom per WordPress:
$ sudo nano wordpress.conf
Inserisci questo filtro che bloccherà tutti gli IP che tentano successivamente di accedere alla pagina di login:
[Definition]
failregex = ^<HOST> .* "POST .*wp-login.php
^<HOST> .* "POST .*xmlrpc.php
ignoreregex =
[nginx-badbots]
Ora, se non è presente, dobbiamo creare il filtro [nginx-badbots]. In alcune versioni di fail2ban è già presente, altrimenti basta copiare il filtro di Apache – apache-badbots.conf:
$ sudo cp apache-badbots.conf nginx-badbots.conf
[nginx-noproxy]
L’ultimo filtro da creare è [nginx-noproxy]:
$ sudo nano nginx-noproxy.conf
Questa definizione di filtro corrisponderà ai tentativi di utilizzare il server come proxy:
[Definition]
failregex = ^<HOST> -.*GET http.*
ignoreregex =
Salva tutti i file quando hai finito e riavvia fail2ban:
$ sudo service fail2ban restart
Integrazione con UFW
Se nel tuo server hai attivato il firewall UFW e vuoi integrare fail2ban, nella sezione DEFAULT del file jail.local aggiungi questa azione:
banaction = ufw
La versione più recente di fail2ban contiene già un’azione pre-configurata per UFW, puoi controllare dentro la cartella /etc/fail2ban/action.d e cercare il file ufw.conf. Nel caso non ci fosse, crealo ed incolla questo codice:
[Definition]
actionstart =
actionstop =
actioncheck =
actionban = [ -n "<application>" ] && app="app <application>"
ufw insert <insertpos> <blocktype> from <ip> to <destination> $app
actionunban = [ -n "<application>" ] && app="app <application>"
ufw delete <blocktype> from <ip> to <destination> $app
[Init]
insertpos = 1
blocktype = reject
destination = any
application =
Ottenere informazioni sulle jail abilitate
Puoi vedere tutte le tue jail abilitate usando il comando fail2ban-client:
$ sudo fail2ban-client status
È possibile controllare iptables per vedere quali regole sono state modificate da fail2ban. Anche senza regole firewall precedenti, ora avresti un framework abilitato che consente a fail2ban di escludere selettivamente i client aggiungendoli a catene appositamente create:
$ sudo iptables -S
Se vuoi vedere i dettagli dei divieti che vengono applicati da qualsiasi jail, è probabilmente più facile usare di nuovo il client fail2ban:
$ sudo fail2ban-client status nginx-http-auth
Test delle politiche Fail2Ban
È importante testare le policy di fail2ban per assicurarsi che blocchino il traffico come previsto. Ad esempio, per la richiesta di autenticazione Nginx, è possibile fornire credenziali errate un numero di volte. Dopo aver superato il limite, dovresti essere bannato e non riuscire ad accedere al sito. Se imposti le notifiche email, dovresti visualizzare i messaggi relativi al divieto nell’account email che hai fornito.
Se guardi lo stato con il comando fail2ban-client, dovresti vedere il tuo indirizzo IP bannato dal sito (se non hai messo il tuo IP in whitelist):
$ sudo fail2ban-client status nginx-http-auth
# Output
Status for the jail: nginx-http-auth
|- filter
| |- File list: /var/log/nginx/error.log
| |- Currently failed: 0
| `- Total failed: 12
`- action
|- Currently banned: 1
| `- IP list: 111.111.111.111
`- Total banned: 1
Monitorare fail2ban in tempo reale
Se sei un NERD come me sono sicuro che ti piace monitorare tutto con la shell SSH. Fail2ban può essere facilmente monitorato in tempo reale con il comando tail:
$ tail -f /var/log/fail2ban.log
Se non vedi nulla che significa che la configurazione è errata oppure non c’è niente di cui preoccuparti.
Arrestare e riavviare fail2ban
Nel caso tu avessi bisogno di disattivare e riattivare fail2ban ti basterà digitare i seguenti comandi
# arrestare il servizio fail2ban
$ sudo service fail2ban stop
# avviare il servizio fail2ban
$ sudo service fail2ban start
Per riavviare fail2ban puoi scegliere se riavviare il processo oppure ricaricare le opzioni:
# riavviare il servizio fail2ban
$ sudo systemctl restart fail2ban
# ricaricare le opzioni
$ sudo fail2ban-client reload
OMG mi sono bannato!
Capita, anche a me è successo svariate volte prima di mettere il mio IP in white list 🙂 Se a casa hai un IP fisso cerca di cambiarlo temporaneamente (con una VPN ad esempio) e accedi via SSH al server. Digita il seguente comando per eliminare il tuo IP dalla lista di ban (cambia l’IP dell’esempio con il tuo):
$ sudo fail2ban-client set nginx-noscript unbanip 192.168.188.123
Come vedi, nel comando devi specificare in quale jail si trova l’IP, quindi, se non sai in quale jail sei finito, dovrai passarle tutte in rassegna e verificare con il comando:
#verificare lo stato di specifiche jail
$ sudo fail2ban-client status sshd
$ sudo fail2ban-client status nginx-botsearch
$ sudo fail2ban-client status nginx-noscript
$ sudo fail2ban-client status nginx-http-auth
$ sudo fail2ban-client status wordpress
Esempio di file jail.local
Per riferimento lascio una copia del mio file jail.local, magari servirà a qualcuno, magari servirà a me 🙂
[DEFAULT]
ignoreip = 127.0.0.1/8 192.168.188.2/120
bantime = 3600
findtime = 600
maxretry = 2
banaction = ufw
[sshd]
enabled = true
[nginx-botsearch]
enabled = true
port = http,https
filter = nginx-botsearch
logpath = /var/log/nginx/access.log
findtime = 120
[nginx-noscript]
enabled = true
port = http,https
filter = nginx-noscript
logpath = /var/log/nginx/access.log
findtime = 120
ignoreip = 127.0.0.1/8 1.2.3.4 5.6.7.8
[wordpress]
enabled = true
port = http,https
filter = wordpress
action = iptables-multiport[name=wordpress, port="http,https", protocol=tcp]
logpath = /var/log/nginx/access.log
Conclusione
L’impostazione di default di fail2ban per proteggere il server Nginx è abbastanza semplice. Tuttavia, questo software offre una grande flessibilità per la costruzione di politiche che si adattino alle varie esigenze di sicurezza specifiche. Dando un’occhiata alle variabili e ai pattern all’interno del file /etc/fail2ban/jail.local, e ai file dei filtri nella directory /etc/fail2ban/filter.d e /etc/fail2ban/action.d, è possibile trovare molti pezzi da modificare man mano che le tue esigenze evolvono. Imparare le nozioni di base su come proteggere il server con fail2ban può fornire una buona sicurezza di base con il minimo sforzo.
Bibliografia
Guide Debianizzati.org
Installazione e configurazione fail2ban su Ubuntu e Nginx (Giovanni Sacheli) (EveMilano.com)