Introduzione
SSH è il metodo predefinito per connettersi a un server cloud. È resistente e estensibile: con lo sviluppo di nuovi standard di crittografia, è possibile generare nuove chiavi SSH, garantendo che il protocollo di base rimanga sicuro. Tuttavia, nessun protocollo o stack software è totalmente infallibile, e dato che SSH è così ampiamente diffuso su Internet, rappresenta una superficie di attacco molto prevedibile o un vettore di attacco attraverso il quale le persone possono cercare di ottenere accesso.
Qualsiasi servizio esposto alla rete è un potenziale bersaglio in questo modo. Se si controllano i log del servizio SSH in esecuzione su un server molto frequentato, spesso si vedranno tentativi di accesso ripetuti e sistematici che rappresentano attacchi brute force sia da parte degli utenti che dei bot. Anche se è possibile apportare alcune ottimizzazioni al servizio SSH per ridurre al minimo la possibilità che tali attacchi riescano, come disabilitare l’autenticazione tramite password a favore delle chiavi SSH, possono comunque rappresentare una minore responsabilità continua.
Le implementazioni di produzione su larga scala per le quali questa responsabilità è completamente inaccettabile di solito implementeranno una VPN come WireGuard di fronte al proprio servizio SSH, in modo che sia impossibile connettersi direttamente alla porta SSH predefinita 22 dall’esterno senza ulteriori astrazioni software o gateway. Queste soluzioni VPN sono ampiamente affidabili, ma aggiungeranno complessità e potrebbero interrompere alcune automazioni o altri piccoli collegamenti software.
Prima di impegnarsi o in aggiunta a configurare completamente una VPN, è 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. Questo consentirà al 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 22.04.
Prerequisiti
Per completare questa guida, avrai bisogno di:
-
Un server Ubuntu 22.04 e un utente non root con privilegi sudo. Puoi apprendere di più su come configurare un utente con questi privilegi nella nostra guida Configurazione Iniziale del Server con Ubuntu 22.04.
-
Opzionalmente, un secondo server al quale puoi connetterti dal tuo primo server, che utilizzerai per testare l’essere deliberatamente bandito.
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 di pacchetti e installare Fail2ban:
Fail2ban configurerà automaticamente un servizio in background dopo l’installazione. Tuttavia, è disabilitato per impostazione predefinita, poiché alcune delle sue impostazioni predefinite potrebbero causare effetti indesiderati. Puoi verificarlo utilizzando il comando systemctl
:
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 Fail2ban immediatamente, ma prima, esaminerai alcune delle sue caratteristiche.
Passo 2 — Configurazione di Fail2ban
Il servizio fail2ban conserva i suoi file di configurazione nella directory /etc/fail2ban
. C’è un file con le impostazioni predefinite chiamato jail.conf
. Vai in quella directory e stampa le prime 20 righe di quel file usando head -20
:
Output#
# AVVERTENZA: pesantemente ristrutturato nella versione 0.9.0. Si prega di rivedere e
# personalizzare le impostazioni per la propria configurazione.
#
# Cambiamenti: nella maggior parte dei casi non è necessario modificare questo
# file, ma fornire personalizzazioni nel file jail.local,
# o file .conf separati nella directory jail.d/, ad esempio:
#
# COME ATTIVARE LE 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 tempo di bando predefinito per tutte le carceri e per abilitare il
# jail ssh-iptables il seguente (non commentato) apparirebbe nel file .local.
# Vedere il manuale 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 interpretate come documentazione anziché come impostazioni. Come vedrai anche, questi commenti ti indicano 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à aggiornato periodicamente quando Fail2ban stesso verrà 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
:
Ora puoi iniziare a fare modifiche alla configurazione. Apri il file in nano
o nel tuo editor di testo preferito:
Mentre scorri 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.
[DEFAULT]
. . .
bantime = 10m
. . .
Il parametro bantime
imposta la durata del tempo in cui un client sarà bandito quando non sarà riuscito ad autenticarsi correttamente. Questo viene misurato in secondi. Per impostazione predefinita, è impostato su 10 minuti.
[DEFAULT]
. . .
findtime = 10m
maxretry = 5
. . .
I prossimi due parametri sono findtime
e maxretry
. Questi lavorano insieme per stabilire le condizioni in base alle 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 un intervallo di tempo definito da findtime
, prima di essere bandito. Con le impostazioni predefinite, il servizio fail2ban bandirà un client che tenta senza successo di effettuare il login 5 volte entro una finestra di 10 minuti.
[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 utilizzare Postfix o un’altra soluzione di posta.
[DEFAULT]
. . .
action = $(action_)s
. . .
Questo parametro configura l’azione che Fail2ban intraprende quando vuole istituire un ban. Il valore action_
è definito nel file poco prima di questo parametro. L’azione predefinita è aggiornare la configurazione del firewall per respingere il traffico dall’host in questione fino a quando il tempo di ban non scade.
Sono disponibili altri script action_
forniti per impostazione predefinita che puoi sostituire con $(action_)
:
…
# vietare e inviare un'e-mail con il rapporto whois al destemail.
action_mw = %(action_)s
%(mta)s-whois[sender="%(sender)s", dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"]
# vietare e inviare un'e-mail con il rapporto whois e le linee di registro rilevanti
# al destemail.
action_mwl = %(action_)s
%(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]
# Consultare la nota IMPORTANTE in action.d/xarf-login-attack per sapere quando utilizzare questa azione
#
# vietare e inviare un'e-mail xarf al contatto di abuso dell'indirizzo IP e includere linee di registro rilevanti
# al 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'e-mail con il rapporto whois e le linee di registro rilevanti
# al 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"]
…
Ad esempio, action_mw
esegue un’azione e invia un’e-mail, action_mwl
esegue un’azione, invia un’e-mail e include il registro, e action_cf_mwl
fa tutto quanto sopra oltre a inviare un aggiornamento all’API di Cloudflare associata al tuo account per vietare l’offensore anche lì.
Impostazioni individuali della prigione
Di seguito è riportata la parte del file di configurazione che tratta i servizi individuali. Questi sono specificati da intestazioni di sezione, come [sshd]
.
Ogni sezione di queste deve essere abilitata singolarmente aggiungendo una riga enabled = true
sotto l’intestazione, con le altre impostazioni.
[jail_to_enable]
. . .
enabled = true
. . .
Per impostazione predefinita, il servizio SSH è abilitato e tutti gli altri sono disabilitati.
Alcune altre impostazioni che vengono configurate qui sono il filter
che verrà utilizzato per decidere se una riga in un registro indica un’autenticazione fallita e il logpath
che indica a fail2ban dove si trovano i registri per quel servizio specifico.
Il valore filter
è in realtà un riferimento a un file situato nella directory /etc/fail2ban/filter.d
, con l’estensione .conf
rimossa. Questi file contengono espressioni regolari (un acronimo comune per l’analisi del testo) che determinano se una riga nel registro è 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, è possibile vedere quali filtri sono disponibili guardando in quella directory:
Se si vede un file che sembra correlato a un servizio che si sta utilizzando, è opportuno aprirlo con un editor di testo. La maggior parte dei file è abbastanza ben commentata e dovreste essere in grado di capire almeno che 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 desiderato.
Ad esempio, immagina di essere in servizio su un sito web utilizzando Nginx e ti rendi conto che una parte del tuo sito protetta da password sta ricevendo numerosi tentativi di accesso. Puoi dire a fail2ban di utilizzare il file nginx-http-auth.conf
per controllare 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
:
. . .
[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 d’ora in poi. Prima, esegui systemctl enable
:
Quindi, avvialo manualmente per la prima volta con systemctl start
:
Puoi verificare che sia in esecuzione con systemctl status
:
Output● fail2ban.service - Fail2Ban Service
Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enab>
Active: active (running) since Mon 2022-06-27 19:25: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 27 19:25:15 fail2ban22 systemd[1]: Started Fail2Ban Service.
Jun 27 19:25:15 fail2ban22 fail2ban-server[39396]: Server ready
Nel prossimo passaggio, dimostrerai il funzionamento di Fail2ban.
Passaggio 3 — Test delle Politiche di Blocco (Opzionale)
Da un altro server, uno che non avrà bisogno di accedere al tuo server Fail2ban in futuro, puoi testare le regole ottenendo che il secondo server venga bloccato. Dopo aver effettuato l’accesso al tuo secondo server, prova ad effettuare il login tramite SSH nel server Fail2ban. Puoi provare a connetterti utilizzando un nome inesistente:
Inserisci caratteri casuali nel prompt della password. Ripeti questo alcune volte. Ad un certo punto, l’errore che ricevi 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 le regole di porta e firewall a basso livello 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. Eseguendo iptables -S
ti mostrerà tutte le regole del firewall che ufw
ha già creato:
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 inoltri 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:
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 bannaggio 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-22-04