Come accennato, tra i vari tool che iRedMail installa e preconfigura c'è anche "Fail2Ban".
Fail2ban è un tool con architettura client-server scritto in python. Sostanzialmente si occupa di analizzare i log di sistema alla ricerca di corrispondenze con delle stringhe indicate in "jail" configurabili e applicare per ogni occorrenza un'azione stabilita.
L'utilizzo tipico è quello che creare delle jail per matchare le signature dei portscanner più noti o per individuare dei tentativi di brute-forcing sul server e mettere in drop nel firewall del server l'IP attaccante. Il tool funziona piuttosto bene anche se ci potrebbe essere bisogno di qualche fix manuale o di un leggero tuning iniziale ma richiede una certa dimestichezza con le espressioni regolari (regex) in Perl che vengono utilizzate per analizzare i log di sistema. In questo non sono molto ferrato quindi le regex che ho implementato sono piuttosto rudimentali ma sufficientemente efficaci...
Il tool utilizza due file di configurazione principali reperibili in /etc/fail2ban oltre ai file contenenti le espressioni regolari (contenuti nella sottodirectory filter.d) ed ai files contenenti le azioni da intraprendere in caso di match (action.d).
I files di configurazione principali di fail2ban sono "fail2ban.conf" e "jail.conf": In base alla documentazione ufficiale, questi files non devono essere direttamente modificati per evitare problemi in sede di aggiornamento. Per personalizzarne il funzionamento è sufficiente creare una copia del file sostituendo l'estensione da ".conf" a ".local" ed apportare le modifiche su quest'ultimo file: Il tool provvede autonomamente ad effettuare il merge delle impostazioni tra i due files, mantenend come dominanti per impostazione del file ".local".
codice:
root@server:/etc/fail2ban# service fail2ban status
Status of authentication failure monitor:fail2ban is running.
La versione per CentOS è più simpatica... Indica anche il numero di jail in esecuzione. Comunque il demone è attivo e funzionante.
Sempre su CentOS 6 ho avuto modo di verificare un bug noto, provocato dalla sovrapposizione dei comandi inviati ad iptables per la creazione delle chain nel firewall: questo provoca la comparsa nel log di fail2ban di numerosi errori (codificati con numerazioni pari a 100 o multiple di 100) e l’inserimento solo parziale di alcune regole nel firewall (con risultati imprevedibili).
codice:
root@server:/etc/fail2ban# tail -40 /var/log/daemon.log | grep ERROR
Sep 20 00:55:55 server fail2ban.actions.action: ERROR iptables -D INPUT -p tcp --dport ssh -j fail2ban-ssh#012iptables -F fail2ban-ssh#012iptables -X fail2ban-ssh returned 100
Sep 20 00:55:56 server fail2ban.actions.action: ERROR iptables -D INPUT -p tcp -m multiport --dports http,https,smtp,submission,pop3,pop3s,imap,imaps,sieve -j fail2ban-roundcube#012iptables -F fail2ban-roundcube#012iptables -X fail2ban-roundcube returned 100
Sep 20 00:55:56 server fail2ban.actions.action: ERROR iptables -D INPUT -p tcp -m multiport --dports http,https,smtp,submission,pop3,pop3s,imap,imaps,sieve -j fail2ban-postfix#012iptables -F fail2ban-postfix#012iptables -X fail2ban-postfix returned 100
Sep 20 00:55:57 server fail2ban.actions.action: ERROR iptables -D INPUT -p tcp -m multiport --dports http,https,smtp,submission,pop3,pop3s,imap,imaps,sieve -j fail2ban-dovecot#012iptables -F fail2ban-dovecot#012iptables -X fail2ban-dovecot returned 100
Ho quindi verificato subito se il problema si presenta anche su debian e l'estratto del log sopra riportato lo conferma. Per risolvere questo problema, è stato applicato un fix trovato in rete che inserisce un 'attesa tra un inserimento e l'altro: Il fix consiste nell’editare il file in python “/usr/bin/fail2ban-client” e modificata la sezione che parte dalla riga 142 come segue:
codice:
def __processCmd(self, cmd, showRet = True):
beautifier = Beautifier()
for c in cmd:
time.sleep(0.1)
beautifier.setInputCmd(c)
Il caricamento delle jail risulta ora molto più lento ma avviene senza errori. Altri fix per lo stesso motivo, non hanno portato i risultati sperati quindi questo mi sembra essere il più efficace.