Skip to content

Intro

Qualsiasi servizio esposto a Internet è soggetto ad attacchi da parte di utenti malintenzionati. Se hai un VPS, un server virtuale in cloud, gli utenti illegittimi e i bot tenteranno di introdursi ripetutamente nel tuo sistema autenticandosi con credenziali diverse.

Un esempio di attacco comune è il brute force alla porta SSH, che sarà oggetto di attacchi bot che tentano di forzare con nomi di account comuni. Fortunatamente, servizi come fail2ban sono stati creati per aiutarci a mitigare questi attacchi.

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.

Nelle guide precedenti abbiamo visto come installare e configurare Cloudflare e UFW su Ubuntu per proteggere il sistema da attacchi indesiderati. Oggi vediamo come funziona fail2ban, come installarlo e configurarlo in un sistema Ubuntu con Nginx, integrandolo anche con il firewall 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. In generale Fail2Ban viene quindi utilizzato per aggiornare le regole del firewall per rifiutare gli indirizzi IP per un periodo di tempo specificato, sebbene sia possibile configurare qualsiasi altra azione arbitraria (ad esempio l’invio di un’e-mail). Fail2Ban viene fornito con diversi filtri pre-configurati per vari servizi (nginx, apache, mail, SSH, ecc.).

Fail2Ban è in grado di ridurre il tasso di tentativi di autenticazione errati, ma non può eliminare il rischio di accessi per autenticazioni deboli come password troppo brevi, facili o particolarmente vulnerabili.

Il problema

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 e bloccare tutte le richieste che potrebbero rallentarla o addirittura danneggiarla.

La soluzione

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.

Ecco 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

Come funziona 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 Ubuntu 16.04)
  • Un account utente non root con privilegio sudo impostato sul tuo server.

Installare fail2ban

Aggiorna l’indice del pacchetto locale e installa fail2ban digitando:

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.

Ora riavvia il servizio:

sudo service fail2ban restart

Controlla lo stato del servizio:

sudo service fail2ban status
Fail2ban - Status
Fail2ban – Status

Configurare 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
Fail2ban - cartelle
Fail2ban – cartelle

Ora edita 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 123.456.789 233.344.455.566
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.0.1 192.168.5.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
Fail2ban - Monitoraggio
Fail2ban – Monitoraggio

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 1.1.1.1

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

Il mio 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 1.2.3.4 5.6.7.8
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 tue 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.

Articoli correlati

Autore

Commenti |2

Lascia un commento Lascia un commento
  1. Carlo 1 commento

    Ciao,
    come mai tra i requisiti di fail2ban menzioni un ip statico? nel caso non lo avessi si può ovviare?

    1. Giovanni Sacheli 752 risposte

      Ciao Carlo, grazie per la segnalazione.
      In effetti non leggo più da nessuna parte che serve un IP statico. Lo rimuovo dai requisiti.
      Grazie ancora!

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Ultimi articoli aggiornati

Richiedi un preventivo SEO e Google Ads

Porta il tuo sito web al livello successivo con l’expertise di EVE Milano. La nostra agenzia di Search Marketing ha ricevuto oltre 1121 richieste di preventivo, un segnale chiaro della fiducia che imprenditori e manager, come te, ripongono nella nostra specializzazione tecnica e verticale nella SEO e PPC. Se la tua organizzazione cerca competenze specifiche per emergere nei risultati di Google, noi siamo pronti a fornire quel valore aggiunto. Affidati alla nostra esperienza per fare la differenza.
Richiedi un preventivo

Vuoi rimanere aggiornato su tutte le novità SEO e Google Ads?

Iscriviti alla nostra newsletter!

Informativa sui cookies

Noi e terze parti selezionate utilizziamo cookie o tecnologie simili per finalità tecniche e, con il tuo consenso, anche per le finalità di esperienza e misurazione come specificato nella cookie policy. Puoi liberamente prestare, rifiutare o revocare il tuo consenso, in qualsiasi momento, accedendo al pannello delle preferenze. Il rifiuto del consenso può rendere non disponibili le relative funzioni. Usa il pulsante “Accetta” per acconsentire. Usa il pulsante “Rifiuta” per continuare senza accettare.