Fail2ban es una herramienta que monitorea los logs y se activa (ejecutando una acción) cuando detecta un patrón sospechoso previamente definido (filtro).

Para instalar Fail2ban y sus dependencias en Ubuntu solo debemos ejecutar en una terminal el siguiente comando:

sudo apt-get install fail2ban

El archivo de configuraci&ocaute;n principal está es /etc/fail2ban/jail.conf y contiene de conjunción de los patrones a buscar y acciones a ejecutar por cada servicio monitoreado. Un ejemplo que viene configurado por default en el archivo es la sección [ssh] donde podemos ver habilitado el filtro sshd que buscará sobre el archivo log /var/log/auth.log la cantidad de maxretry definidas (en este caso 6).

[ssh]
 
enabled  = true
port     = ssh
filter   = sshd
logpath  = /var/log/auth.log
maxretry = 6

La entrada “filter = sshd” está definida en el archivo /etc/fail2ban/filter.d/sshd que básicamente se compone por una expresión regular que tratará de encajar sobre el log pasado como parámetro.

Debemos reiniciar el servicio para que los cambios tengan efecto:

sudo service fail2ban restart

Pero esta regla solo generará una entrada en el log /var/log/fail2ban.log con el siguiente aviso.

2018-01-24 12:30:59,401 fail2ban.actions: WARNING [ssh] Ban 10.10.10.10

Si queremos ir un paso adelante, podemos construir reglas reactivas que bloqueen la IP del host que está intentando conectarse a nuestro server. Para ello vamos a modificar un poco la sección [ssh-iptables-ipset4] en primer lugar habilitando dicha regla, luego apuntando el logpath al archivo correcto y para finalizar definiendo una acción a ejecutar la cual bloqueará la IP en cuestión mediante el comando definido en iptables-ipset-proto4.

[ssh-iptables-ipset4]
 
enabled  = true
port     = ssh
filter   = sshd
banaction = iptables-ipset-proto4
logpath  = /var/log/auth.log
maxretry = 6

Donde ahora tenemos establecido el parámetro banaction que se define en el archivo /etc/fail2ban/action.d/iptables-ipset-proto4.conf que modifica las reglas de nuestro firewall mediante iptables y ipset*

* Si no tenemos ipset instalado, ejecutar sudo apt-get install ipset

Si ahora intentamos un acceso desde nuestro HOST de prueba 10.10.10.10 no solo veremos en el log de fail2ban la siguiente linea:

2018-01-24 12:39:33,325 fail2ban.actions: WARNING [ssh-iptables-ipset4] Ban 10.10.10.10

sino que además en las reglas de iptables tendremos una entrada como la siguiente:

REJECT     tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 22 match-set fail2ban-ssh-iptables-ipset4 src reject-with icmp-port-unreachable

donde el set de IPs a bloquear ahora incluye la 10.10.10.10

# ipset list fail2ban-ssh-iptables-ipset4
Name: fail2ban-ssh-iptables-ipset4
Type: hash:ip
Revision: 2
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 16520
References: 1
Members:
10.10.10.10

Podemos verificar el funcionamiento de las reglas de firewall intentando conectarnos nuevamente.

# ssh pablo@10.10.10.1
ssh: connect to host 10.10.10.1 port 22: Connection refused

Las secciones en el archivo /etc/fail2ban/jail.conf otros parámetros que se pueden definir.

bantime = 600 # Tiempo de baneado en segundos.
destemail = usuario@ejemplo.com # Destinatario de correo para aviso de visitante bloqueado

Probar una regla
Existe una forma sencilla de probar las expresiones regulares de nuevas reglas sobre un archivo log para verificar si aplica como nosotros queremos, sin que este afecte al sistema.

# fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf 
 
Running tests
=============
 
Use   failregex file : /etc/fail2ban/filter.d/sshd.conf
Use         log file : /var/log/auth.log
 
 
Results
=======
 
