Debian-swirl.png Versioni Compatibili

ERRORE: valore non valido ( Debian Sarge 3.1
Debian Etch 4.0
Debian Lenny 5.0
Debian Squeeze
Debian Sid )! Vedi qui.

Introduzione

Fail2ban (Sito ufficiale) è un software che è nato per permettere di bloccare gli host che stanno tentando di effettuare un attacco di brute force via SSH.

Questo genere di attacco si basa su continui tentativi di accesso, provando o l'username root con password probabili (come password, root, toor e così via) oppure tramite coppie di username/password conosciute (create, ad esempio, da malware o da rootkit).

Con le ultime versioni, però, si è ampliato ed è in grado di coprire svariati servizi (che andranno, però, configurati manualmente), come ad esempio apache, vsftpd, postfix, etc.

Il funzionamento

Il funzionamento è semplice: il software si occupa di effettuare il parsing di alcuni file di log (nel caso di ssh, /var/log/auth.log) che contengono le informazioni relative agli accessi falliti. Se vengono contati un numero di tentativi maggiori ad una soglia, l'indirizzo IP viene bloccato, attraverso una regola di iptables, per un tempo impostato e non potrà più accedere al servizio in ascolto su quella porta (ma potrà ancora accedere a quelli sulle altre, cosa molto importante nel caso di indirizzi IP condivisi, come avviene per Fastweb o all'interno delle reti aziendali).

Installazione

L'installazione è semplice:

# apt-get install fail2ban

A questo punto, lanciando il comando:

# iptables -L

dovreste vedere una nuova chain relativa a fail2ban.

Configurazione

Fail2ban è già configurato e pronto all'uso, ma alcuni punti hanno bisogno di piccole modifiche. I file di configurazione sono /etc/fail2ban/fail2ban.conf e /etc/fail2ban/jail.local: il primo contiene i parametri di configurazione globali (ad esempio potrete specificare in quale file di log verranno registrati gli avvisi di fail2ban), mentre il secondo contiene i parametri necessari al funzionamento del software.

Il file di configurazione /etc/fail2ban/jail.local è diviso per sezioni; ogni sezione inizia ha una struttura simile a:

[nomesezione]
parametro = valore
parametro2 = valore
parametro3 = valore

Ogni sezione, quindi, identificherà un controllo da eseguire. Fa eccezione la prima: [DEFAULT], in quanto contiene i valori di default che verranno usati nelle sezioni successive; ovviamente potranno essere ridefiniti per adattarli ai propri gusti.

I Parametri

I parametri più importanti sono:

