Nonostante la connessione SSH rappresenti una scelta molto sicura di connessione a un server, il servizio in background di SSH (definito in informatica come daemon) deve necessariamente interfacciarsi a Internet per funzionare adeguatamente.
Purtroppo, proprio la connessione a Internet rende il server esposto a diversi attacchi informatici, come quelli di tipo brute force. Con questo attacco, l'utente o il bot “bombarda” il server con tentativi di login casuali, il più delle volte fallimentari, fino a riuscire a ottenere un accesso valido. Se dovessi aprire i log di sistema del tuo web server o della tua applicazione, potresti chiaramente notare molteplici tentativi di accesso e riconoscere un attacco di questo tipo.
Fail2ban ti viene in aiuto creando delle regole che, dopo un numero prestabilito di tentativi di login non riusciti, permettono di bloccare l’indirizzo IP che ha provato ad accedere, modificando la configurazione del firewall di Iptables.
In questa guida imparerai a installare il software Fail2ban, che ti permetterà di automatizzare questo processo per bloccare gli attacchi di forza bruta attraverso Iptables, impedendo tentativi di intrusione non autorizzati al tuo server CentOS 8.
Per prima cosa dovrai connetterti al tuo server tramite una connessione SSH. Se non l’hai ancora fatto, ti consigliamo di seguire la nostra guida per connetterti in sicurezza con il protocollo SSH. In caso di server locale puoi passare al punto successivo e aprire il terminale del tuo server.
Installare Fail2ban su CentOS8
Fail2ban non viene incluso nel pacchetto ufficiale di CentOS, ma è parte della repository EPEL (Extra Packages for Enterprise Linux) e può essere installato da una release disponibile tramite CentOS.
Per installare la release, digita nel terminale il comando:
$ sudo yum install epel-release
Sullo schermo dovresti visualizzare un output con una richiesta di conferma, simile al seguente:
yum prompt
Transaction Summary
============================================================================
Install 1 Package
Total download size: 14 k
Installed size: 24 k
Is this ok [y/d/N]: y
Inserisci y e premi Invio per confermare.
Ora dovresti poter installare il pacchetto di Fail2ban, tramite il comando:
$ sudo yum install fail2ban
Come prima, conferma con y e premi Invio per continuare.
Finita l’installazione, dovrai abilitare il servizio di Fail2ban tramite il comando:
$ sudo systemctl enable fail2ban
Configurare le impostazioni locali
I file di configurazione di Fail2ban si trovano nella directory /etc/fail2ban. All’interno della directory troverai un file denominato jail.conf, il quale verrà aggiornato durante ogni upgrade dei pacchetti.
Per inserire le tue impostazioni personalizzate, potrai creare un file denominato jail.local i cui valori sostituiranno quelli di default presenti nel file jail.conf.
I file di configurazione di Fail2ban seguono una determinata sequenza di lettura dei file di configurazione e di applicazione dei parametri, sostituendo i primi valori con gli ultimi inseriti.
Per fare un esempio: jail.conf contiene una sezione denominata [DEFAULT] seguita da una sezione di servizi individuali. jail.local sostituisce alcuni di questi valori. Inoltre, i file contenuti nella directory /etc/fail2ban/jail.d/ possono essere usati per sovrascrivere le impostazioni specificate nei due file precedenti.
L’applicazione delle impostazioni segue il seguente ordine:
- /etc/fail2ban/jail.conf
- /etc/fail2ban/jail.d/*.conf, ordinati in ordine alfabetico (* indica un nome a scelta di uno o più file che potresti aver inserito nella directory)
- /etc/fail2ban/jail.local
- /etc/fail2ban/jail.d/*.local, ordinati in ordine alfabetico (descritto come prima)
Ogni file potrà contenere una sezione [DEFAULT] e una sezione per i jails individuali. La configurazione seguirà sempre la dinamica dell’ultimo valore inserito.
Inizia, allora, scrivendo una versione minimale di jail.local. Puoi creare un nuovo file usando un editor a tua scelta. In questo esempio, ti mostreremo la procedura utilizzando nano.
$sudo nano /etc/fail2ban/jail.local
Una volta aperto il nuovo file, copia al suo interno le seguenti linee per sovrascrivere alcune impostazioni:
[DEFAULT]
# Ban hosts for one hour:
bantime = 3600
# Override /etc/fail2ban/jail.d/00-firewalld.conf:
banaction = iptables-multiport
[sshd]
enabled = true
Per maggiore chiarezza, all’interno del file:
- bantime indica il tempo di ban dell’host dopo aver fallito tutti i tentativi consentiti (indicato in secondi);
- banaction assicura l’utilizzo delle iptables per la configurazione del firewall;
- sshd indica l’abilitazione della jail sshd.
Una volta completato l’inserimento, esci e salva le nuove impostazioni. Per farlo usa Ctrl+X per uscire, y per salvare e Invio per confermare.
Per applicare i nuovi cambiamenti riavvia quindi il servizio fail2ban tramite il comando:
$sudo systemctl restart fail2ban
Il comando, se eseguito con successo, non dovrebbe produrre alcun output. Per verificare il corretto funzionamento del servizio, ti basterà inserire:
$sudo fail2ban-client status
Dovresti ottenere un output come il seguente:
Output
Status
|- Number of jail: 1
`- Jail list: sshd
Se necessario, puoi anche richiedere informazioni più dettagliate, inserendo il comando:
$sudo fail2ban-client status sshd
Esplora le impostazioni disponibili
Sistemato il file jail.local, puoi sempre esplorare altre impostazioni presenti nel file principale jail.config. Ricorda che, per assicurarti che le nuove impostazioni vengano applicate, sarebbe meglio copiarle dal file .config inserendole nel file .local.
Per prima cosa, apri il file tramite il comando:
$ sudo nano /etc/fail2ban/jail.conf
Impostazioni di default per tutti i Jails
Esplorando la sezione [DEFAULT]:
ignoreip = 127.0.0.1/8
Tramite la voce ignoreip puoi inserire degli indirizzi su cui non applicare le restrizioni. Di default troverai il valore dell’indirizzo locale ma potrai aggiungerne quanti ne vuoi, semplicemente separandoli con uno spazio.
bantime = 600
Alla voce bantime puoi inserire la durata, espressa in secondi, del ban per l’host che avrà fallito i tentativi di login.
findtime = 600
maxretry = 3
Le voci findtime e maxretry servono a specificare a Fail2ban il grado di tolleranza da avere prima di applicare un ban all’host. I due valori indicano, insieme, il numero di errori consentiti in un certo intervallo di tempo prima di ricevere un ban.
Prendendo come esempio il caso sopra, i valori delle due voci indicano che il ban verrà applicato se verranno sbagliati 3 tentativi in 600 secondi (10 minuti).
destemail = root@localhost
sendername = Fail2Ban
mta = sendmail
Queste tre linee servono a configurare l’allerta per email dei ban avvenuti. In ordine:
- destemail specifica l’indirizzo email che dovrà ricevere il messaggio di ban;
- sendername specifica il nome che dovrà comparire come mittente;
- mta specifica quale servizio mail dovrà essere usato.
action = $(action_)s
Tramite questa voce puoi stabilire l’azione che verrà effettuata da Fail2ban per instituire un ban. Il valore action_ è definito nelle poche righe che vengono prima dell'impostazione citata. Il comportamento di default sarà quello del firewall di bannare per un certo lasso di tempo l’host.
Per configurare le allerte email, puoi sovrascrivere il valore action_ con action_mw. Se volessi allegare dei log specifici, puoi inserire invece il valore action_mwl.
Impostazioni per i Jails individuali
Dopo la sezione [DEFAULT], dovresti imbatterti in una sezione dove configurare i jail individuali per diversi servizi. Tra questi troviamo, solitamente, una port da bannare e un logpath per tracciare i tentativi di accesso non autorizzati.
Prendendo come esempio il file jail.local, troveremo un jail SSH già impostato in precedenza con le seguenti voci di configurazione:
[sshd]
port = ssh
logpath = %(sshd_log)s
Il valore presente in port è una variabile, denominata ssh, definita altrove nella configurazione standard di Fail2ban, che rende il file jail.local portabile tra diversi sistemi operativi.
Un’altra impostazione che potresti trovare è filter, la quale indicherà se una linea in un log debba indicare un'autenticazione fallita.
Il valore di filter si riferisce a un file presente nel percorso /etc/fail2ban/filter.d, con la sua estensione (.conf) rimossa. Questo file contiene l’espressione regolare che determina se una linea in un log sia errata. Questo file è piuttosto complesso e per semplicità non verrà descritto in questa guida, dato che anche le impostazioni predefinite risultano appropriate.
In ogni caso, qualora volessi testare più filtri disponibili, puoi esplorare la directory tramite il comando:
$ ls /etc/fail2ban/filter.d
Esplorando la directory, puoi imbatterti in diversi file che contengono al loro interno commenti esplicativi degli script o delle impostazioni presenti al loro interno. Dovresti poter abilitare alcune sezioni di questi filtri, semplicemente copiando le linee nel file jail.local.
Controllare il log di Fail2ban e la configurazione del Firewall
E’ importante controllare che Fail2Ban stia funzionando come previsto. Inizia verificando lo stato del servizio, tramite il comando:
$ sudo systemctl status fail2ban
Se qualcosa non dovesse funzionare, allora puoi controllare i log di fail2ban dall'ultimo avvio:
$ sudo journalctl -b -u fail2ban
Puoi sfruttare il comando fail2ban-client per interagire con il servizio Fail2ban. Ad esempio, per controllare le regole attive del server o di qualche jail in particolare, digita:
$ sudo fail2ban-client status
$ sudo fail2ban-client status jail_name
Ancora, puoi controllare la lista delle azioni più recenti su Fail2ban visualizzando il contenuto del file di log:
$ sudo tail -F /var/log/fail2ban.log
Puoi chiudere la lista sopra con Ctrl+C.
Controlla le regole correnti impostate per iptables con:
$ sudo iptables -L
Puoi anche mostrare le regole di iptables in un formato che descriva i comandi necessari ad abilitare ogni regola. Per farlo, puoi ricorrere al comando:
$ sudo iptables -S
Qualora volessi annullare manualmente il ban di un IP bloccato da Fail2ban puoi utilizzare il seguente comando:
$
fail2ban-client set sshd unbanip 12.34.56.67
Chiaramente sostituisci "12.34.56.67" con l'IP che vuoi sbloccare. Se viceversa vuoi bannare manualmente l'IP, puoi usare il comando:
$
fail2ban-client set sshd banip 12.34.56.67
Conclusioni
In questa guida ti abbiamo mostrato come installare e configurare Fail2ban su CentOS 8 per impedire tentativi di intrusione non autorizzati al tuo server, grazie alla facilità di configurazione dello strumento.
Ora dovresti essere in grado di utilizzare Fail2ban per impostare delle regole basiche per bloccare gli attacchi bruteforce attraverso Iptables e proteggere i servizi di autenticazione del tuo server, rendendolo più sicuro.