Ricerca nel sito web

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.

Conclusioni

Articoli correlati: