Come proteggere SSH con Fail2Ban su Ubuntu 14.04
introduzione
Sebbene la connessione al tuo server tramite SSH possa essere molto sicura, il demone SSH stesso è un servizio che deve essere esposto a Internet per funzionare correttamente. Ciò comporta alcuni rischi intrinseci e crea un vettore di attacco per potenziali aggressori.
Qualsiasi servizio esposto alla rete è un potenziale obiettivo in questo modo. Se presti attenzione ai registri delle applicazioni per questi servizi, vedrai spesso tentativi di accesso ripetuti e sistematici che rappresentano attacchi di forza bruta da parte di utenti e bot.
Un servizio chiamato fail2ban può mitigare questo problema creando regole che possono modificare automaticamente la configurazione del firewall iptables
in base a un numero predefinito di tentativi di accesso non riusciti. Ciò consentirà al tuo server di rispondere a tentativi di accesso illegittimi senza alcun intervento da parte tua.
In questa guida, tratteremo come installare e utilizzare fail2ban su un server Ubuntu 14.04.
Installa Fail2Ban su Ubuntu 14.04
Il processo di installazione di questo strumento è semplice perché il team di packaging di Ubuntu mantiene un pacchetto nei repository predefiniti.
Per prima cosa, dobbiamo aggiornare il nostro indice locale dei pacchetti e poi possiamo usare apt
per scaricare e installare il pacchetto:
- sudo apt-get update
- sudo apt-get install fail2ban
Come puoi vedere, l'installazione è banale. Ora possiamo iniziare a configurare l'utilità per il nostro uso.
Configura Fail2Ban con le tue impostazioni del servizio
Il servizio fail2ban mantiene i propri file di configurazione nella directory /etc/fail2ban
. C'è un file con impostazioni predefinite chiamato jail.conf
.
Poiché questo file può essere modificato dagli aggiornamenti del pacchetto, non dovremmo modificare questo file sul posto, ma piuttosto copiarlo in modo da poter apportare le modifiche in modo sicuro. Affinché questi due file funzionino insieme correttamente, è meglio includere solo le impostazioni che desideri sovrascrivere nel file jail.local
. Tutte le opzioni predefinite verranno prese dal file jail.conf
.
Anche se dovremmo includere solo le deviazioni dall'impostazione predefinita nel file jail.local
, è più semplice creare un file jail.local
basato sul jail esistente. conf
. Quindi copieremo quel file, con i contenuti commentati, come base per il file jail.local
. Puoi farlo digitando:
- awk '{ printf "# "; print; }' /etc/fail2ban/jail.conf | sudo tee /etc/fail2ban/jail.local
Una volta copiato il file, possiamo aprire il file jail.conf
originale per vedere come sono impostate le cose per impostazione predefinita
- sudo nano /etc/fail2ban/jail.conf
In questo file, ci sono alcune impostazioni che potresti voler regolare. Le impostazioni che si trovano nella sezione [DEFAULT]
verranno applicate a tutti i servizi abilitati per fail2ban che non sono sovrascritti nella sezione del servizio.
[DEFAULT]
. . .
ignoreip = 127.0.0.1/8
. . .
L'impostazione ignoreip
configura gli indirizzi di origine che fail2ban ignora. Per impostazione predefinita, è configurato per non vietare alcun traffico proveniente dal computer locale. Puoi aggiungere ulteriori indirizzi da ignorare aggiungendo una sezione [DEFAULT]
con un'impostazione ignoreip
sotto di essa al file jail.local
. Puoi aggiungere altri indirizzi aggiungendoli alla fine della direttiva, separati da uno spazio.
[DEFAULT]
. . .
bantime = 600
. . .
Il parametro bantime
imposta il periodo di tempo durante il quale un client verrà bannato quando non è riuscito ad autenticarsi correttamente. Questo è misurato in secondi. Per impostazione predefinita, questo è impostato su 600 secondi o 10 minuti.
[DEFAULT]
. . .
findtime = 600
maxretry = 3
. . .
I prossimi due parametri a cui prestare attenzione sono findtime
e maxretry
. Questi lavorano insieme per stabilire le condizioni in base alle quali un client risulta essere un utente illegittimo che dovrebbe essere bannato.
La variabile maxretry
imposta il numero di tentativi che un client deve autenticare entro una finestra di tempo definita da findtime
, prima di essere bannato. Con le impostazioni predefinite, il servizio fail2ban bannerà un client che tenta senza successo di accedere 3 volte in una finestra di 10 minuti.
[DEFAULT]
. . .
destemail = root@localhost
sendername = Fail2Ban
mta = sendmail
. . .
Dovrai valutare le impostazioni destemail
, sendername
e mta
se desideri configurare gli avvisi e-mail. Il parametro destemail
imposta l'indirizzo email che dovrebbe ricevere i messaggi di divieto. Il sendername
imposta il valore del campo \Da nell'e-mail. Il parametro mta
configura quale servizio di posta verrà utilizzato per inviare la posta. Ancora una volta, aggiungi questi al jail.local
, sotto l'intestazione [DEFAULT]
e imposta i valori corretti se desideri modificarli.
[DEFAULT]
. . .
action = $(action_)s
. . .
Questo parametro configura l'azione intrapresa da fail2ban quando vuole istituire un ban. Il valore action_
è definito nel file poco prima di questo parametro. L'azione predefinita consiste nel configurare semplicemente il firewall in modo da rifiutare il traffico dall'host offensivo fino allo scadere del tempo di divieto.
Se desideri configurare gli avvisi e-mail, aggiungi o decommenta l'elemento action
nel file jail.local
e modifica il suo valore da action_
a < codice>action_mw. Se desideri che l'email includa le righe di registro pertinenti, puoi modificarla in action_mwl
. Assicurati di aver configurato le impostazioni di posta appropriate se scegli di utilizzare gli avvisi di posta.
Impostazioni della prigione individuale
Infine, arriviamo alla parte del file di configurazione che si occupa dei singoli servizi. Questi sono specificati dalle intestazioni di sezione, come [ssh]
.
Ognuna di queste sezioni può essere abilitata decommentando l'intestazione in jail.local
e modificando la riga enabled
in \true:
[jail_to_enable]
. . .
enabled = true
. . .
Per impostazione predefinita, il servizio SSH è abilitato e tutti gli altri sono disabilitati.
Queste sezioni funzionano utilizzando i valori impostati nella sezione [DEFAULT]
come base e modificandoli secondo necessità. Se desideri sovrascrivere qualsiasi valore, puoi farlo aggiungendo la sezione del servizio appropriata a jail.local
e modificandone i valori.
Alcune altre impostazioni impostate qui sono il filtro
che verrà utilizzato per decidere se una riga in un registro indica un'autenticazione non riuscita e il logpath
che indica a fail2ban dove si trovano i registri per quel particolare servizio si trova.
Il valore filter
è in realtà un riferimento a un file che si trova nella directory /etc/fail2ban/filter.d
, con la sua estensione .conf
rimossa . Questi file contengono le espressioni regolari che determinano se una riga nel registro è un tentativo di autenticazione non riuscito. Non tratteremo questi file in modo approfondito in questa guida, perché sono piuttosto complessi e le impostazioni predefinite corrispondono bene alle righe appropriate.
Tuttavia, puoi vedere che tipo di filtri sono disponibili esaminando quella directory:
- ls /etc/fail2ban/filter.d
Se vedi un file che sembra essere correlato a un servizio che stai utilizzando, dovresti aprirlo con un editor di testo. La maggior parte dei file è commentata abbastanza bene e dovresti essere in grado di dire almeno da quale tipo di condizione lo script è stato progettato per proteggersi. La maggior parte di questi filtri ha sezioni appropriate (disabilitate) nel file jail.conf
che possiamo abilitare nel file jail.local
se lo desideriamo.
Ad esempio, fingi di servire un sito Web utilizzando Nginx e renditi conto che una parte del nostro sito protetta da password viene bloccata dai 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
.
Questo in realtà è già impostato in una sezione chiamata [nginx-http-auth]
nel nostro file /etc/fail2ban/jail.conf
. Dovremmo solo decommentare la sezione nel file jail.local
e capovolgere il parametro enabled
per proteggere il nostro servizio:
. . .
[nginx-http-auth]
enabled = true
. . .
Se lo abiliti, ti consigliamo di riavviare il tuo servizio fail2ban per assicurarti che le tue regole siano costruite correttamente.
Mettere tutto insieme
Ora che hai compreso l'idea di base alla base di fail2ban, esaminiamo una configurazione di base.
Configurare una politica di divieto automatico per SSH e Nginx, proprio come descritto sopra. Vogliamo che fail2ban ci invii un'e-mail quando un IP viene bannato.
Innanzitutto, installiamo tutto il software pertinente.
Se non lo possiedi già, avrai bisogno di nginx, poiché monitoreremo i suoi registri e avrai bisogno di sendmail per inviarci le notifiche. Prenderemo anche iptables-persistent
per consentire al server di impostare automaticamente le nostre regole del firewall all'avvio. Questi possono essere acquisiti dai repository predefiniti di Ubuntu:
- sudo apt-get update
- sudo apt-get install nginx sendmail iptables-persistent
Arrestare il servizio fail2ban
per un momento in modo da poter stabilire un firewall di base senza le regole che aggiunge:
- sudo service fail2ban stop
Stabilire un firewall di base
Al termine, dovremmo implementare un firewall predefinito. Puoi imparare come configurare un firewall iptables su Ubuntu 14.04 qui. Creeremo solo un firewall di base per questa guida.
Gli diremo di consentire le connessioni stabilite, il traffico generato dal server stesso, il traffico destinato alle nostre porte SSH e al server web. Elimineremo tutto il resto del traffico. Possiamo 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 -m multiport --dports 80,443 -j ACCEPT
- sudo iptables -A INPUT -j DROP
Questi comandi implementeranno la politica di cui sopra. Possiamo vedere le nostre attuali regole del firewall digitando:
- sudo iptables -S
Output-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-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
Puoi salvare i firewall in modo che sopravvivano a un riavvio digitando:
- sudo dpkg-reconfigure iptables-persistent
Successivamente, puoi riavviare fail2ban
per implementare le regole di wrapping:
- sudo service fail2ban start
Possiamo vedere le nostre attuali regole del firewall digitando:
- sudo iptables -S
Output-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-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
Abbiamo la nostra politica predefinita per ciascuna delle nostre catene e quindi le cinque regole di base che abbiamo stabilito. In rosso, abbiamo anche la struttura predefinita impostata da fail2ban poiché implementa già le politiche di divieto SSH per impostazione predefinita. Questi possono apparire o meno all'inizio, poiché a volte fail2ban
non aggiunge la struttura finché non viene implementato il primo ban.
Regolazione della configurazione Fail2ban
Ora, dobbiamo configurare fail2ban utilizzando le impostazioni che vorremmo. Apri il file jail.local
:
- sudo nano /etc/fail2ban/jail.local
Possiamo impostare un tempo di divieto più severo qui. Trova e decommenta l'intestazione [DEFAULT]
. Sotto l'intestazione predefinita, modifica l'impostazione bantime
in modo che il nostro servizio escluda i clienti per mezz'ora:
[DEFAULT]
. . .
bantime = 1800
. . .
Dobbiamo anche configurare le nostre informazioni sull'e-mail di avviso. Per prima cosa, trova il parametro destemail
, che dovrebbe trovarsi anche sotto l'intestazione [DEFAULT]
. Inserisci l'indirizzo email che desideri utilizzare per raccogliere questi messaggi:
[DEFAULT]
. . .
destemail = admin@example.com
. . .
Puoi impostare il sendername
su qualcos'altro, se lo desideri. Tuttavia, è utile avere un valore che può essere facilmente filtrato utilizzando il servizio di posta, altrimenti la tua normale casella di posta potrebbe essere inondata di avvisi se ci sono molti tentativi di interruzione da vari luoghi.
Scendendo, dobbiamo regolare il parametro action
su una delle azioni che ci inviano email. Le scelte sono tra action_mw
che istituisce il ban e poi ci invia via e-mail un rapporto \whois sull'host incriminato, o action_mwl
che fa quanto sopra, ma invia anche via e-mail il relativo linee di registro.
Sceglieremo action_mwl
perché le righe di registro ci aiuteranno a risolvere i problemi e raccogliere maggiori informazioni in caso di problemi:
[DEFAULT]
. . .
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, puoi modificare la voce maxretry
. Se stai usando una porta diversa da \22, ti consigliamo di regolare il parametro port
in modo appropriato. Come abbiamo detto prima, questo servizio è già abilitato, quindi non abbiamo bisogno di modificare Quello.
Successivamente, cerca la sezione nginx-http-auth
. Rimuovere il commento dall'intestazione e modificare il parametro enabled
in modo che legga \true.
. . .
[nginx-http-auth]
enabled = true
. . .
Questo dovrebbe essere tutto ciò che devi fare in questa sezione a meno che il tuo server web non stia operando su porte non standard o se hai spostato il percorso del log degli errori predefinito.
Riavvio del servizio Fail2ban
Quando hai finito, salva e chiudi il file.
Ora, avvia o riavvia il tuo servizio fail2ban. A volte, è meglio chiudere completamente il servizio e poi riavviarlo:
- sudo service fail2ban stop
Ora possiamo riavviarlo digitando:
- sudo service fail2ban start
Potrebbero essere necessari alcuni istanti per completare tutte le regole del firewall. A volte, le regole non vengono aggiunte fino a quando non viene istituito il primo divieto di quel tipo. Tuttavia, dopo un po' di tempo, puoi controllare le nuove regole digitando:
- sudo iptables -S
Output-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 create dalle nostre policy fail2ban. In questo momento, stanno solo indirizzando il traffico verso nuove catene quasi vuote e quindi lasciando che il traffico ritorni direttamente nella catena INPUT.
Tuttavia, queste nuove catene sono dove verranno aggiunte le regole di divieto.
Testare le politiche di divieto
Da un altro server, uno con cui non sarà necessario accedere al tuo server fail2ban, possiamo testare le regole facendo bannare il nostro secondo server.
Dopo aver effettuato l'accesso al tuo secondo server, prova ad accedere tramite SSH al server fail2ban. Puoi provare a connetterti utilizzando un nome inesistente, ad esempio:
- ssh blah@fail2ban_server_IP
Immettere caratteri casuali nella richiesta della password. Ripeti questo un paio di volte. Ad un certo punto, il server fail2ban smetterà di rispondere con il messaggio Autorizzazione negata
. Questo segnala che il tuo secondo server è stato bannato dal server fail2ban.
Sul tuo server fail2ban, puoi vedere la nuova regola controllando di nuovo i nostri iptables:
- sudo iptables -S
Output-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 203.0.113.14/32 -j REJECT --reject-with icmp-port-unreachable
-A fail2ban-ssh -j RETURN
Come puoi 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. Dovresti anche aver ricevuto un'e-mail sul divieto nell'account che hai configurato.
Conclusione
Ora dovresti essere in grado di configurare alcune politiche di divieto di base per i tuoi servizi. Fail2ban è molto facile da configurare ed è un ottimo modo per proteggere qualsiasi tipo di servizio che utilizza l'autenticazione.
Se vuoi saperne di più su come funziona fail2ban, puoi dare un'occhiata al nostro tutorial su come funzionano le regole e i file di fail2ban.
Per informazioni su come utilizzare fail2ban per proteggere altri servizi, prova questi collegamenti:
- Come proteggere un server Nginx con Fail2Ban su Ubuntu 14.04
- Come proteggere un server Apache con Fail2Ban su Ubuntu 14.04