Come proteggere SSH con Fail2Ban su CentOS

introduzione

Sebbene la connessione al 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 offre un vettore di attacco per potenziali aggressori.

Qualsiasi servizio esposto alla rete è un potenziale bersaglio in questo modo.

Se presti attenzione ai log 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 alterano 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 il tuo intervento.

In questa guida, tratteremo come installare e utilizzare Fail2ban su un server CentOS.

Installa Fail2ban su CentOS

Sebbene Fail2ban non sia disponibile nel repository ufficiale dei pacchetti CentOS, è impacchettato per il progetto EPEL.

EPEL, acronimo di Extra Packages for Enterprise Linux, può essere installato con un pacchetto di rilascio disponibile da CentOS:

  • sudo yum install epel-release -y

Ora dovremmo essere in grado di installare il pacchetto fail2ban:

  • sudo yum install fail2ban -y

Al termine dell’installazione, utilizza systemctl per abilitare il servizio fail2ban:

  • sudo systemctl enable fail2ban

Configura le impostazioni locali

Il servizio Fail2ban conserva i suoi file di configurazione nella directory /etc/fail2ban.

Lì puoi trovare un file con valori predefiniti chiamato jail.conf.

Poiché questo file potrebbe essere sovrascritto dagli aggiornamenti del pacchetto, non dovremmo modificarlo sul posto.
Invece, scriveremo un nuovo file chiamato jail.local.

Tutti i valori definiti in jail.local sostituiranno quelli in jail.conf.

jail.conf contiene una sezione [DEFAULT], seguita da sezioni per i singoli servizi.
jail.local potrebbe ignorare uno qualsiasi di questi valori.

