Come proteggere SSH con Fail2Ban su Ubuntu 20.04

Introduzione

SSH è il metodo predefinito per connettersi a un server cloud. È resistente e estensibile: mentre vengono sviluppati nuovi standard di crittografia, possono essere utilizzati per generare nuove chiavi SSH, garantendo che il protocollo principale rimanga sicuro. Tuttavia, nessun protocollo o stack software è completamente a prova di errore, e poiché SSH è così ampiamente diffuso su Internet, rappresenta una superficie di attacco molto prevedibile attraverso la quale le persone possono cercare di ottenere accesso.

Qualsiasi servizio esposto alla rete è un potenziale bersaglio in questo modo. Se si esaminano i log del servizio SSH in esecuzione su un server molto frequentato, si vedranno spesso tentativi di accesso ripetuti e sistematici che rappresentano attacchi di forza bruta da parte di utenti e bot. Anche se è possibile apportare alcune ottimizzazioni al servizio SSH per ridurre al minimo la possibilità che questi attacchi abbiano successo, come disabilitare l’autenticazione tramite password a favore delle chiavi SSH, possono comunque rappresentare una piccola responsabilità continua.

Le distribuzioni su larga scala per le quali questa responsabilità è completamente inaccettabile di solito implementano una VPN come WireGuard davanti al proprio servizio SSH, in modo che sia impossibile connettersi direttamente alla porta SSH predefinita 22 dall’esterno di Internet senza un’astrazione software aggiuntiva o gateway. Queste soluzioni VPN sono ampiamente affidabili, ma aggiungeranno complessità e potrebbero interrompere alcune automazioni o altri piccoli hook software.

Prima o oltre ad impegnarsi in una configurazione VPN completa, è possibile implementare uno strumento chiamato Fail2ban. Fail2ban può mitigare significativamente gli attacchi di forza bruta creando regole che modificano automaticamente la configurazione del firewall per bandire IP specifici dopo un certo numero di tentativi di accesso non riusciti. Ciò permetterà al tuo server di proteggersi da questi tentativi di accesso senza intervento da parte tua.

In questa guida, vedrai come installare e utilizzare Fail2ban su un server Ubuntu 20.04.

Prerequisiti

Per completare questa guida, avrai bisogno di:

  • Un server Ubuntu 20.04 e un utente non root con privilegi sudo. Puoi scoprire di più su come configurare un utente con questi privilegi nella nostra guida Configurazione Iniziale del Server con Ubuntu 20.04.

  • Opzionalmente, un secondo server al quale puoi connetterti dal primo server, che userai per testare l’ottenimento di un ban deliberato.

Passo 1 — Installazione di Fail2ban

Fail2ban è disponibile nei repository software di Ubuntu. Inizia eseguendo i seguenti comandi come utente non root per aggiornare i tuoi elenchi dei pacchetti e installare Fail2ban:

  1. sudo apt update
  2. sudo apt install fail2ban

Fail2ban imposterà automaticamente un servizio di background dopo essere stato installato. Tuttavia, è disabilitato per impostazione predefinita, perché alcune delle sue impostazioni predefinite potrebbero causare effetti indesiderati. Puoi verificarlo utilizzando il comando systemctl:

  1. systemctl status fail2ban.service
