Come installare e configurare Fail2ban su Linux
Fail2ban è un software gratuito e open source che possiamo utilizzare per mitigare gli attacchi di forza bruta e DoS/DDoS: scansiona i file di registro per più tentativi di autenticazione falliti e vieta i relativi indirizzi IP creando regole firewall ad hoc.
In questo tutorial vediamo come installare e configurare fail2ban su Linux e apprendiamo i concetti di base dietro il suo utilizzo.
In questo tutorial imparerai:
- Come installare Fail2ban su alcune delle distribuzioni Linux più utilizzate
- Come configurare Fail2ban
- Come utilizzare l'utilità fail2ban-client
Installazione
Fail2ban è disponibile nei repository ufficiali di tutte le distribuzioni Linux più utilizzate. Per installarlo su Debian e distribuzioni basate su Debian, possiamo usare il seguente comando:
$ sudo apt install fail2ban
Su Fedora eseguiamo l'installazione con il gestore pacchetti dnf
:
$ sudo dnf install fail2ban
Prima di poter eseguire l'installazione su RHEL o su uno dei suoi cloni come Rocky Linux, dobbiamo aggiungere il repository EPEL (Extra Package for Enterprise Linux) come fonte software. Nel caso di Rocky si tratta di un'operazione molto semplice, poiché il repository viene configurato automaticamente quando installiamo il pacchetto epel-release
:
$ sudo dnf install epel-release
Se si utilizza RHEL stesso, il pacchetto può essere scaricato e installato dal sito EPEL.
Per garantire che il servizio fail2ban sia attivo e avviato all'avvio, lanciamo il seguente comando:
$ sudo systemctl enable --now fail2ban
Configurazione Fail2ban
Una volta installato il pacchetto Fail2ban, tutti i suoi file di configurazione possono essere trovati nella directory /etc/fail2ban
. Dovremmo evitare di modificare i file che fanno parte dell'installazione (quelli con l'estensione ".conf") e inserire invece configurazioni personalizzate nei file corrispondenti con l'estensione ".local". Il file di configurazione principale di fail2ban è /etc/fail2ban/fail2ban.conf
. Questo file contiene impostazioni generiche, come il livello di registro fail2ban. Inseriamo i valori di override nel file /etc/fail2ban/fail2ban.local
, che dovrebbe essere creato se non esiste. Per cambiare il livello di log da “INFO” (il default) a “DEBUG”, ad esempio, dovremmo scrivere:
[DEFAULT]
loglevel = DEBUG
Ci sono tre “entità” principali con cui dobbiamo avere a che fare quando lavoriamo con Fail2ban: filtri, azioni e jail. Diamo un’occhiata a loro.
Filtri
Fail2ban esegue la scansione dei file di registro e cerca tentativi di autenticazione non riusciti. Con i filtri in pratica gli spieghiamo come riconoscere i tentativi di autenticazione nei file di registro di servizi specifici. I filtri pronti all'uso possono essere trovati nella directory /etc/fail2ban/filter.d
:
$ ls /etc/fail2ban/filter.d
3proxy.conf domino-smtp.conf mysqld-auth.conf selinux-ssh.conf
apache-auth.conf dovecot.conf nagios.conf sendmail-auth.conf
apache-badbots.conf dropbear.conf named-refused.conf sendmail-reject.conf
apache-botsearch.conf drupal-auth.conf nginx-botsearch.conf sieve.conf
apache-common.conf ejabberd-auth.conf nginx-http-auth.conf slapd.conf
apache-fakegooglebot.conf exim-common.conf nginx-limit-req.conf softethervpn.conf
apache-modsecurity.conf exim.conf nsd.conf sogo-auth.conf
apache-nohome.conf exim-spam.conf openhab.conf solid-pop3d.conf
apache-noscript.conf freeswitch.conf openwebmail.conf squid.conf
apache-overflows.conf froxlor-auth.conf oracleims.conf squirrelmail.conf
apache-pass.conf gitlab.conf pam-generic.conf sshd.conf
apache-shellshock.conf grafana.conf perdition.conf stunnel.conf
assp.conf groupoffice.conf phpmyadmin-syslog.conf suhosin.conf
asterisk.conf gssftpd.conf php-url-fopen.conf tine20.conf
bitwarden.conf guacamole.conf portsentry.conf traefik-auth.conf
botsearch-common.conf haproxy-http-auth.conf postfix.conf uwimap-auth.conf
centreon.conf horde.conf proftpd.conf vsftpd.conf
common.conf ignorecommands pure-ftpd.conf webmin-auth.conf
counter-strike.conf kerio.conf qmail.conf wuftpd.conf
courier-auth.conf lighttpd-auth.conf recidive.conf xinetd-fail.conf
courier-smtp.conf mongodb-auth.conf roundcube-auth.conf znc-adminlog.conf
cyrus-imap.conf monit.conf screensharingd.conf zoneminder.conf
directadmin.conf murmur.conf selinux-common.conf
Azioni
Le azioni Fail2ban sono definite nella directory /etc/fail2ban/action.d
. Le azioni prendono il nome dal software utilizzato per applicare il divieto. Vediamo un esempio. UFW (Uncomplicated Firewall) è un gestore firewall progettato per essere facile da usare; questo è il contenuto del file /etc/fail2ban/action.d/ufw.conf
:
# Fail2Ban action configuration file for ufw
#
# You are required to run "ufw enable" before this will have any effect.
#
# The insert position should be appropriate to block the required traffic.
# A number after an allow rule to the application won't be of much use.
[Definition]
actionstart =
actionstop =
actioncheck =
actionban = [ -n "<application>" ] && app="app <application>"
ufw insert from to $app
actionunban = [ -n "<application>" ] && app="app <application>"
ufw delete from to $app
[Init]
# Option: insertpos
# Notes.: The position number in the firewall list to insert the block rule
insertpos = 1
# Option: blocktype
# Notes.: reject or deny
blocktype = reject
# Option: destination
# Notes.: The destination address to block in the ufw rule
destination = any
# Option: application
# Notes.: application from sudo ufw app list
application =
Un'azione è composta da due sezioni principali: “Definizione” e “Init”. I comandi specificati nel primo vengono eseguiti in diverse situazioni: come passo preliminare (actioncheck), quando una jail inizia (actionstart), quando si ferma (actionstop), per bannare (actionban) e per sbloccare (actionunban) un indirizzo IP.
La sezione "Init" contiene configurazioni specifiche dell'azione. Nell'azione ufw che abbiamo riportato sopra, ad esempio, puoi vedere che contiene istruzioni sulla posizione della regola del firewall nell'elenco delle regole (insertpos=1) e sul tipo di blocco da utilizzare (rifiuta vs nega).
Prigioni
Infine, abbiamo le carceri. Una jail associa sostanzialmente un filtro e una o più azioni. Il file di configurazione principale di Fail2ban per le jail è /etc/fail2ban/jail.conf
; i file di configurazione drop-in possono essere posizionati nella directory /etc/fail2ban/jail.d
.
Le jail prendono il nome dal filtro che utilizzano: se una jail si chiama "sshd", ad esempio, è associata al filtro /etc/fail2ban/filter.d/sshd.conf
, a meno che non sia esplicitamente specificato tramite l'opzione “filtro”. Il nome della prigione è specificato tra parentesi quadre. Debian fornisce una sostituzione per la jail sshd per impostazione predefinita. È definito nel file /etc/fail2ban/jail.d/defaults-debian.conf
:
[sshd]
enabled = true
I parametri predefiniti per la jail "sshd" si trovano nel file di configurazione principale della jail. Debian fornisce questa sostituzione con il parametro "enabled" impostato su "true" solo per garantire che il jail sia attivo. Ecco alcuni parametri che possono essere utilizzati durante la definizione di una jail, o nella sezione “default” (valida per tutte le jail esistenti):
Option | Role | Default value |
---|---|---|
filter | Filter used by the jail | The filter corresponding to the jail name under /etc/fail2ban/filter.d |
logpath | Specifies the path(s) of the logfiles to be monitored | service-dependent |
action | Actions(s) to be used by the jail. Actions are named after the file in which they are defined, without the extension | %(action)s – see below |
ignoreip | List of IP addresses to ignore | None |
bantime | The ban duration expressed in seconds or with explicitly time suffixes | 10m |
findtime | The interval of time during which the specified number of failed authentication attempts must occur for an IP to be banned | 10m |
maxretry | The number of failures which must occur in the specified findtime to trigger a ban | 5 |
Come viene definita l'azione predefinita
Se dai un'occhiata al file di configurazione principale della jail (/etc/fail2ban/jail.conf
), nella sezione “default”, puoi vedere che l'azione è definita nel modo seguente (riga 268) :
action = %(action_)s
Nella definizione sopra la variabile _action
è “expanded” e il suo valore è assegnato al parametro “action”. La variabile _action
stessa è definita poche righe sopra (riga 212 su Debian):
action_ = __ %(banaction)s[port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
In questa espressione vengono utilizzate alcune altre variabili:
- banaction: questa è l'azione di ban “core”, impostata su iptables-multiport per impostazione predefinita
- port: le porte da bannare – impostate su 0:65535 per impostazione predefinita, per essere sovrascritte in jail specifiche
- protocollo: il protocollo utilizzato nella regola del firewall per applicare il divieto – tcp per impostazione predefinita
- catena: la catena in cui inserire i salti nelle azioni di ban che prevedono questo parametro
Le variabili porta, protocollo e catena vengono utilizzate tra parentesi quadre, separate da virgole. Con questa sintassi vengono passati come “argomenti” e sostituiscono i rispettivi segnaposto contenuti nella definizione dell'azione. Qui, "action_" è una delle macro disponibili, che impone semplicemente un divieto. Altri sono definiti di seguito. Alcuni esempi sono:
- action_mw – Applica il divieto e invia un'e-mail contenente un rapporto whois all'e-mail specificata
- action_mwl – Come sopra, ma include le righe di registro pertinenti
Veniamo bannati!
Verifichiamo che fail2ban funzioni correttamente e lasciamo che attivi un ban. Come abbiamo visto prima, il findtime predefinito è 10 minuti, e il valore maxretry predefinito è 5: questo significa che se falliamo 5 tentativi di autenticazione in 10 minuti, il nostro IP (192.168.122.1 per il bene di questo esempio) verrà bannato.
Provo a connettermi tramite SSH all'host con IP 192.168.122.93 fornendo di proposito una password errata. Ciò attiva il divieto dell'host remoto. Possiamo verificarlo dando un'occhiata al registro fail2ban:
$ sudo tail /var/log/fail2ban.log
Le righe pertinenti sono:
2023-09-27 15:54:47,028 fail2ban.actions
[2829]: NOTICE [sshd] Ban 192.168.122.1
Come puoi vedere, l'IP 192.168.122.1 è stato bannato. Un modo più conveniente per controllare tutti i ban attivi è utilizzare l'utility fail2ban-client. Per ottenere un elenco di IP bannati lo utilizziamo con il sottocomando “banned”:
$ fail2ban-client banned
[{'sshd': ['192.168.122.1']}]
Per sbloccare un IP (da tutte le jail), invece, lo passiamo come argomento al sottocomando unban
:
$ sudo fail2ban-client unban 192.168.122.1
L'utilità fail2ban-client può essere utilizzata anche per controllare il server (avviarlo, arrestarlo, ricaricarlo) ed eseguire alcune configurazioni di runtime.