Failregex: 13 total
|-  #) [# of hits] regular expression
|   3) [11] ^\s*(<[^.]+\.[^.]+>)?\s*(?:\S+ )?(?:kernel: \[\d+\.\d+\] )?(?:@vserver_\S+ )?(?:(?:\[\d+\])?:\s+[\[\(]?sshd(?:\(\S+\))?[\]\)]?:?|[\[\(]?sshd(?:\(\S+\))?[\]\)]?:?(?:\[\d+\])?:?)?\s(?:\[ID \d+ \S+\])?\s*Failed \S+ for .*? from <HOST>(?: port \d*)?(?: ssh\d*)?(: (ruser .*|(\S+ ID \S+ \(serial \d+\) CA )?\S+ (?:[\da-f]{2}:){15}[\da-f]{2}(, client user ".*", client host ".*")?))?\s*$
|   5) [2] ^\s*(<[^.]+\.[^.]+>)?\s*(?:\S+ )?(?:kernel: \[\d+\.\d+\] )?(?:@vserver_\S+ )?(?:(?:\[\d+\])?:\s+[\[\(]?sshd(?:\(\S+\))?[\]\)]?:?|[\[\(]?sshd(?:\(\S+\))?[\]\)]?:?(?:\[\d+\])?:?)?\s(?:\[ID \d+ \S+\])?\s*[iI](?:llegal|nvalid) user .* from <HOST>\s*$
`-
 
Ignoreregex: 0 total
 
Date template hits:
|- [# of hits] date format
|  [888] MONTH Day Hour:Minute:Second
`-
 
Lines: 888 lines, 0 ignored, 13 matched, 875 missed
Missed line(s):: too many to print.  Use --print-all-missed to print all 875 lines

Algunos filtros mas

en /etc/fail2ban/filter.d/

# Fail2Ban configuration file qmail-auth.conf
# Author: Efra - Pablo
# Version 0.1
#
# 2018-01-24T10:02:17.562375-03:00 vps smtp_auth: smtp_auth: FAILED: support - password incorrect from (null)@walkerj2351.example.com [91.200.12.197]
[Definition]
failregex = (.* smtp_auth: FAILED: .* password incorrect from .*) \[<HOST>\]
ignoreregex =

en /etc/fail2ban/jail.conf

[qmail-auth]
enabled = true
filter  = qmail-auth
action  = iptables-allports[name=qmail-auth]
logpath  = /usr/local/psa/var/log/maillog

en /etc/fail2ban/filter.d/

# Fail2Ban configuration file wordpress-login.conf
# Author: Efra - Pablo
# Version 0.1
# Bloquea accesos al administrador de WP
#
# 91.200.12.49 - - [26/Apr/2017:11:42:02 -0300] "POST /wp-login.php HTTP/1.1" 200 3157 "https://pablo.sarubbi.com.ar/wp-login.php" "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1; 125LA; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)"
[Definition]
failregex = ^<HOST> -.*"(GET|POST).*\/wp-login.php HTTP\/.*$
ignoreregex =

en /etc/fail2ban/jail.conf

[wordpress-login]
enabled  = true
filter   = wordpress-login
action   = iptables-multiport[name=wordpressLogin, port="http,https"]
logpath  = /var/www/vhosts/*/statistics/logs/access_log
bantime  = 172800
maxretry = 5
findtime = 60

en /etc/fail2ban/filter.d/

# Fail2Ban configuration file wordpress-uploads.conf 
# Author: Efra - Pablo
# Version 0.1
# Bloquea accesos a archivos .php en directorio uploads de WP
# 98.130.0.199 - - [25/Apr/2017:07:25:14 -0300] "POST /wp-content/uploads/2011/09/footer92.php HTTP/1.0" 200 255 "https://pablo.sarubbi.com.ar/wp-content/uploads/2011/09/footer92.php" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.48 Safari/537.36"
[Definition]
failregex = ^<HOST> -.*"(GET|POST).*\/uploads\/.*\.php HTTP\/.*$
ignoreregex =

en /etc/fail2ban/jail.conf

[wordpress-uploads]
enabled  = true
filter   = wordpress-uploads
action   = iptables-multiport[name=wordpressUploads, port="http,https"]
logpath  = /var/www/vhosts/*/statistics/logs/access_log
bantime  = 172800
maxretry = 1

en /etc/fail2ban/filter.d/

# Fail2Ban configuration file  horde-login.conf 
# Author: Efra - Pablo
# Version 0.1
# Bloquea accesos al webmail Horde
# Jan 24 14:34:31 HORDE [error] [imp] FAILED LOGIN for zaraza@sarubbi.com.ar [139.162.9.175] to {localhost:143 [imap/notls]} [pid 21241 on line 139 of "/usr/share/psa-horde/imp/lib/Auth/imp.php"]
[Definition]
failregex = (.* FAILED LOGIN for .*) \[<HOST>\] to .*$
ignoreregex =

en /etc/fail2ban/jail.conf

[horde-login]
enabled  = true
filter   = horde-login
action   = iptables-multiport[name=horde-login, port="http,https"]
logpath  = /var/log/psa-horde/psa-horde.log
bantime  = 7200
maxretry = 5
findtime = 1200