====== fail2ban ======
Si tratta di un programma che tiene sotto monitoraggio alcuni file di log, quando rileva dei tentativi falliti e ripetuti di accedere ad un servizio, blocca l'host incriminato a livello di indirizzo IP, aggiungendo delle opportune regole **iptables**.
Appena si installa il pacchetto vengono automaticamente abilitate delle regole, ad esempio per bloccare gli IP che falliscono l'accesso ssh.
Con Debian che utilizza Systemd (cioè dalla release 8 Jessie), è possibile avviare (o fermare, o disabilitare) il servizio con comandi del tipo:
systemctl start fail2ban.service
===== Integrazione con shorewall =====
La configurazione predefinita del pacchetto Debian prevede che l'azione di bloccare un determinato indirizzo IP venga effettuato con una opportuna regola **iptables** aggiunta a runtime. Se si è installato un gestore di iptables, come ad esempio **Shorewall**, è necessario cambiare la configurazione di fail2ban in modo che l'azione di ban e unban sia coerente con il sistema Shorewall.
Le impostazioni predefinite sono generalmente in ''/etc/fail2ban/jail.conf''. La personalizzazione può essere fatta in un file **/etc/fail2ban/jail.d/custom.local**. L'estensione .local fa sì che il file venga letto dopo i file .conf e che le sue impostazioni sostituiscano i default (a parità di estensione viene considerato anche l'ordine alfabetico). In questo file si possono configurare alcune delle impostazioni generali che vanno a
[DEFAULT]
ignoreip = 185.211.173.7 127.0.0.1/8 ::1
bantime = 3600
findtime = 60
maxretry = 10
destemail = sysadmin@rigacci.org
sender = sysadmin@rigacci.org
banaction = shorewall
banaction_allports = shorewall
====== fail2ban-client 0.11 ======
Il programma di controllo del servizio è **fail2ban-client**. La versione **0.11.2** fornita da Debian 11 Bullseye supporta la seguente sintassi (che è notevolmente diversa ad esempio dalla versione 0.9.6 fornita con Debian 9 Stretch).
fail2ban-client status
fail2ban-client banned
fail2ban-client unban 172.105.41.121
Per vedere lo stato di un jail:
fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 9
| |- Total failed: 18338
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 6
|- Total banned: 413
`- Banned IP list: 182.72.235.172 41.226.27.59 45.88.8.95 94.23.149.231
È possibile anche entrare nel dettaglio delle azioni configurate per un certo //jail// (il servizio monitorato che può essere bloccato). Ad esempio per il servizio sshd si scopre che è stata configurata l'azione **iptables-multiport**:
fail2ban-client get sshd actions
The jail sshd has the following actions:
iptables-multiport
È possibile anche sapere quale azione effettiva corrisponde ad esempio ad //actionban// se l'action è //iptables-multiport//:
fail2ban-client get sshd action iptables-multiport actionban
-I f2b-sshd 1 -s -j
====== fail2ban-client 0.9 ======
:!: **ATTENZIONE**! Questa sintassi è obsoleta, dalla versione 0.10 di Fail2ban (fornita con Debian 10 Buster) si deve usare la nuova sintassi.
Il demone si controlla tramite **''fail2ban-client''** (che usa il socket ''/var/run/fail2ban/fail2ban.sock''). Per vedere quali servizi sono monitorati e lo **stato di ciascun servizio**:
fail2ban-client status
fail2ban-client status ssh
Per **sbloccare** qualcuno ad esempio dal servizio ssh (**ATTENZIONE!** funziona solo dalla **versione 8.8** in poi):
fail2ban-client set ssh unbanip 151.40.102.53
Con le **versioni precedenti** si può interrogare Fail2ban su quale è l'azione per sbloccare un indirizzo IP, e quindi eseguirla manualmente. Purtroppo si deve conoscere il nome del **jail** e la **banaction**. La via più rapida è consultare il file di configurazione. Quindi si esegue:
fail2ban-client get asterisk-iptables actionunban iptables-allports
iptables -D fail2ban- -s -j DROP
In questo caso si ottiene il **comando iptables** necessario a rimuovere il blocco.
Il tempo di ban predefinito è 600 secondi (''bantime'' in **''/etc/fail2ban/jail.conf''**). Per modificare le impostazioni predefinite non si deve toccare i file di configurazione forniti, ma aggiungere le differenze in **''/etc/fail2ban/jail.local''**.
Ecco alcune impostazioni da mettere:
[DEFAULT]
ignoreip = 185.21.73.97 192.168.1.0/24
Per escludere un servizio dal controllo:
[ssh]
enabled = false
I file **.local** modificano le eventuali impostazioni dei file **.conf**.
**ATTENZIONE:** fail2ban cerca nei file di log i tentativi falliti, quindi applica delle regole predefinite di blocco. Se si personalizzano alcuni servizi - ad esempio utilizzando delle **porte IP non standard** - si corre il rischio che il blocco non sia effettivo, controllare la definizione del servizio (ad esempio il parametro ''port'') ed eventualmente ridefinirlo.
===== Altre configurazioni =====
In **''/etc/fail2ban/jail.conf''** si può indicare uno o più indirizzi IP whitelisted nella sezione ''[Default]'':
[DEFAULT]
ignoreip = 127.0.0.1 62.48.51.8
===== Logging e reporting =====
La configurazione va in **''/etc/fail2ban/jail.conf''**. Per ogni indirizzo IP bannato viene inviata una mail all'indirizzo indicato:
destemail = support@texnet.it
===== Servizio personalizzato Apache mod_evasive =====
Supponiamo di voler aggiungere delle regole che reagiscono agli allarmi del modulo Apache [[http://www.zdziarski.com/projects/mod_evasive/|mod_evasive]].
Anzitutto si configura il modulo Apache (in ''/etc/apache2/mods-available/evasive.conf'' oppure in un VirtualHost):
DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 10
#DOSEmailNotify you@yourdomain.com
DOSSystemCommand "/usr/local/sbin/apache-evasive %s"
DOSLogDir "/var/lock/mod_evasive"
#DOSWhitelist 127.0.0.*
**ATTENZIONE:** nella directory **DOSLogDir** viene creato un file di lock per ogni IP bloccato; la notifica via mail e il comando **DOSSystemCommand** vengono eseguiti solo la prima volta, è necessario rimuovere il file di lock prima che questi vengano eseguiti nuovamente. In genere sarà lo stesso ''DOSSystemCommand'' oppure un cronjob ad effettuare l'oprazione di rilascio lock.
Si crea il file **''/etc/fail2ban/filter.d/apache-mod_evasive.local''**:
[Definition]
# regex to match the Forbidden log entrys in apache error.log provided by mod_evasive
failregex = \[evasive20:error\].*\[client :\d+\] client denied by server configuration:
# regex to ignore. If this regex matches, the line is ignored.
ignoreregex =
Per testare una espressione regolare su un file di log si può usare il comando:
fail2ban-regex /var/log/apache2/error.log
Quindi si attiva il servizio in **''/etc/fail2ban/jail.local''**:
[apache-mod_evasive]
enabled = true
port = http,https
filter = apache-mod_evasive
banaction = iptables-new-multiport
#banaction = shorewall
logpath = /var/log/apache2/*/error.log
bantime = 600
maxretry = 1
Il parametro **filter** deve corrispondere al nome di un file in **''/etc/fail2ban/filter.d/''** con estensione **.local**. Il parametro **banaction** deve corrispondere ad un'azione contenuta in **''/etc/fail2ban/action.d/''**, quella predefinita è ''iptables-multiport''.
Può essere conveniente definirne un'azione personalizzata **''iptables-new-multiport.local''** prendendo spunto dalla ''iptables-new.conf'' (che blocca solo le connessioni nuove) aggiungendo l'opzione ''-m multiport'' di ''iptables''.
Nel caso in cui si utilizzi Shorewall come firewall, è interessante l'integrazione fornita dall'azione ''shorewall'', vedere i commenti in ''/etc/fail2ban/action.d/shorewall.conf''.
===== Jail reference =====
^ enabled | true o false |
^ filter | Nome del filtro da usare, cioè del file in **''/etc/fail2ban/filter.d/''** (senza l'estensione ''.conf'' o ''.local''). |
^ port | Porta o elenco di porte separate da virgola da bloccare. Porte multiple richiedono l'azione **iptables-multiport**. |
^ action | Azione usata per bloccare l'aggressore, cioè il file in **''/etc/fail2ban/action.d/''** (senza l'estensione ''.conf''). Una delle azioni più utili è ''iptables-multiport''. |
^ logpath | File di log da osservare. |
^ maxretry | Numero di corrispondenze che fanno scattare il ban. |
^ findtime | Il contatore viene azzerato dopo alcuni secondi senza corrispondenze. |
^ bantime | Durata del ban in secondi. |
===== Reference configurazione predefinita =====
^ Nome ^ Contesto ^ Note ^
^ action | Jail |Indica quale script eseguire quando si deve bloccare o sbloccare un aggressore. Gli script sono quelli presenti in **/etc/fail2ban/action.d/** e vanno indicati senza l'estensione .conf o .local. Ogni jail può avere una o più //action// da eseguire. In generale non si indica direttamente lo script, ma una variabile del tipo **%%%(var_name)s%%**. Nella configurazione predefinita si utilizza la variabile **action_**. |
^ action_* | Jail | Variabili che definisco varie azioni possibili, da utilizzare quando necessario. Nella configurazione predefinita troviamo alcune definizioni:\\ **action_**: solo ban\\ **action_mw**: ban, mail con whois\\ **action_mwl**: ban, mail con whois e log\\ **action_xarf**: ban, mail to abuse contact\\ ...\\ Nella configurazione predefinita queste variabili non fanno direttamente riferimento agli script da eseguire, ma ad altre variabili. |
^ banaction | Jail | Nella configurazione predefinita è una variabile utilizzata dalle varie **%%action_*%%** e contiene finalmente il nome effettivo dello script da eseguire. Secondo la configurazione predefinita, il valore nella sezione **[DEFAULT]** è **iptables-multiport**. |
^ banaction_allports | Jail | Altra variabile utilizzata nella catena di sostituzioni della **action**. Secondo la configurazione predefinita, il valore nella sezione **[DEFAULT]** è **iptables-allports**. |
^ actionban | Action | È la sezione di uno script ti tipo //action// (nella directory **/etc/fail2ban/action.d/**) che definisce le azioni da intraprendere per bloccare un IP. |
^ actionunban | Action | Azioni che sbloccano in indirizzo IP, annullando l'effetto di //actionban//. |
===== Esempio per WordPress wp-login.php =====
Un caso tipico di attacco a forza bruta è quello contro il login di WordPress, nei file di log Apache si legge il tentativo che può essere in GET oppure in POST:
185.120.86.118 - - [21/Jul/2022:11:00:25 +0200] "GET /wp/wp-login.php HTTP/1.1" 200 7004 ...
185.120.86.118 - - [21/Jul/2022:11:00:26 +0200] "POST /wp/wp-login.php HTTP/1.1" 200 7373 ...
In questo caso si agisce sull'accesso al file **wp-login.php** indipendentemente dal fatto che il login abbia successo o meno (i due casi non sono distinguibili nei log). Si definisce anzitutto una regola di controllo log creando il file **/etc/fail2ban/filter.d/wordpress-local.conf**:
[Definition]
failregex = ^ .* "POST .*wp-login.php
^ .* "POST .*xmlrpc.php
^ .* "GET .*wp-login.php
^ .* "GET .*xmlrpc.php
ignoreregex =
Come si vede si approfitta per bloccare anche gli accessi a **xmlrpc.php**, un altro vettore comune di attacco a WordPress (fra l'altro il protocollo XML-RPC è da considerarsi obsoleto e rimpiazzato dalle API native di WordPress).
Quindi si definisce la regola di ban creando il file **/etc/fail2ban/jail.d/wordpress-local.conf**:
[wordpress]
enabled = true
usedns = no
port = http,https
filter = wordpress-local
logpath = /var/log/apache2/*/access.log
maxretry = 4
findtime = 120
bantime = 7200
Dopo aver fatto il reload del servizio fail2ban, chi accede a ''wp-login.php'' per più di 4 volte in 2 minuti verrà bloccato per 2 ore.