User Tools

Site Tools


doc:appunti:linux:sa:fail2ban

This is an old revision of the document!


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.

Esiste un demone in esecuzione che può essere avviato/fermato con:

/etc/init.d/fail2ban {start|stop}

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-<name> -s <ip> -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 mod_evasive.

Anzitutto si configura il modulo Apache (in /etc/apache2/mods-available/evasive.conf oppure in un VirtualHost):

<IfModule mod_evasive20.c>
    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.*
</IfModule>

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 <HOST>:\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 <regex>

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.

Integrazione con Shorewall

La configurazione predefinita di fail2ban in Debian …FIXME

Nome Contesto Note
action Jail Indica quale script eseguire quando si deve bloccare 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
actionunban Action

Per modificare la configurazione predefinita si può aggiungere un file nella directory /etc/fail2ban/jail.d/, ad esempio 99_custom.local. Oltre all'ordine alfabetico, i file con estensione .local sono processati dopo quelli con estensione .conf; i parametri definiti dopo hanno la precedenza su quelli definiti prima.

[DEFAULT]
banaction = shorewall
banaction_allports = shorewall
doc/appunti/linux/sa/fail2ban.1604057867.txt.gz · Last modified: 2020/10/30 12:37 by niccolo