Fail2Ban | Download e installazione
download gratis
Licenza gratuito GNU GPL v2
Sistema Operativo Linux
Recensito da Redazione

Fail2Ban

Come difendersi bloccando le connessioni sospette e i tentativi di login non autorizzati

I Raspberry Pi hanno portato una grande innovazione: visto il loro bassissimo costo, sia per l’acquisto che per il mantenimento, è ormai diventato possibile per chiunque realizzare un piccolo server personale, magari per memorizzare qualche file importante, raggiungibile da qualsiasi parte del mondo.
L’idea è semplice: si tiene un Raspberry Pi come server domestico e nella sua memoria inseriamo i file che possono tornarci utili. Quando avremo bisogno di questi ultimi, non dobbiamo fare altro che accedere al Raspberry Pi da remoto, magari tramite SSH o FTP e prelevarli.
Tuttavia, questa procedura può generare una problematica che, spesso, gli utenti meno esperti non sanno come affrontare: quella dei pirati. Un server, infatti, è ovviamente esposto ai tentativi di accesso da parte di tutti. Scegliere una buona password per proteggerlo è obbligatorio, ma potrebbe non essere sufficiente. Infatti, la maggior parte dei pirati, quando scopre il nostro indirizzo IP tenta di accedere provando decine di password casuali ogni secondo, sperando di indovinare la nostra. Il problema è che è solo una questione di tempo: prima o poi ci riusciranno. Inoltre, i loro numerosi tentativi possono addirittura finire col saturare il Raspberry Pi di richieste e rallentarlo di molto.
L’unica soluzione può essere costituita dal firewall: dobbiamo cercare di identificare i pirati e bannarli dal nostro server rifiutando automaticamente tutte le connessioni dai computer malevoli. E, per riconoscere i PC dei pirati da quelli degli utenti veri, possiamo proprio capire quali sistemi facciano ripetuti tentativi di login sbagliando la password. Il programma Fail2Ban si occupa proprio di questo: monitora continuamente i tentativi di login e se un certo computer (identificato dal suo indirizzo IP) sbaglia più volte di seguito la password lo inserisce nella blacklist di iptables, il firewall del kernel Linux che rifiuta quindi automaticamente le connessioni. Questo non solo garantisce la sicurezza, perché ogni pirata ha appena un paio di tentativi per indovinare la password invece di averne infiniti, ma anche le prestazioni, visto che dopo il ban ogni comunicazione dall’indirizzo IP bannato viene rifiutata automaticamente e quindi non impegna il processore.

Installiamo Fail2Ban da terminale
Per cominciare, avviamo l’installazione di Fail2Ban. Su un sistema Debian-like si può fare semplicemente lanciando il comando sudo apt-get install fail2ban . Questo vale anche per la maggior parte delle distro per Raspberry Pi basate su Raspbian.

Ora possiamo cominciare a configurare Fail2Ban. Basta lanciare il comando sudo nano /etc/fail2ban/jail.conf . Le tre opzioni importanti sono bantime , findtime e maxretry . Dei buoni valori possono essere 604800 (una settimana) per i primi due e poi 3 .

Blocchiamo gli IP
Impostate le tre variabili generali più importanti, bisogna poi creare le varie jail: una per ogni server che vogliamo proteggere. Nel proseguo di questo articolo spiegheremo anche come
scrivere le regole delle jail.

Scritte le modifiche necessarie, si può salvare il file premendo Ctr+O seguito da Invio , e poi uscire con Ctrl+X , confermando. Dopo ogni modifica al file jail.conf , fail2ban deve essere riavviato usando il comando sudo /etc/init.d/fail2ban reload .

Possiamo vedere tutti i tentativi di accesso (SSH o FTP) al nostro sistema dando il comando sudo lastb . La prima colonna indica il nome utente con cui si è eseguito il tentativo di login, la terza l’IP di chi ha tentato l’accesso.

Dopo un certo numero di tentativi errati, un indirizzo IP dovrebbe essere bannato dai login, venendo inserito nella lista nera del firewall. Dando il comando sudo iptables -L vediamo tutti gli IP attualmente bloccati.

