Ricerca nel sito web

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:

  1. sudo apt-get update
  2. 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:

  1. 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

  1. 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:

  1. 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:

  1. sudo apt-get update
  2. 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:

  1. 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:

  1. sudo iptables -A INPUT -i lo -j ACCEPT
  2. sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
  3. sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
  4. sudo iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
  5. sudo iptables -A INPUT -j DROP

Questi comandi implementeranno la politica di cui sopra. Possiamo vedere le nostre attuali regole del firewall digitando:

  1. 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:

  1. sudo dpkg-reconfigure iptables-persistent

Successivamente, puoi riavviare fail2ban per implementare le regole di wrapping:

  1. sudo service fail2ban start

Possiamo vedere le nostre attuali regole del firewall digitando:

  1. 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:

  1. 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:

  1. sudo service fail2ban stop

Ora possiamo riavviarlo digitando:

  1. 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:

  1. 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:

  1. 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:

  1. 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