Inoltre, i file in /etc/fail2ban/jail.d/ possono essere utilizzati per sovrascrivere le impostazioni in entrambi questi file.
I file vengono applicati nel seguente ordine:

  1. /etc/fail2ban/jail.conf
  2. /etc/fail2ban/jail.d/*.conf, in ordine alfabetico
  3. /etc/fail2ban/jail.local
  4. /etc/fail2ban/jail.d/*.local, in ordine alfabetico

Qualsiasi file può contenere una sezione [DEFAULT], eseguita per prima, e può contenere anche sezioni per singole jail.
L’ultimo vavalue impostato per un dato parametro ha la precedenza.

Iniziamo scrivendo una versione molto semplice di jail.local.

Apri un nuovo file utilizzando nano (o il tuo editor preferito):

  • sudo nano /etc/fail2ban/jail.local

Copia e incolla quanto segue:

/etc/fail2ban/jail.local
[DEFAULT]
# Ban hosts for one hour:
bantime = 3600

# Override /etc/fail2ban/jail.d/00-firewalld.conf:
banaction = iptables-multiport

[sshd]
enabled = true

Questo ha la precedenza su tre impostazioni: imposta un nuovo bantime predefinito per tutti i servizi, si assicura che stiamo utilizzando iptables per la configurazione del firewall e abilita la jail sshd.

Esci e salva il nuovo file (in nano, premi Ctrl-X per uscire, y per salvare e Invio per confermare il nome del file).
Ora possiamo riavviare il servizio fail2ban utilizzando systemctl:

  • sudo systemctl restart fail2ban

Il comando systemctl dovrebbe terminare senza alcun output.
Per verificare che il servizio sia in esecuzione, possiamo utilizzare fail2ban-client:

  • sudo fail2ban-client status
Verrà visualizzato:
Status
|- Number of jail:      1
`- Jail list:   sshd

Puoi anche ottenere informazioni più dettagliate su una specifica jail:

  • sudo fail2ban-client status sshd

Explora le Impostazioni Disponibili

La versione di jail.local che abbiamo definito sopra è un buon inizio, ma potresti voler modificare una serie di altre impostazioni.

Apri jail.conf ed esamineremo alcune delle impostazioni predefinite.

Se decidi di modificare uno di questi valori, ricorda che devono essere copiati nella sezione appropriata di jail.local e modificati lì, anziché modificati sul posto.

  • sudo nano /etc/fail2ban/jail.conf

Impostazioni predefinite per tutte le Jails

Innanzitutto, scorri la sezione [DEFAULT] .

ignoreip = 127.0.0.1/8

Puoi modificare gli indirizzi di origine che Fail2ban ignora aggiungendo un valore al parametro ignoreip.
Attualmente, è configurato per non bannare il traffico proveniente dalla macchina locale.
Puoi includere indirizzi aggiuntivi da ignorare aggiungendoli alla fine del parametro, separati da uno spazio.

bantime = 600

Il parametro bantime imposta il periodo di tempo durante il quale un client verrà bannato se non si è autenticato correttamente.
Questo è misurato in secondi. Per impostazione predefinita, questo è impostato su 600 secondi o 10 minuti.

findtime = 600
maxretry = 3

I prossimi due parametri a cui prestare attenzione sono findtime e maxretry.
Questi lavorano insieme per stabilire le condizioni alle quali un cliente 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, Fail2ban bandirà un client che tenta senza successo di accedere 3 volte entro una finestra di 10 minuti.

destemail = root@localhost
sendername = Fail2Ban
mta = sendmail

Se desideri configurare gli avvisi via email, potresti dover sovrascrivere le impostazioni di destemail, nome mittente e mta.
Il parametro destemail imposta l’indirizzo email che dovrebbe ricevere i messaggi di ban.
Il nome mittente 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 esegue quando vuole istituire un ban.
Il valore action_ è definito nel file poco prima di questo parametro.
L’azione predefinita consiste semplicemente nel configurare il firewall per rifiutare il traffico dall’host incriminato fino allo scadere del tempo di ban.

Se desideri configurare avvisi e-mail, puoi sostituire questo valore da action_ a action_mw.
Se desideri che l’email includa le righe di registro pertinenti, puoi modificarla in action_mwl.
Ti consigliamo di assicurarti di avere le impostazioni di posta appropriate configurate se scegli di utilizzare gli avvisi di posta

Impostazioni per le Jails individuali

Dopo [DEFAULT], incontreremo sezioni che configurano le singole jails per servizi diversi.
Questi includeranno in genere una porta da escludere e un percorso di registro per monitorare i tentativi di accesso dannoso. Ad esempio,
la jail SSH che abbiamo già abilitato in jail.local ha le seguenti impostazioni:

/etc/fail2ban/jail.local
[sshd]
port    = ssh
logpath = %(sshd_log)s

In questo caso, ssh è una variabile predefinita per la porta SSH standard e %(sshd_log)s utilizza un valore definito altrove nella configurazione standard di Fail2ban (questo aiuta a mantenere jail.conf portatile tra diversi sistemi operativi).

Un’altra impostazione che potresti incontrare è il filter che verrà utilizzato per decidere se una riga in un registro indica un’autenticazione non riuscita.

Il valore del filtro è in realtà un riferimento a un file che si trova nella directory /etc/fail2ban/filter.d, con la sua estensione .conf rimossa.
Questo file contiene le espressioni regolari che determinano se una riga nel registro non è valida.

Non tratteremo questo file in modo approfondito in questa guida, perché è abbastanza complesso e le impostazioni predefinite corrispondono bene alle linee 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 è abbastanza ben commentata e dovresti essere in grado di dire da quale tipo di condizione lo script è stato progettato per proteggersi.

La maggior parte di questi filtri ha sezioni appropriate (disabilitate) in jail.conf che possiamo abilitare in jail.local se lo desideri.

Ad esempio, fai finta di servire un sito Web utilizzando Nginx e renditi conto che una parte del nostro sito protetta da password viene sbattuta 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.

In realtà è già impostato in una sezione chiamata [nginx-http-auth] nel nostro file /etc/fail2ban/jail.conf.

Dovremmo solo aggiungere un parametro anabled per nginx-http-auth nella voce jail.local:

/etc/fail2ban/jail.local
[DEFAULT]
# Ban hosts for one hour:
bantime = 3600

# Override /etc/fail2ban/jail.d/00-firewalld.conf:
banaction = iptables-multiport

[sshd]
enabled = true

[nginx-http-auth]
enabled = true

E riavvia il servizio fail2ban:

  • sudo systemctl restart fail2ban

Monitora i registri di Fail2ban e la configurazione del firewall

È importante sapere che un servizio come Fail2ban funziona come previsto.

Inizia utilizzando systemctl per controllare lo stato del servizio:

  • sudo systemctl status fail2ban

Se qualcosa non va qui, puoi risolvere i problemi controllando i log per l’unità fail2ban dall’ultimo avvio:

  • sudo journalctl -b -u fail2ban

Successivamente, utilizza fail2ban-client per interrogare lo stato generale di fail2ban-server o di qualsiasi singola jail:

    • sudo fail2ban-client status
    • sudo fail2ban-client status jail_name

Segui il registro di Fail2ban per un record delle azioni recenti (premi Ctrl-C per uscire):

    • sudo tail -F /var/log/fail2ban.log

Elenca le regole correnti configurate per iptables:

    • sudo iptables -L

Mostra le regole di iptables in un formato che rifletta i comandi necessari per abilitare ciascuna regola:

  • sudo iptables -S

Conclusioni

Ora dovresti essere in grado di configurare alcuni criteri 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.