Proteggere SSH con Fail2ban su Ubuntu 14.04
Introduzione
Mentre la connessione al server tramite SSH può essere molto sicura, il demone SSH in sé è un servizio che per funzionare correttamente deve essere esposto ad internet. Questo presuppone un certo rischio intrinseco e crea un vettore di attacco per aspiranti aggressori.
In tal modo, qualsiasi servizio che è esposto alla rete è un potenziale bersaglio. Se si presta attenzione ai log dei software che implementano questi servizi, vedrete spesso ripetuti e sistematici tentativi di accesso che rappresentano attacchi di forza bruta da parte di utenti e allo stesso modo di bot.
Un servizio chiamato fail2ban può attenuare questo problema creando regole che possono alterare automaticamente la vostra configurazione iptables
del firewall in base ad un numero predefinito di tentativi di accesso non riusciti. Ciò permetterà al server di rispondere ai tentativi di accesso illegittimi senza il vostro intervento.
In questa guida, vedremo come installare ed utilizzare fail2ban su un server Ubuntu 14.04.
Installare Fail2ban su Ubuntu 14.04
Il processo di installazione di questo strumento è semplice perché quelli di Ubuntu che si occupano dei pacchetti ne manutengono uno nei repository di default.
In primo luogo abbiamo bisogno di aggiornare il nostro elenco dei pacchetti locale, quindi possiamo utilizzare apt
per scaricare ed installare il pacchetto:
sudo apt-get update
sudo apt-get install fail2ban
Come si può vedere, l’installazione è banale. Ora possiamo iniziare la configurazione del programma per poterlo utilizzare.
Configurare Fail2ban con le impostazioni da servizio
Il servizio fail2ban mantiene i propri file di configurazione nella directory /etc/fail2ban
. C’è un file con le impostazioni predefinite chiamato jail.conf
.
Dal momento che questo file può essere modificato dagli aggiornamenti dei pacchetti non dobbiamo modificare il file direttamente lì, piuttosto dobbiamo copiarlo di modo che lo si possa modificare senza rischi.
Abbiamo bisogno di copiarlo in un file chiamato jail.local
affinché fail2ban possa trovarlo:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Una volta che il file è stato copiato siamo in grado di aprirlo per modificarlo e per vedere come funziona il tutto:
sudo nano /etc/fail2ban/jail.local
In questo file ci sono alcune impostazioni che potrebbe essere modificate. Le impostazioni che si trovano sotto la sezione [DEFAULT]
verranno applicate a tutti i servizi abilitati a funzionare con fail2ban su cui non prevale la medesima sezione, propria di quei servizi.
ignoreip = 127.0.0.1/8
Con l’aggiunta di un valore al parametro ignoreip
è possibile regolare gli indirizzi sorgente che Fail2ban ignora. Nell’esempio è configurato per non bannare alcun tipo di traffico proveniente dalla macchina locale. È possibile aggiungere ulteriori indirizzi da ignorare inserendoli alla fine del parametro, separati da uno spazio.
bantime = 600
Il parametro bantime
imposta il periodo di tempo per cui un client sarà bannato quando avrà fallito di autenticarsi correttamente. Viene misurato in secondi. Di default, viene impostato su 600 secondi, 10 minuti.
findtime = 600
maxretry = 3
I prossimi due parametri ai quali presteremo attenzione sono findtime
e maxretry
. Questi funzionano assieme affinché si stabiliscano le condizioni in cui un client si trovi ad essere un utente non legittimo che dovrebbe essere bannato.
La variabile maxretry
imposta il numero di tentativi che un client ha per l’autenticazione, all’interno di una finestra di tempo definito da findtime
, prima di essere bannato. Di default, il servizio fail2ban bannerà un client che tenta senza successo il login 3 volte all’interno di una finestra di 10 minuti.
destemail = root@localhost
sendername = Fail2Ban
mta = sendmail
Altre impostazioni che potreste desiderare conoscere sono destemail
, sendername
ed mta
nel caso si desiderino configurare gli avvisi email. Il parametro destemail
imposta l’indirizzo email che dovrebbe ricevere i messaggi di ban. sendername
imposta il valore del campo “Da” nell’email. Il parametro mta
configura quale servizio di posta verrà utilizzato per inviare la posta.
action = $(action_)s
Questo parametro configura l’azione che Fail2ban prende quando vuole stabilire un ban. Nel file, il valore action_
è definito poco prima di questo parametro. L’azione di default è semplicemente quella di configurare il firewall per rifiutare il traffico dall’host incriminato fino a quando non sia trascorso il tempo di ban.
Se si desidera configurare gli avvisi email, è possibile modificare il valore da action_
a action_mw
. Se si desidera che l’email includa le righe di log attinenti al caso, si può cambiarlo in action_mwl
. Se scegliete di usare gli avvisi email, assicuratevi di aver configurato le impostazioni della mail in maniera appropriata.
Impostazioni della Jail per ogni singolo servizio
Siamo arrivati infine alla porzione del file di configurazione che si occupa dei singoli servizi. Questi sono specificati dagli header di sezione, come [SSH]
.
Ognuna di queste sezioni può essere abilitata modificando o aggiungendo la linea enabled
di modo che sia “vera” (true):
enabled = true
Di default, il servizio SSH è abilitato e tutti gli altri sono disabilitati.
Queste sezioni funzionano utilizzando i valori di default definiti in precedenza. Se si desidera che tali valori non abbiano la precedenza è possibile farlo nella sezione del servizio. Se si desidera utilizzare le impostazioni di default non è necessario aggiungere nulla.
Altre impostazioni che vengono qui impostate sono filter
che verrà utilizzata per decidere se una linea in un log indica una autenticazione fallita e logpath
che dice a fail2ban dove si trovano i log per quel determinato servizio.
Il valore filter
è in realtà un riferimento ad un file ubicato nella directory /etc/fail2ban/filter.d
, senza l’estensione .conf
. Questo file contiene le espressioni regolari che determinano se una riga nel log non va bene. In questa guida non tratteremo questo file in modo approfondito perché è abbastanza complesso e le impostazioni predefinite effettuano bene il match delle linee idonee al match stesso.
Tuttavia, cercando in questa directory, è possibile vedere che tipo di filtri sono disponibili:
ls /etc/fail2ban/filter.d
Se vedete un file che sembra essere correlato ad un servizio che state utilizzando, dovreste aprirlo con un editor di testo. La maggior parte dei file sono abbastanza ben commentati e dovreste essere in grado di capire almeno il tipo di condizione per la quale lo script è stato progettato per difendersi. La maggior parte di questi filtri corrispondono ad appropriate sezioni (disabilitate) nel file jail.local
che, se vogliamo, possiamo abilitare.
Per esempio, facciamo finta di fornire le pagine di un sito web utilizzando Nginx e di renderci conto che una parte protetta da password del nostro sito viene sempre martellata da tentativi di accesso. Possiamo dire a fail2ban di utilizzare il file nginx-http-auth.conf
per verificare questa condizione all’interno del file /var/log/nginx/error.log
.
Tutto ciò è in realtà già impostato in una sezione chiamata [nginx-http-auth]
nel nostro file /etc/fail2ban/jail.local
. Per proteggere il nostro servizio abbiamo solo bisogno di invertire il parametro enabled
:
[Nginx-http-auth] enabled = true filter = nginx-http-auth port = http, https LogPath = /var/log/nginx/error.log
Se lo attivate, vi consigliamo di riavviare il servizio di fail2ban in modo da assicurarsi che le regole siano state costruite in modo corretto.
Mettere tutto assieme
Ora che avete capito l’idea di base che sta dietro a fail2ban, proviamo una configurazione di base.
Stiamo andando a configurare una policy di auto-ban per SSH e Nginx, proprio come abbiamo descritto sopra. Vogliamo che fail2ban ci contatti via email quando un IP viene bannato.
Per prima cosa, installate tutto il software in questione.
Se non lo avete già avrete bisogno di Nginx, dal momento che stiamo andando a monitorare i suoi log, e avrete bisogno di sendmail per mandare le mail di notifica. Installiamo anche iptables-persistent
per consentire al server di impostare automaticamente al boot le nostre regole del firewall. Questi pacchetti possono essere acquisiti dai repository di default di Ubuntu:
sudo apt-get update
sudo apt-get install nginx sendmail iptables-persistent
Impostare un firewall di base
Quando abbiamo finito, dobbiamo impostare un firewall di default. Nel link di seguito potete imparare come configurare un firewall iptables su Ubuntu 14.04. Nella guida che state leggendo ci stiamo preparando a creare solo un firewall di base.
Stiamo andando a dire al firewall di consentire le connessioni stabilite (già in atto), il traffico generato dal server stesso, il traffico destinato alle porte SSH e al server web. Impediremo tutto il resto del traffico. Siamo in grado di impostare questo firewall di base digitando:
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -j DROP
Questi comandi attuano la politica di cui sopra. Possiamo vedere le regole del firewall corrente digitando:
sudo iptables -S
-P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCETTA -N fail2ban-ssh -A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh -A INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -j DROP -A fail2ban-ssh-j RETURN
Ora abbiamo la nostra politica di default per ciascuna delle nostre chain e le cinque regole che abbiamo appena stabilito. In rosso abbiamo anche la struttura predefinita impostata da fail2ban, che implementa già di default le politiche di ban per SSH.
Regolare la configurazione di Fail2ban
Ora abbiamo bisogno di configurare fail2ban con le impostazioni che desideriamo usare. Aprite il file jail.local
:
sudo nano /etc/fail2ban/jail.local
Qui siamo in grado di impostare un tempo di ban più severo. Sotto l’intestazione di default cambiate l’impostazione bantime
di modo che il nostro servizio banni i client per mezz’ora:
bantime = 1800
È anche necessario configurare le informazioni per gli avvisi email. In primo luogo, trovate il parametro destemail
e inserite l’indirizzo email che desiderate usare per raccogliere questi messaggi:
destemail = admin@esempio.com
Se volete, potete impostare sendername
a qualcos’altro. È utile usare un valore che possa essere facilmente filtrato utilizzando il servizio di posta, altrimenti la vostra abituale casella di posta potrebbe essere invasa da avvisi nel caso ci siano un sacco di tentativi di intrusione qui e là.
Spostandoci in basso, abbiamo bisogno di regolare il parametro action
di una delle action che ci inviano le email. Le scelte sono tra action_mw
che istituisce il ban e quindi ci invia una email con un “whois” sull’host che commette l’illecito, o action_mwl
che fa quanto sopra, ma che ci invia anche delle email con i file di log attitenti al caso.
Scegliamo ora action_mwl
perché le linee di log, nel caso di problemi, ci aiuteranno a risolverli ed a raccogliere ulteriori informazioni:
action =% (action_mwl) s
Passando alla nostra sezione SSH, se vogliamo regolare la quantità di tentativi falliti che dovrebbero essere consentiti prima che venga stabilito un ban, è possibile modificare la voce maxretry
. Se si utilizza una porta diversa dalla “22” vi consigliamo di regolare il parametro port
in modo appropriato. Come abbiamo detto prima, questo servizio è già attivo, quindi non abbiamo bisogno di modificarlo.
Successivamente, cercate la sezione nginx-http-auth
. Modificate il parametro enabled
in “true”:
[Nginx-http-auth] enabled = true . . .
Questo dovrebbe essere tutto ciò che questa sezione dovrebbe fare, a meno che il server web non stia operando su porte non standard o se avete cambiato il path predefinito dell’error log.
Riavviare il servizio Fail2ban
Una volta terminato, salvate e chiudete il file.
Ora avviate o riavviate il servizio fail2ban. A volte, è meglio fare lo shutdown completo del servizio e quindi avviarlo di nuovo:
sudo service fail2ban stop
Ora siamo in grado di riavviarlo digitando:
sudo service fail2ban start
Affinché tutte le tutte le regole del firewall vengano recepite potrebbero essere necessario aspettare alcuni minuti. Tuttavia, dopo un po’, è possibile controllare le nuove regole digitando:
sudo iptables -S
-P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT -N fail2ban-nginx-http-auth -N fail2ban-ssh -A INPUT -p tcp -m multiport --dports 80.443 -j fail2ban-nginx-http-auth -A INPUT -p tcp -m multiport --dports 22 -j fail2ban-SSH -A INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -j DROP -A fail2ban-nginx-http-auth -j RETURN -A fail2ban-ssh-j RETURN
Le linee in rosso sono quelle che sono state create dalle nostre politiche per fail2ban. Al momento, stanno solo dirigendo il traffico a nuove chain pressoché vuote e quindi lasciano che il flusso del traffico torni indietro alla chain INPUT.
Tuttavia, queste nuove chain si trovano nel luogo dove verranno aggiunte le nuove regole di ban.
Testare le politiche di ban
Da un altro server, uno dal quale non avrete bisogno di fare il login nel server con fail2ban, siamo in grado di testare le regole al fine di riuscire a bannare questo secondo server.
Dopo l’accesso al secondo server, cercate di entrare con SSH nel server con fail2ban. Potete provare a connettervi utilizzando un nome inesistente, per esempio:
ssh bla@fail2ban_server_IP
Inserite dei caratteri casuali nel prompt della password. Ripetetelo un paio di volte. Ad un certo punto, il server con fail2ban smetterà di fornire il prompt rispondendo invece con il messaggio Permission denied
. Ciò segnala che il secondo server è stato bandito dal server con fail2ban.
Sul server con fail2ban, è possibile vedere la nuova regola controllando nuovamente iptables:
sudo iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N fail2ban-nginx-http-auth
-N fail2ban-ssh
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-http-auth
-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -j DROP
-A fail2ban-nginx-http-auth -j RETURN
-A fail2ban-ssh -s 11.111.111.11/32 -j REJECT --reject-with icmp-port-unreachable
-A fail2ban-ssh -j RETURN
Come possiamo vedere nella riga evidenziata, abbiamo una nuova regola nella nostra configurazione che rifiuta il traffico verso la porta SSH proveniente dall’indirizzo IP del nostro secondo server. Nell’account che avete configurato dovreste anche aver ricevuto una email riguardante il ban.
Conclusioni
Ora dovreste essere in grado di configurare alcune semplici politiche di ban per i vostri servizi. Fail2ban è molto facile da configurare ed è un ottimo modo per proteggere qualunque tipo di servizio che utilizza l’autenticazione.
Se volete saperne di più sul funzionamento di fail2ban è possibile dare un’occhiata al tutorial su come funzionano le regole ed i file di fail2ban .
Per informazioni su come utilizzare fail2ban per proteggere altri servizi, provate questi link: