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 |