La manutenzione delle jail
Per conoscere le jail attive è sufficiente lanciare sudo fail2ban-client status . Il comando mostra i nomi delle jail che hanno la riga enabled = true . Questo è utile perché a volte non ci si ricorda cosa sia attivo su un server.

Se poi si vuole conoscere il dettaglio dell’operato di una jail basta dare il comando sudo fail2ban-client status seguito dal nome della jail. Ad esempio sudo fail2ban-client status ssh fornisce tutti gli IP attualmente bannati dalla connessione SSH.

Se ci rendiamo conto che è stato bannato un IP che, invece, vorremmo potesse accedere al server, possiamo sbloccarlo usando il comando sudo fail2ban-client set ssh unbanip 192.168.1.68 , dove ssh è il nome della jail, e l’ultimo è l’IP da sbloccare.

In qualsiasi momento possiamo verificare gli ultimi login riusciti al nostro server dando il semplice comando last | head (oppure soltanto last ). Se tutto va bene, dovremmo vedere soltanto login che sappiamo di aver autorizzato.

Creiamo un filtro
Dopo aver analizzato una guida veloce all’uso, approfondiamo la conoscenza di Fail2Ban. Questo tool funziona analizzando i file di log dei vari server: SSH registra i tentativi di accesso con le utenze di sistema nel file /var/log/auth.log , mentre il server Web Apache utilizza il file /var/log/apache*/*error.log . Ovviamente, questi file contengono molte altre informazioni, quindi è necessario un filtro per estrarre soltanto gli indirizzi IP dei pirati dai vari log: si utilizza una “regex”, un’espressione regolare. I filtri più importanti sono già forniti con l’installazione di Fail2Ban, ma altri devono essere scritti manualmente. Ad esempio, per controllare i falliti tentativi di accesso al server di posta elettronica Postfix basta creare il file /etc/fail2ban/filter.d/postfix-auth.conf e scrivere al suo interno:

[Definition]
failregex = (?i): warning: [-._w]+[]: SASL (?:LOGIN|PLAIN|(?:CRAM|DIGEST)-MD$
ignoreregex =

Come si può vedere, la riga failregex contiene l’espressione regolare che identifica gli errori di Postfix (che, per la cronaca, vengono registrati nel file /var/log/syslog ).

Configuriamo Fail2Ban
È possibile trovare il filtro pronto all’uso per il server che ci interessa semplicemente cercandolo su un motore di ricerca come Google. Con i filtri si possono poi stabilire le varie “jail” (letteralmente “prigioni”), una dedicata ad ogni programma. Le jail vengono memorizzate nel file /etc/fail2ban/jail.conf e indicano le varie opzioni per il controllo degli accessi ad un server. Per esempio, per proteggere Postfix usando il filtro che abbiamo appena descritto sarà necessario aggiungere al file delle jail la sezione:

[postfix-auth]
enabled = true
port = smtp,ssmtp
filter = postfix-auth
logpath = /var/log/syslog

La definizione è abbastanza semplice: tra parentesi quadre si scrive il nome della jail, con il quale sarà poi possibile identificarla e controllarne lo stato (per esempio il numero di tentativi di accesso bloccati). La riga enabled permette di stabilire se l’utilizzo di questa jail sia abilitato oppure no: a volte può essere utile disabilitare il controllo degli accessi a un particolare server senza dover chiudere del tutto Fail2Ban (così da mantenere il controllo sugli altri server) e senza dover cancellare la configurazione della jail. Se la riga enabled è uguale a true , allora la jail è attiva, se false la jail è disabilitata. La riga port permette di stabilire su quali porte il server sia attualmente in ascolto: per esempio Postfix lavora sul protocollo smtp ed ssmtp . Se non abbiamo modificato le porte predefinite su Postfix, possiamo lasciare queste diciture, altrimenti dobbiamo scrivere il numero della porta su cui il server di posta lavora. La riga filter è quella che contiene il nome del filtro dedicato al server che vogliamo controllare: nel caso di Postfix si tratta del file postfix-auth. Non serve specificare il percorso, né l’estensione del file del filtro, visto che sono sempre gli stessi per tutti i filtri. Infine, logpath indica il file di log che va analizzato con il filtro.

Quella finora descritta, però, è solo la configurazione base: ci sono diverse altre opzioni che possono rivelarsi molto utili. Di seguito l’esempio di una possibile configurazione completa (una dimostrazione è consultabile anche qui :

[DEFAULT]
ignoreip = 127.0.0.1
fintime = 604800
bantime = 604800
maxretry = 3

Il file comincia con la definizione della sezione default, che contiene tutti i parametri applicati automaticamente alle varie jail. Ad esempio, la riga ignoreip include tutti gli indirizzi IP che non verranno mai bloccati (nemmeno se si sbaglia più volte la password), il che è utile per evitare di rimanere chiusi fuori dal proprio server inavvertitamente. Se si scrive in tale riga il valore 192.168.1.0/24 tutti i computer della rete locale non verranno mai bloccati, e questo vale per tutte le jail. Se però per una specifica jail volessimo indicare degli altri indirizzi, basta aggiungere anche in essa la riga ignoreip , e il suo valore avrà la precedenza su quello definito nella sezione default. Altri parametri importanti sono findtime , bantime , e maxretry . In poche parole, se un certo computer tenta l’accesso al nostro server sbagliando la password più volte di quante indicate in maxretry (cioè più di 3 volte) nell’arco del tempo indicato da findtime (604800 secondi sono 7 giorni), verrà bannato da qualsiasi tentativo di accesso per tutto il tempo definito in bantime (cioè altri 7 giorni). Riassumendo: se qualcuno sbaglia password più di 3 volte nell’arco di una settimana, viene bannato per una settimana (la si comincia a contare dal momento dell’ultimo tentativo fallito).

destemail = root@localhost
backend = auto
mta = sendmail
banaction = iptables-multiport
protocol = tcp
chain = INPUT

Si specificano, poi, alcune opzioni che riguardano l’invio di email: Fail2Ban può utilizzare il programma sendmail per inviare un messaggio al nostro indirizzo di posto elettronica ogni volta che un IP viene bannato. Inoltre, si deve indicare come procedere al ban: la soluzione migliore consiste nell’aggiungere una regola iptables nella chain input del firewall, su protocollo tcp . Questo blocca le connessioni dall’IP bannato.

action_ = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]

Esistono tre tipi di azioni possibili per Fail2Ban, che vengono definite con apposite righe. La più semplice è action , che si limita ad avviare il comando iptables con tutte le informazioni per eseguire il blocco dell’IP.

action_mw = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"] %(mta)s-whois[name=%(__name__)s, dest="%(destemail)s", protocol="
%(protocol)s", chain="%(chain)s"]

L’azione action_mw provvede non solo ad eseguire il comando iptables , ma anche ad avviare il programma di invio email ( mta ) inviandoci un messaggio che contiene le informazioni di base. Utilizzando il servizio whois si cerca anche di risalire al nome di dominio associato all’indirizzo IP di chi ha tentato l’accesso, così possiamo avere una idea di chi sia (o almeno del Paese in cui si trovi).

action_mwl = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"] %(mta)s-whois-lines[name=%(__name__)s, dest="%(destemail)s", logpath=%(logpath)s, chain="%(chain)s"]
action = %(action_)s

Infine, action_mwl fa la stessa cosa ma aggiungendo al messaggio email anche il file di log su cui sono registrati i falliti tentativi di accesso, così possiamo controllare tutto nei dettagli.

[ssh]
enabled = yes
port = ssh
filter = sshd
logpath = /var/log/auth.log
bantime = -1
maxretry = 3

Possiamo ora definire la nostra prima jail, ad esempio dedicata agli accessi SSH. Questa jail può essere abilitata impostando enabled al valore yes oppure true (sono equivalenti). La sua descrizione è simile a quella che abbiamo fatto per Postfix, ma stavolta utilizziamo il filtro, la porta e il file di log del server openSSH. Inoltre, specifichiamo che per questo server il numero massimo di tentativi maxretry è 3 , e che diversamente da quanto valga per tutte le altre jail, nel caso di SSH il bantime è -1 . Quando il tempo di ban è impostato a -1 , significa che il blocco dell’IP non scade mai, rimane permanente.


Per conoscere i filtri disponibili basta il comando ls /etc/fail2ban/filter.d/