Snippet di codice per la gestione di Fail2Ban
Tabella dei contenuti
Breve guida all’uso di Fail2Ban, appunti personali con diversi snippet. Argomenti trattati in breve:
- Come creare filtri e jail Fail2Ban per i tentativi d’accesso ad un’applicazione web come Wallabag
- Come configurare una jail per gli IP recidivi
- Come ricevere un messaggio via telegram quando un IP viene bannato
- Come modificare le impostazioni predefinite
Installare ed abilitare fail2ban #
- Installare fail2ban
apt install fail2ban
- Abilitare il servizio
systemctl enable --now fail2ban
Controllare gli IP bloccati per ogni jail #
fail2ban-client status | sed -n 's/,//g;s/.*Jail list://p' | xargs -n1 fail2ban-client status
Scrivere una nuova regola per trovare tentativi di accesso da parte di bot #
Fail2Ban sfrutta prima dei file formattati per indicare come trovare i tentativi d’accesso falliti in un file di log, che chiameremo filtri (in /filters.d), poi sfrutta altri file per indicare come bloccare gli indirizzi IP dopo un certo numero di tentativi falliti, in delle jail (in /jail.d), questi file configurano le jail.
Per prima cosa, cd /etc/fail2ban
, la cartella di lavoro di fail2ban.
Serve un filtro che scannerizza i log (di systemd oppure file testuali) attraverso una regex per trovare linee che corrispondono a tentativi d’accesso falliti da parte di un IP.
Il filtro trova appunto queste linee e le comunica come “failed” alla jail.
Se i fallimenti di un IP sono più di un certo valore in un dato periodo di tempo, l’IP viene bannato.
Ogni filtro sta in /etc/fail2ban/filter.d/nomefiltro.conf
.
Creare un filtro #
Esempio: Creiamo il filtro wallabag2.conf
[INCLUDES]
before = common.conf
[Definition]
failregex = app.ERROR: Authentication failure for user "([\w]+)?", from IP "<HOST>"
ignoreregex =
In failregex
sta la regex che trova le linee contenenti le autenticazioni fallite, tutti gli IP trovati con in ignoreregex
saranno ignorati
NON cambiare
common.conf
, bensì crea un filecommon.local
per applicare modifiche locali.
Controllare se il filtro trova tentativi d’accesso #
Per controllare se questo filtro funziona, utilizziamo
fail2ban-regex [/path/file-di-log] [/path/filtro]
In seguito, se fail2ban-regex trova alcuni match di righe failed, significa che sono avvenuti dei tentativi d’accesso.
Possiamo creare un file di log falso con dei tentativi d’accesso falliti per testare questa regola con fail2ban-regex
.
# Esempio di test con file di log falso
touch /tmp/error-test.log
echo "[2022-01-23 12:04:53] app.ERROR: Authentication failure for user "admin", from IP "xxx.xxx.xxx.xxx", with UA: "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:96.0) Gecko/20100101 Firefox/96.0". [] []" >> /tmp/error/test.log
fail2ban-regex /tmp/error-test.log wallabag2
Attivare una jail per gli IP trovati da un filtro #
Continiuamo l’esempio riguardante l’identificazione degli IP che tentano di accedere a Wallabag tramite il filtro appena scritto.
Il file di configurazione per la jail degli IP si chiamerà wallabag2.conf
, non serve un nome particolare.
[wallabag2]
enabled = true
port = http,https
filter = wallabag2
logpath = /var/www/wallabag2/var/logs/prod.log
maxretry = 5
.conf
possono essere configurate più jail, ogni jail viene definita dalla riga [nome-jail]
, in questo caso [wallabag2]
enabled
, ovviamente, attiva il filtro.port
, corrisponde alle porte su cui l’indirizzo IP sarà bloccato.filter
indica il nome del filtro, se posizionato in/etc/fail2ban/filter.d
, altrimenti va bene anche il percorso. Se non viene dichiarato qua, sarà uguale alla variabile tra le parentesi quadre.logpath
indica il percorso dei file da interpretare attraverso il filtro. Io di solito aggiungo un bel*
alla fine siccome ho la rotazione dei log, tanto per stare sicuri.maxretry
è il numero massimo di tentativi.bantime
è il tempo in cui durerà il ban in secondi. Impostando-1
il ban è permanente.findtime
indica il tempo in cui è consentito ad un IP fallire fino amaxretry
.action
indica l’azione da intraprendere quando un IP viene bannato.
Modificare le impostazioni di jail predefinite. #
Come si può vedere, le impostazioni di jail predefinite, stanno in /etc/fail2ban/jail.conf/
. Come vediamo dalle righe presenti all’inizio del file
Provide customizations in a jail.local file or a jail.d/customisation.local.
Per applicare i nostri cambiamenti, creiamo il file jail.d/customisation.local
; meglio non toccare /etc/fail2ban/jail.conf/
, sia perché potrebbe cambiare dopo un aggiornamento sia perché nel caso di un errore nella nostra configurazione, basterà -nello scenario peggiore- eliminare customisation.local
dunque tornare alle impostazioni predefinite contenute in jail.conf
.
[sshd]
enabled = true
logpath = /var/log/auth.log*
[DEFAULT]
bantime = 600
findtime = 600
maxretry = 3
backend = auto
usedns = warn
Attivare una jail per gli IP recidivi #
Gli IP che sono presenti nel log di Fail2Ban come IP bannati saranno analizzati da un filtro di Fail2Ban stesso ed inseriti in una jail apposita.
Nel mio caso, una volta che un IP viene bannato per tre volte - dunque quando è recidivo, il bantime
invece di 600 secondi sale ad 864000 secondi (10 giorni).
File del filtro: filter.d/recidive.conf
# Fail2Ban filter for repeat bans
#
# This filter monitors the fail2ban log file, and enables you to add long
# time bans for ip addresses that get banned by fail2ban multiple times.
#
# Reasons to use this: block very persistent attackers for a longer time,
# stop receiving email notifications about the same attacker over and
# over again.
#
# This jail is only useful if you set the 'findtime' and 'bantime' parameters
# in jail.conf to a higher value than the other jails. Also, this jail has its
# drawbacks, namely in that it works only with iptables, or if you use a
# different blocking mechanism for this jail versus others (e.g. hostsdeny
# for most jails, and shorewall for this one).
[INCLUDES]
# Read common prefixes. If any customizations available -- read them from
# common.local
before = common.conf
[Definition]
_daemon = fail2ban\.actions\s*
# The name of the jail that this filter is used for. In jail.conf, name the
# jail using this filter 'recidive', or change this line!
_jailname = recidive
failregex = ^(%(__prefix_line)s| %(_daemon)s%(__pid_re)s?:\s+)NOTICE\s+\[(?!%(_jailname)s\])(?:.*)\]\s+Ban\s+<HOST>\s*$
ignoreregex =
[Init]
journalmatch = _SYSTEMD_UNIT=fail2ban.service PRIORITY=5
# Author: Tom Hendrikx, modifications by Amir Caspi
Righe aggiunte per definire la jail, per esempio a jail.d/my-jails.conf
[recidive] # Nome della Jail
enabled = true
maxretry = 3
findtime = 86400
bantime = 864000
banaction = %(banaction_allports)s
action = telegram[name=RECIDIVO]
Azione per inviare un messaggio Telegram quando un IP viene bannato #
C’è anche un altro tipo di file interessante. che configura l’azione da prendere una volta bloccato l’IP. Questo file viene invocato con la riga action
nei file della configurazione della jail, una volta che un IP viene rinchiuso nella jail. Con un file action ,ad esempio, posso farmi inviare un messaggio via Telegram quando un IP viene bloccato, oppure segnalare l’IP a Cloudflare. Questi file stanno in action.d
.
File: action.d/telegram.conf
[Definition]
chat_id = Find by sending message to @get_id_bot
token = Create new bot and get token by messaging @BotFather
actionstart = /usr/bin/curl -sSf -X POST https://api.telegram.org/bot%(token)s/sendMessage --data chat_id=%(chat_id)s --data text="[F2B] - Jail <name> avviata sul server."
actionstop = /usr/bin/curl -sSf -X POST https://api.telegram.org/bot%(token)s/sendMessage --data chat_id=%(chat_id)s --data text="[F2B] - Jail <name> fermata sul server."
actioncheck =
actionban = /usr/bin/curl -sSf -X POST https://api.telegram.org/bot%(token)s/sendMessage --data chat_id=%(chat_id)s --data text="[F2B] - <IP> appena bannato da Fail2ban dopo <failures> tentativi contro la jail <name> sul server."
actionunban = /usr/bin/curl -sSf -X POST https://api.telegram.org/bot%(token)s/sendMessage --data chat_id=%(chat_id)s --data text="[F2B] - <IP> appena sbannato dal server."
[Init]
init = "Fail2ban Telegram è attivo"
actionstart
quando una jail viene attivata
Per esempio dopo systemctl start fail2ban
actionstop
quando una jail viene fermata
Per esempio dopo systemctl stop fail2ban
actionban
quando un IP viene bannato
Quando ha superato maxretry
tentativi in findtime
sarà bannato per bantime
.
actionunban
Quando un IP viene sbannato, dopo che è trascorso bantime
dal momento in cui è stato bannato.
actioncheck
comando eseguito prima di qualsiasi azione.
Per attivare quest’azione, inserire la riga action = telegram[nome-jail]
nel file di configurazione di una jail.
Esempio in un potenziale file file jails.conf
[sshd]
enabled = true
action = telegram[name=SSHD]
[postfix]
enabled = true
action = telegram[name=POSTFIX]
Per questa azione si invoca curl ad inviare un messaggio POST all’API di Telegram per un BOT che dovrà inviare un messaggio diretto a noi, con chat_id. Questo metodo è stato brutalmente copiato (con un paio di semplificazioni al file dell’azione) da Receive messages on Telegram from Fail2ban.
Fonti #
Manpages di Debian su Fail2Ban:
Messaggio via Telegram quando IP bannati
DigitalOcean su Fail2Ban
Altro
Altro, in Italiano: