Bloqueando ataques continuos con fail2ban y denyhosts

Una de las cosas que uno puede hacer con su conexión a Internet es montarse un servidor de acceso remoto para conectarse a casa desde cualquier parte del mundo IP. Sin embargo, abrir servicios a Internet expone a tu equipo a las inclemencias propias de la red como son ataques remotos. Salvo errores muy críticos en los programas que se ejecutan, y manteniendo el equipo actualizado, llegar a colarse en tu máquina por un exploit es difícil, pero eso no quita que a diario puedas recibir continuos intentos de acceso no autorizados, sobre todo desde máquinas zombies de una botnet.

Esto es justo lo que le pasa a mi servidor SSH, cuyos registros de acceso fallidos están rebosando de intentos:

Apr 23 02:20:52 teroknor sshd[31336]: Invalid user noah from 217.126.56.236
Apr 23 02:20:52 teroknor sshd[31336]: pam_unix(ssh:auth): check pass; user unknown
Apr 23 02:20:52 teroknor sshd[31336]: pam_unix(ssh:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=236.red-217-126-56.staticip.rima-tde.net
Apr 23 02:20:54 teroknor sshd[31336]: Failed password for invalid user noah from 217.126.56.236 port 17228 ssh2
Apr 23 02:20:56 teroknor sshd[31339]: Invalid user joseph from 217.126.56.236
Apr 23 02:20:56 teroknor sshd[31339]: pam_unix(ssh:auth): check pass; user unknown
Apr 23 02:20:56 teroknor sshd[31339]: pam_unix(ssh:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=236.red-217-126-56.staticip.rima-tde.net

Una solución muy fácil de instalar en el equipo es un sistema de prevención de intrusión o HIPS basado en analizar periódicamente los registros de acceso con dos programas: denyhosts y fail2ban.

Estos dos programas buscan registros de fallos reiterativos de acceso y en caso de detectar demasiados errores de accesos desde una misma IP, automáticamente la bloquean.

Para sistemas con apt y sus poderes de supervaca, coro es el caso de mi Ubuntu 8.04, bastará con conjurarla con un:

sudo apt-get install denyhosts fail2ban

Los instaladores traen una configuración por defecto que funciona sin problema con el servicio open-SSH que trae Ubuntu.

Fail2ban

En el caso de fail2ban se pueden añadir patrones de búsqueda personalizados para cada registro de actividad gracias a su configuración basada en los ficheros de filtros que se encuentran en /etc/fail2ban/filter.d/. Las acciones de bloqueo temporal de los atacantes se basan en insertar reglas en las iptables, el cortafuegos nativo de los sistemas linux.

Para verificar el correcto funcionamiento de las reglas se puede ejecutar el comando fail2ban-regex:

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

Su ejecución devolverá algo parecido a lo siguiente:

Running tests
=============

Use regex file : /etc/fail2ban/filter.d/sshd.conf
Use log file   : /var/log/auth.log

Results
=======

Failregex
|- Regular expressions:
|  [1] (?:error: PAM: )?Authentication failure for .* from s*$
|  [2] Failed [-/w]+ for .* from (?: port d*)?(?: sshd*)?s*$
|  [3] ROOT LOGIN REFUSED.* FROM s*$
|  [4] [iI](?:llegal|nvalid) user .* from s*$
|  [5] User .+ from  not allowed because not listed in AllowUserss*$
|  [6] User .+ from  not allowed because none of user's groups are listed in AllowGroupss*$
|
`- Number of matches:
[1] 0 match(es)
[2] 1338 match(es)
[3] 0 match(es)
[4] 932 match(es)
[5] 0 match(es)
[6] 0 match(es)

Ignoreregex
|- Regular expressions:
|
`- Number of matches:

Summary
=======

Addresses found:
[1]
[2]
60.28.167.66 (Mon Apr 21 16:04:29 2008)
200.41.1.220 (Mon Apr 21 20:24:09 2008)
200.41.1.220 (Mon Apr 21 20:24:17 2008)
[...]
217.126.56.236 (Wed Apr 23 02:21:24 2008)
217.126.56.236 (Wed Apr 23 02:21:27 2008)
217.126.56.236 (Wed Apr 23 02:21:31 2008)
217.126.56.236 (Wed Apr 23 02:21:34 2008)
[5]
[6]

Date template hits:
2270 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): 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 2270

Cuando se está ejecutando en segundo plano podemos ver el registro de actividad que va dejando en /var/log/fail2ban.log. Por defecto las reglas de rechazo de una determinada duran diez minutos, tiempo más que suficiente para que los molestos zombies desistan.

Más información en su sitio web oficial.

DenyHosts

DenyHosts es un HIPS exclusivo para SSH y se basa por un lado en el análisis de los registros de acceso del servidor SSH y por otro de listas de IPs conocidas que se descargan y sincronizan desde el servidor principal de DenyHosts. Cuenta con más de 27000 sincronizaciones y es un bastante eficiente para protegerse de máquinas que ya se conocen como atacantes, frente a fail2ban, que realiza únicamente análisis de los registros.

El funcionamiento de DenyHosts se basa en ir añadiendo o eliminando direcciones IP al fichero /etc/hosts.deny que luego el servicio de SSH tiene en cuenta a la hora de rechazar intentos de conexión.

La configuración por defecto del paquete de las distribuciones de Debian/Ubuntu dejan en el fichero /etc/denyhosts.conf la configuración de este demonio. Si queremos que se sincronice con el servidor de DenyHosts de forma periódica, es necesario descomentar una línea del fichero de configuración por defecto, SYNC_SERVER=… y si además queremos que cada vez que actúe se registre en los registros del sistema, deberemos poner SYSLOG_REPORT a Yes.

SYSLOG_REPORT=YES
SYNC_SERVER = http://xmlrpc.denyhosts.net:9911

Si observamos los registros de actividad del sistema, veremos cosas como esta:

theefrit@teroknor:~$ cat /var/log/syslog | grep deny
May  1 14:21:56 teroknor denyhosts: Added the following hosts to /etc/hosts.deny - 203.212.65.20 (unknown)

En el fichero de registro de actividad específico de DenyHosts, /var/log/denyhosts, podemos ver con detalle toda su actividad de sincronización remota.

Más información en la página del programa.

1 thought on Bloqueando ataques continuos con fail2ban y denyhosts

Deja un comentario