Output
○ fail2ban.service - Fail2Ban Service Loaded: loaded (/lib/systemd/system/fail2ban.service; disabled; vendor preset: enabled Active: inactive (dead) Docs: man:fail2ban(1)

Potresti abilitare subito Fail2ban, ma prima rivedrai alcune delle sue funzionalità.

Passo 2 – Configurazione di Fail2ban

Il servizio fail2ban conserva i suoi file di configurazione nella directory /etc/fail2ban. C’è un file predefinito chiamato jail.conf. Vai in quella directory e stampa le prime 20 righe di quel file usando head -20:

  1. cd /etc/fail2ban
  2. head -20 jail.conf
Output
# # AVVERTENZA: pesantemente ristrutturato nella versione 0.9.0. Si prega di rivedere e # personalizzare le impostazioni per la propria configurazione. # # Modifiche: nella maggior parte dei casi non si dovrebbe modificare questo # file, ma fornire personalizzazioni nel file jail.local, # o in file .conf separati nella directory jail.d/, ad esempio: # # COME ATTIVARE I CARCERI: # # NON DOVRESTI MODIFICARE QUESTO FILE. # # Probabilmente verrà sovrascritto o migliorato in un aggiornamento della distribuzione. # # Fornire personalizzazioni in un file jail.local o in un jail.d/customisation.local. # Ad esempio, per cambiare il bantime predefinito per tutti i carceri e abilitare il # carcere ssh-iptables, il seguente (non commentato) apparirebbe nel file .local. # Vedi man 5 jail.conf per i dettagli. # # [DEFAULT]

Come vedrai, le prime righe di questo file sono commentate: iniziano con caratteri # che indicano che devono essere lette come documentazione anziché come impostazioni. Come vedrai anche, questi commenti ti stanno indicando di non modificare direttamente questo file. Invece, hai due opzioni: creare profili individuali per Fail2ban in file multipli all’interno della directory jail.d/, oppure creare e raccogliere tutte le tue impostazioni locali in un file jail.local. Il file jail.conf verrà periodicamente aggiornato quando Fail2ban stesso viene aggiornato e verrà utilizzato come fonte di impostazioni predefinite per le quali non hai creato alcuna modifica.

In questo tutorial, creerai jail.local. Puoi farlo copiando jail.conf:

  1. sudo cp jail.conf jail.local

Ora puoi iniziare a fare modifiche di configurazione. Apri il file in nano o nel tuo editor di testo preferito:

  1. sudo nano jail.local

Mentre stai scorrendo il file, questo tutorial esaminerà alcune opzioni che potresti voler aggiornare. Le impostazioni situate sotto la sezione [DEFAULT] vicino all’inizio del file verranno applicate a tutti i servizi supportati da Fail2ban. Altrove nel file, ci sono intestazioni per [sshd] e per altri servizi, che contengono impostazioni specifiche del servizio che si applicheranno sopra le impostazioni predefinite.

/etc/fail2ban/jail.local
[DEFAULT]
. . .
bantime = 10m
. . .

Il parametro bantime imposta la durata del tempo per cui un client verrà bandito quando non riesce ad autenticarsi correttamente. Questo è misurato in secondi. Per impostazione predefinita, è impostato su 10 minuti.

/etc/fail2ban/jail.local
[DEFAULT]
. . .
findtime = 10m
maxretry = 5
. . .

I prossimi due parametri sono findtime e maxretry. Questi lavorano insieme per stabilire le condizioni sotto le quali un client viene considerato un utente illegittimo che dovrebbe essere bandito.

La variabile maxretry imposta il numero di tentativi che un client ha per autenticarsi entro una finestra temporale definita da findtime, prima di essere bandito. Con le impostazioni predefinite, il servizio fail2ban bandirà un client che tenta senza successo di accedere 5 volte entro una finestra temporale di 10 minuti.

/etc/fail2ban/jail.local
[DEFAULT]
. . .
destemail = root@localhost
sender = root@<fq-hostname>
mta = sendmail
. . .

Se hai bisogno di ricevere avvisi via email quando Fail2ban interviene, dovresti valutare le impostazioni destemail, sendername e mta. Il parametro destemail imposta l’indirizzo email che dovrebbe ricevere i messaggi di ban. Il sendername imposta il valore del campo “Da” nell’email. Il parametro mta configura quale servizio di posta verrà utilizzato per inviare la posta. Per impostazione predefinita, questo è sendmail, ma potresti voler usare Postfix o un’altra soluzione di posta.

/etc/fail2ban/jail.local
[DEFAULT]
. . .
action = $(action_)s
. . .

Questo parametro configura l’azione che Fail2ban intraprende quando vuole istituire un divieto. Il valore action_ è definito nel file poco prima di questo parametro. L’azione predefinita è aggiornare la configurazione del firewall per rifiutare il traffico dall’host offensivo fino a quando non scade il tempo di divieto.

Sono disponibili altri script action_ forniti per impostazione predefinita che puoi sostituire con $(action_) sopra:

/etc/fail2ban/jail.local
…
# vietare e inviare un'email con il report whois alla destemail.
action_mw = %(action_)s
            %(mta)s-whois[sender="%(sender)s", dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"]

# vietare e inviare un'email con il report whois e le linee di log rilevanti
# alla destemail.
action_mwl = %(action_)s
             %(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]

# Vedi la nota IMPORTANTE in action.d/xarf-login-attack per sapere quando utilizzare questa azione
#
# vietare e inviare un'email xarf al contatto di abuso dell'indirizzo IP e includere le linee di log rilevanti
# alla destemail.
action_xarf = %(action_)s
             xarf-login-attack[service=%(__name__)s, sender="%(sender)s", logpath="%(logpath)s", port="%(port)s"]

# vietare l'IP su CloudFlare e inviare un'email con il report whois e le linee di log rilevanti
# alla destemail.
action_cf_mwl = cloudflare[cfuser="%(cfemail)s", cftoken="%(cfapikey)s"]
                %(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]
…

Per esempio, action_mw esegue un’azione e invia un’email, action_mwl esegue un’azione, invia un’email e include la registrazione, e action_cf_mwl fa tutto quanto sopra oltre ad inviare un aggiornamento all’API di Cloudflare associata al tuo account per vietare anche l’offensore lì.

Impostazioni Jail Individuali

Successivamente è riportata la parte del file di configurazione che tratta dei singoli servizi. Questi sono specificati da intestazioni di sezione, come [sshd].

Ogni di queste sezioni deve essere abilitata singolarmente aggiungendo una linea enabled = true sotto l’intestazione, con le relative altre impostazioni.

/etc/fail2ban/jail.local
[jail_to_enable]
. . .
enabled = true
. . .

Per impostazione predefinita, il servizio SSH è abilitato e tutti gli altri sono disabilitati.
.
Alcune altre impostazioni che sono impostate qui sono il filter che verrà utilizzato per decidere se una riga in un log indica un’autenticazione fallita e il logpath che indica a fail2ban dove sono situati i log per quel particolare servizio.

Il valore filter è effettivamente un riferimento a un file situato nella directory /etc/fail2ban/filter.d, con la sua estensione .conf rimossa. Questi file contengono espressioni regolari (un abbreviazione comune per l’analisi del testo) che determinano se una riga nel log è un tentativo di autenticazione fallito. 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 guardando in quella directory:

  1. ls /etc/fail2ban/filter.d

Se vedi un file che sembra 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 almeno capire quale tipo di condizione lo script è stato progettato per proteggere. 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, immagina di essere in esecuzione un sito web utilizzando Nginx e ti accorgi che una parte protetta da password del tuo sito sta ricevendo un numero elevato di tentativi di accesso. Puoi 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 è già configurato in una sezione chiamata [nginx-http-auth] nel tuo file /etc/fail2ban/jail.conf. Dovresti solo aggiungere il parametro enabled:

/etc/fail2ban/jail.local
. . .
[nginx-http-auth]

enabled = true
. . .

Quando hai finito di modificare, salva e chiudi il file. A questo punto, puoi abilitare il servizio Fail2ban in modo che si avvii automaticamente da ora in poi. Prima, esegui systemctl enable:

  1. sudo systemctl enable fail2ban

Quindi, avvialo manualmente per la prima volta con systemctl start:

  1. sudo systemctl start fail2ban

Puoi verificare che stia funzionando con systemctl status:

  1. sudo systemctl status fail2ban
Output
● fail2ban.service - Fail2Ban Service Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enab> Active: active (running) since Tue 2022-06-28 19:29:15 UTC; 3s ago Docs: man:fail2ban(1) Main PID: 39396 (fail2ban-server) Tasks: 5 (limit: 1119) Memory: 12.9M CPU: 278ms CGroup: /system.slice/fail2ban.service └─39396 /usr/bin/python3 /usr/bin/fail2ban-server -xf start Jun 28 19:29:15 fail2ban20 systemd[1]: Started Fail2Ban Service. Jun 28 19:29:15 fail2ban20 fail2ban-server[39396]: Server ready

Nel prossimo passaggio, dimostrerai Fail2ban in azione.

Passaggio 3 — Test delle politiche di bando (Opzionale)

Da un altro server, uno che non dovrà accedere al tuo server Fail2ban in futuro, puoi testare le regole ottenendo il ban di quel secondo server. Dopo esserti connesso al tuo secondo server, prova a connetterti via SSH al server Fail2ban. Puoi provare a connetterti utilizzando un nome inesistente:

  1. ssh blah@your_server

Inserisci caratteri casuali nel prompt della password. Ripeti questo alcune volte. A un certo punto, l’errore che stai ricevendo dovrebbe cambiare da Permesso negato a Connessione rifiutata. Questo segnala che il tuo secondo server è stato bannato dal server Fail2ban.

Sul tuo server Fail2ban, puoi vedere la nuova regola controllando l’output di iptables. iptables è un comando per interagire con regole di porta e firewall a livello basso sul tuo server. Se hai seguito la guida di DigitalOcean per la configurazione iniziale del server, userai ufw per gestire le regole del firewall a un livello più alto. Eseguire iptables -S ti mostrerà tutte le regole del firewall che ufw ha già creato:

  1. sudo iptables -S
Output
-P INPUT DROP -P FORWARD DROP -P OUTPUT ACCEPT -N f2b-sshd -N ufw-after-forward -N ufw-after-input -N ufw-after-logging-forward -N ufw-after-logging-input -N ufw-after-logging-output -N ufw-after-output -N ufw-before-forward -N ufw-before-input -N ufw-before-logging-forward -N ufw-before-logging-input -N ufw-before-logging-output …

Se reindirizzi l’output di iptables -S a grep per cercare all’interno di quelle regole la stringa f2b, puoi vedere le regole che sono state aggiunte da fail2ban:

  1. sudo iptables -S | grep f2b
Output
-N f2b-sshd -A INPUT -p tcp -m multiport --dports 22 -j f2b-sshd -A f2b-sshd -s 134.209.165.184/32 -j REJECT --reject-with icmp-port-unreachable -A f2b-sshd -j RETURN

La riga contenente REJECT --reject-with icmp-port-unreachable sarà stata aggiunta da Fail2ban e dovrebbe riflettere l’indirizzo IP del tuo secondo server.

Conclusione

Ora dovresti essere in grado di configurare alcune politiche di divieto per i tuoi servizi. Fail2ban è un modo utile per proteggere qualsiasi tipo di servizio che utilizza l’autenticazione. Se desideri saperne di più su come funziona fail2ban, puoi consultare il nostro tutorial su come funzionano le regole e i file di fail2ban.

Per informazioni su come utilizzare fail2ban per proteggere altri servizi, puoi leggere su Come proteggere un server Nginx con Fail2Ban su Ubuntu 14.04 e Come proteggere un server Apache con Fail2Ban su Ubuntu 14.04.

Source:
https://www.digitalocean.com/community/tutorials/how-to-protect-ssh-with-fail2ban-on-ubuntu-20-04