====== Fail2ban (Su Devuan Ascii, Beowulf e Chimaera, o Debian 9/10/11) ======
Fail2ban è un demone (in python) che permette di bloccare gli indirizzi ip di chi tenta attacchi brute force. È ovviamente complesso, potendosi adattare a una serie di diversi demoni e servizi (ssh, imap, smtp, ecc).
Qui raccoglierò i miei appunti sulle varie configurazioni che ho provato.
===== Installazione =====
Di defaul in Debian / Devuan, fail2ban è configurato solo per ssh. In generale le configurazioni personalizzate ha senso farle dentro dei files con estensione ".local", che hanno la precedenza su quelli con estensione ".conf".
===== Appunti su servizio SSH (openssh) =====
Se si usa una porta non standard per ssh, si puo` definirla (o definirle, se sono piu` di una, separate da una virgola) nel file ''/etc/fail2ban/jail.d/ssh.local'', così:
[sshd]
enabled = true
port = 2222
# facoltativo, piu` aggressivo rispetto al default
bantime = 60m
maxretry = 3
===== Appunti su Exim / Dovecot / Sieve =====
Queste sono delle config valide per Exim / Dovecot / Sieve, adatte alla configurazione di Exim e Dovecot che uso normalmente io. (possiamo metterle nel file ''/etc/fail2ban/jail.d/mail.local'' per esempio)
[dovecot]
enabled=true
logpath = /var/log/mail.log
[sieve]
enabled=true
logpath = /var/log/mail.log
[exim]
enabled = true
===== Uso con Roundcube webmail =====
Impostare roundcube per usare syslog, verificare che i login falliti finiscano anche in syslog e nel file /var/log/user.log (in Debian 11 è così) e poi impostare in fail2ban una jail in ''/etc/fail2ban/jail.d/roundcube.local'' in questo modo:
[roundcube-auth]
enabled = yes
logpath = %(syslog_user)s
backend = %(syslog_backend)s
===== Appunti su Asterisk =====
Questa è una config per Asterisk. Funziona con versioni recenti, non sono sicuro di quelle più vecchie. Occorre fare alcune cose per farla funzionare.
* Modificare la configurazione di asterisk. Editare logger.conf e aggiungere la voce "security" alla riga "messages", così:
messages => notice,warning,error,security
* Ricaricare la config di logger con "asterisk -r" e poi in console "logger reload"
* Creare questa configurazione dentro a ''/etc/fail2ban/jail.d/asterisk.local''
[asterisk]
enabled = yes
bantime = 3600
findtime = 21600
maxretry = 10
===== Inviare una mail per gli eventi di ban =====
Per inviare una mail in caso di ban, possiamo aggiungere alla nostra config della jail questa configurazione:
destemail = user@domain
action = %(action_mw)s
Facendo così il sistema ci manda una mail allo start, allo stop, al ban e all'unban.
Se vogliamo evitare lo start e stop, per non ingolfarci di roba inutile, possiamo creare un file di configurazione locale che inibisce lo start e lo stop; creiamo il file ''/etc/fail2ban/action.d/sendmail-common.local'' e ci mettiamo dentro quanto segue:
[Definition]
# Disable email notifications of jails stopping or starting
actionstart =
actionstop =
===== Test vari =====
Potete testare le regexp di fail2ban usando il comando ''fail2ban-regex'', per esempio come segue:
fail2ban-regex --print-all-matched /var/log/mail.log /etc/fail2ban/filter.d/dovecot.conf
Inoltre il comando ''fail2ban-client'' permette di leggere lo stato, modificare config. ecc. Ecco alcuni esempi:
fail2ban-client status
fail2ban-client status dovecot
fail2ban-client get dovecot failregex
fail2ban-client get exim bantime
fail2ban-client get exim findtime
fail2ban-client get exim maxretry
===== Ban a lungo per indirizzi recidivi =====
Se un indirizzo viene bannato più di una volta, lo si può bannare più a lungo. Questa jail usa il log di fail2ban stesso per decidere chi è recidivo. Attenzione: non impostare il log di fail2ban a "DEBUG" altrimenti si affoga nei suoi stessi log.
* Creare il file ''/etc/fail2ban/jail.d/recidive.local''
[recidive]
enabled = true
logpath = /var/log/fail2ban.log
filter = recidive
# find how many times it was banned today
findtime = 86400 ; 1 day
# if it banned 3 times
maxretry = 3
# ban this user for 1 day
bantime = 86400
* Se voglio un findtime o un bantime maggiore di 1 giorno, devo modificare la config di fail2ban (/etc/fail2ban/fail2ban.conf) per aumentare a piu` di un giorno il tempo di ritenzione del database, dal default di un giorno a un tempo maggiore o uguale a quello che usiamo nella jail recidive:
dbpurgeage = 1d
* Per finire ovviamente ricarico fail2ban
===== Eccessivo uso del disco (troppo i/o) =====
Mi e` capitato di trovare Fail2ban che faceva un mostruoso uso del disco, l' iowait era fisso al 60%, e questo creava problemi anche a tutto il resto delle macchine virtuali che giravano sullo stesso server, ovviamente. Nel mio caso specifico, la soluzione e` stata quella di disattivare l'uso di un database sqlite per contenere i dati storici degli indirizzi bannati. Questa impostazione si fa nel file ''/etc/fail2ban/fail2ban.conf'', andando a cercare l'opzione "dbfile" e mettendola a "None". Volendo poi potete anche cancellare il file sqlite che era usato per questa funzione.
# Originale:
dbfile = /var/lib/fail2ban/fail2ban.sqlite3
# Disattivare l'uso del db
dbfile = None
Questo sistema per me ha immediatamente risolto il problema.
Un'altra possibilità è quella di dire a fail2ban di leggere solo l'ultimo pezzo dei log e non tutti i log pregressi. A me non è servito, ma nel caso, questa è la modifica da effettuare: Nelle configurazioni delle varie jail, occorre indicare il parametro ''logpath'' in modo diverso. Attenzione perchè il logpath può essere definito in ''/etc/fail2ban/jail.conf'' oppure dentro alle varie conf in ''jail.d'', occorre guardarci bene. In ogni caso la modifica consiste in questo:
# Originale (esempio di sshd)
logpath = %(sshd_log)s
# modificato (aggiungo un "tail" alla fine della riga)
logpath = %(sshd_log)s tail