ignoreip = 127.0.0.1
permette di indicare un elenco di IP su cui non verrà fatto il controllo. Utile per non tagliare fuori accidentalmente l'ufficio. Esempio: 192.168.1.0/24 consente l'accesso a tutta la lan 192.168.1.XXX;
bantime = 600
il tempo, in secondi, per cui un host verrà bannato;
maxretry = 3
il numero massimo di tentativi dopo cui effettuare il ban dell'host;
destemail = root@localhost
l'indirizzo e-mail a cui inviare la mail di notifica;
action = iptables[name=%(__name__)s, port=%(port)s]
l'azione da prendere. Quella di default blocca semplicemente l'accesso alla porta del servizio all'ip che ha sforato il numero di tentativi massimo;
enabled = true
abilita i controlli all'interno della sezione;
port = ssh
indica la porta da bloccare;
filter = sshd
indica il filtro da utilizzare (contenuto all'interno della directory /etc/fail2ban/filter.d );
logpath = /var/log/auth.log
il file contenente il log da controllare;

Esempi di Azioni

Filtraggio semplice

Questa azione applica semplicemente un filtro in modo che l'host che ha effettuato un numero di tentativi maggiori di quello definito viene fermato.

action = iptables[name=%(__name__)s, port=%(port)s]

Filtraggio con Notifica

Questa regola amplia quella precedente, in quanto manda una mail contenente l'IP ed il whois dell'IP dell'host che ha fatto scattare l'allarme

action = iptables[name=%(__name__)s, port=%(port)s]
         mail-whois[name=%(__name__)s, dest=%(destemail)s]

Filtraggio con Notifica Avanzata

Come prima, ma in aggiunta sono presenti anche le linee del file di log che hanno fatto scattare l'allarme.

action = iptables[name=%(__name__)s, port=%(port)s]
          mail-whois-lines[name=%(__name__)s, dest=%(destemail)s, logpath=%(logpath)s]

Conclusioni

Una volta installato, il software è automaticamente attivo e gira in background come servizio. In caso di modifica del file di configurazione, è necessario effettuare un restart del servizio tramite il comando

# /etc/init.d/fail2ban restart

Sbloccare IP bloccati

I blocchi IP di fail2ban sono solo temporanei, ma è comunque importante sapere come sbloccare un indirizzo IP bannato da fail2ban. Lanciando il comando:

# iptables -L

è possibile vedere gli indirizzi IP attualmente bloccati:

ferdy-hp:~# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
fail2ban-ssh  tcp  --  anywhere             anywhere            tcp dpt:ssh

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain fail2ban-ssh (1 references)
target     prot opt source               destination
DROP       0    --  ferdy-sony.casa.local  anywhere
RETURN     0    --  anywhere             anywhere

Da questo output si nota che il PC chiamato ferdy-sony.casa.local è attualmente bloccato da fail2ban. Invece di aspettare il tempo stabilito per lo sblocco automatico, è possibile dire a iptables di ignorare la regola creata da fail2ban, con questa sintassi:

iptables -D <rulename> <rule line>

Per sbloccare il PC ferdy-sony.casa.local basterà quindi digitare:

# iptables -D fail2ban-ssh 1 

Possiamo verificare l'effettivo sblocco digitando ancora:

# iptables -L

Prova di funzionamento

Prova 1

Per iniziare possiamo semplicemente provare a collegarci via SSH alla nostra macchina protetta da Fail2ban, sbagliando apposta a digitare nome utente e password. Supponendo che l'indirizzo IP della macchina da proteggere sia 192.168.1.10 eseguiamo:

$ ssh ferdyy@192.168.1.10

per un numero di volte sufficiente a far scattare Fail2ban.
Controlliamo poi di aver ricevuto l'email di avvertimento:

From fail2ban@ITSecurity  Thu Jul 16 04:59:24 2009
Subject: [Fail2Ban] ssh: banned 192.168.1.13
Hi,

The ip 1192.168.1.13 has just been banned by Fail2Ban after
5 attempts against ssh.


Here are more information about 192.168.1.13:

{whois info}

Lines containing IP:192.168.1.13 in /var/log/auth.log


Jul 16 04:59:16 example.com sshd[10390]: Failed password for root from 192.168.1.13 port 46023 ssh2
Jul 16 04:59:18 example.com sshd[10390]: Failed password for root from 192.168.1.13 port 46023 ssh2
Jul 16 04:59:20 example.com sshd[10390]: Failed password for root from 192.168.1.13 port 46023 ssh2
Jul 16 04:59:21 example.comsshd[10394]: reverse mapping checking getaddrinfo for 192.168.1.13.example.com [192.168.1.13] failed - POSSIBLE BREAK-IN ATTEMPT!
Jul 16 04:59:22 example.com sshd[10394]: Failed password for root from 192.168.1.13 port 46024 ssh2
Regards,

Fail2Ban

Ottimo! Fail2ban funziona.
Se ora controlliamo la coda di iptables, dovremmo trovare una nuova regola:

# iptables -L 

Chain fail2ban-ssh (1 references)
target     prot opt source               destination
DROP       all  --  192.168.1.13.example.com  anywhere

In alternativa è possibile controllare che fail2ban riesca a leggere dal file di log, con il comando

# fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf

Prova 2

Ora volendo potete testare fail2ban.
Come esempio ho cercato di accedere al servizio FTP inserendo nome utente e/o password sbagliate con il comando:

# fail2ban-regex "file di log" "filtro prescelto"

Ad esempio:

# fail2ban-regex /var/log/secure.log /etc/fail2ban/filter.d/proftpd.conf

Si noti che il comando va eseguito con sudo o con i permessi di su.
L'output di questo comando sarà una cosa del genere:

 barabba@server:~$ fail2ban-regex /var/log/secure.log /etc/fail2ban/filter.d/proftpd.conf
 Running tests
 Use regex file : /etc/fail2ban/filter.d/proftpd.conf
 Use log file : /var/log/secure.log
 Results
 Failregex
 |- Regular expressions:
 | [1] (S+[])[: -]+ USER S+: no such user found from S+ [[0-9.]+] to S+:S+s+$
 | [2] (S+[])[: -]+ USER S+ (Login failed): Incorrect password.$
 | [3] (S+[])[: -]+ SECURITY VIOLATION: S+ login attempted.$
 | [4] (S+[])[: -]+ Maximum login attempts (d+) exceeded$
 | [5] USER S+: no such user found from S* ?[] to S+s*$
 |
 `- Number of matches:
 [1] 0 match(es)
 [2] 6 match(es)
 [3] 0 match(es)
 [4] 0 match(es)
 [5] 28 match(es)
 Ignoreregex
 |- Regular expressions:
 |
 `- Number of matches: 
 Summary
 Addresses found:
 [1]
 [2]
 xxx.xxx.xxx.88 (Mon Jun 30 22:09:54 2008)
 xxx.xxx.xxx.88 (Mon Jun 30 22:10:15 2008)
 xxx.xxx.xxx.88 (Mon Jun 30 22:10:31 2008)
 xxx.xxx.xxx.253 (Tue Jul 01 10:43:51 2008)
 xxx.xxx.xxx.253 (Tue Jul 01 11:10:58 2008)
 xxx.xxx.xxx.253 (Tue Jul 01 11:14:12 2008)
 [3]
 [4]
 [5]
 xxx.xxx.xxx.253 (Tue Jul 01 09:26:54 2008)
 xxx.xxx.xxx.253 (Tue Jul 01 09:27:09 2008)
 xxx.xxx.xxx.253 (Tue Jul 01 09:27:24 2008)
 xxx.xxx.xxx.253 (Tue Jul 01 10:43:08 2008)
 xxx.xxx.xxx.253 (Tue Jul 01 10:43:22 2008)
 xxx.xxx.xxx.253 (Tue Jul 01 11:14:34 2008)
 xxx.xxx.xxx.193 (Tue Jul 01 13:02:16 2008)
 xxx.xxx.xxx.193 (Tue Jul 01 13:02:47 2008)
 xxx.xxx.xxx.193 (Tue Jul 01 13:03:05 2008)
 xxx.xxx.xxx.99 (Tue Jul 01 14:19:12 2008)
 xxx.xxx.xxx.99 (Tue Jul 01 14:19:14 2008)
 Date template hits:
 734 hit(s): Month Day Hour:Minute:Second
 0 hit(s): Weekday Month Day Hour:Minute:Second Year
 0 hit(s): Weekday Month Day Hour:Minute:Second
 0 hit(s): Year/Month/Day Hour:Minute:Second
 0 hit(s): Day/Month/Year Hour:Minute:Second
 0 hit(s): Day/Month/Year:Hour:Minute:Second
 0 hit(s): Year-Month-Day Hour:Minute:Second
 0 hit(s): Day-Month-Year Hour:Minute:Second[.Millisecond]
 0 hit(s): TAI64N
 0 hit(s): Epoch
 Success, the total number of match is 19
 However, look at the above section 'Running tests' which could contain important
 information.

Come potete vedere ho aggiunto una regola (numero 5 ) al filtro proftpd.conf:

USER S+: no such user found from S* ?[] to S+s*$

Con questa riga aggiunta il sistema riesce a bannare gli IP che provano a loggarsi con nome utente sbagliato, cosa che prima non avveniva, e infatti il test non rilevava alcun errore dal file di log.
Grazie a questo semplice test potete già testare se fail2ban è in grado di rilevare possibili errori dai vostri file di log, altrimenti non vi resta che modificare i vari filtri in /etc/fail2ban/filter.d/, oppure cercarne uno che funzioni e aggiungerlo alla lista come ho fatto io per il mio file /etc/fail2ban/filter.d/proftpd.conf.
Per finire vi lascio alla mail che vi arriva in caso un IP venga bannato:

 Subject: [Fail2Ban] proftpd: banned 58.252.70.99
 From: Fail2Ban 
 Hi,
 The IP 58.252.70.99 has just been banned by Fail2Ban after
 3 attempts against proftpd.
 Here are more information about 58.252.70.99:
 % [whois.apnic.net node-2]
 % Whois data copyright terms    http://www.apnic.net/db/dbcopyright.html
 inetnum:      58.252.70.0 - 58.252.70.255
 netname:      haidatong
 country:      CN
 descr:        haidatong, Foshan, Guangdong province
 admin-c:      CG272-AP
 tech-c:       CG272-AP
 status:       ASSIGNED NON-PORTABLE
 changed:      wangjj238@cnc.cn 20071221
 mnt-by:       MAINT-CNCGROUP-GD
 source:       APNIC
 route:        58.252.0.0/17
 descr:        CNC Group CHINA169 Guangdong Province Network
 country:      CN
 origin:       AS4837
 mnt-by:       MAINT-CNCGROUP-RR
 changed:      abuse@cnc-noc.net 20080620
 source:       APNIC
 Lines containing IP:58.252.70.99 in /var/log/secure.log
 Jul 01 14:19:09 kserver proftpd[25566] localhost.localdomain      (::ffff:58.252.70.99[::ffff:58.252.70.99]): FTP session opened.
 Jul 01 14:19:12 kserver proftpd[25566] localhost.localdomain (::ffff:58.252.70.99[::ffff:58.252.70.99]): no such user 'Administrator'
 Jul 01 14:19:12 kserver proftpd[25566] localhost.localdomain  (::ffff:58.252.70.99[::ffff:58.252.70.99]): USER Administrator: no such user found   from ::ffff:58.252.70.99 [::ffff:58.252.70.99] to ::ffff:192.168.0.50:21
 Jul 01 14:19:14 kserver proftpd[25566] localhost.localdomain  (::ffff:58.252.70.99[::ffff:58.252.70.99]): no such user 'Administrator'
 Jul 01 14:19:14 kserver proftpd[25566] localhost.localdomain  (::ffff:58.252.70.99[::ffff:58.252.70.99]): USER Administrator: no such user found   from ::ffff:58.252.70.99 [::ffff:58.252.70.99] to ::ffff:192.168.0.50:21
 Jul 01 14:19:16 kserver proftpd[25566] localhost.localdomain  (::ffff:58.252.70.99[::ffff:58.252.70.99]): no such user 'Administrator'
 Jul 01 14:19:16 kserver proftpd[25566] localhost.localdomain  (::ffff:58.252.70.99[::ffff:58.252.70.99]): USER Administrator: no such user found  from ::ffff:58.252.70.99 [::ffff:58.252.70.99] to ::ffff:192.168.0.50:21
 Jul 01 14:19:16 kserver proftpd[25566] localhost.localdomain  (::ffff:58.252.70.99[::ffff:58.252.70.99]): Maximum login attempts (3) exceeded, connection refused
 Jul 01 14:19:16 kserver proftpd[25566] localhost.localdomain  (::ffff:58.252.70.99[::ffff:58.252.70.99]): FTP session closed.
 Regards,
 Fail2Ban