Categorías
Debian

Integrando fail2ban en el servidor …

tools_server… y descubriendo lo versátil que puede ser.

fail2ban es un programa que sirve para cerrar conexiones de red a máquinas que fallan al acceder a servicios del sistema en el que está instalado. La inmensa mayoría de estos fallos son ataques al sistema, no voy a endulzarlo ahora, por lo que se puede considerar una herramienta tanto informativa como defensiva. Es cierto que con ella en funcionamiento es muy fácil dispararse en el pié, sobre todo si insistes en emplear contraseñas antiguas o que corresponden a otros sistemas, pero merece la pena por el número de exploraciones que se reciben de continuo.

Para realizar su trabajo explora los archivos de registro en busca de señales de conexiones fallidas e interactúa con el cortafuegos local para indicarle a quién cerrar el acceso. Resumiendo, que lee archivos de texto, extrae información concreta de ellos (direcciones IP básicamente), la contabiliza y lanza la ejecución de programas externos con esos datos. Para ello compartimentaliza cada servicio dentro de una jaula, que es un concepto muy práctico definido como:

  • Archivos de registro de dónde obtener los fallos.
  • Expresiones regulares que extraen información de ellos.
  • Herramientas externas que controlan las conexiones con dichas máquinas, aunque es posible realizar otras tareas como enviar correo o mensajes instantáneos. Es más, pueden definirse varias acciones en cada caso.
  • Límites de la jaula como el tiempo que un atacante debe permanecer bloqueado, o el número de veces que debe aparecer en los registros para que sea considerado como tal.

Y para que funcione se deben dar las siguientes condiciones básicas:

  1. Los registros de sucesos deben estar en texto plano.
  2. Deben estar todos los eventos sin agrupaciones ni resúmenes.

Un tutorial de configuración excelente (en inglés) lo he encontrado en la página de Rodolfo Sabalburo donde también hace referencia a otro de DigitalOcean.

El diseño del programa hace muy fácil crear jaulas específicas para servicios muy concretos. Un ejemplo es el programa de correo Roundcube, una aplicación web, que se puede configurar para que los fallos en el acceso los registre en un archivo separado. Fail2ban no tiene dificultades en averiguar quién intenta entrar en el sistema por ese punto y bloquear la máquina origen durante un tiempo o toda la vida si es necesario.

En el caso de uno de mis servidores he definido varias jaulas en archivos individuales dentro del directorio /etc/fail2ban/jail.d y he retocado al configuración del programa shorewall tal y como aconseja Sabalburo.

Así que he creado un archivo jail.local que me permita definir valores concretos sin preocuparme de que se sobrescriban en las actualizaciones de Debian:

#
#       Parámetros globales
#

[DEFAULT]

#  Direcciones IP que siempre se ignoran. Util si se tiene varios servidores
#  que interactúan entre sí.
ignoreip = 127.0.0.1/8

# Programa externo que retorna verdadero si la IP recibida debe ser ignorada.
ignorecommand =

# Número de segundos que una máquina es bloqueada: 30 minutos
bantime  = 1800

# Se bloquea una máquina cuando alcanza 3 fallos en diez minutos
findtime = 600
maxretry = 3

# Método para obtener los archivos que han sido modificados. Lo dejo en
# automático por ahora.
backend = auto
# Avisar cuando se efectúen búsquedas inversas en el DNS
usedns = warn

# Dirección de correo electrónico para emplear en interpolación de variables de
# las definiciones de jaulas.
destemail = root@localhost

# Nombre del emisor de correo electrónico
sendername = Fail2Ban

# Dirección de correo electrónico para emitir avisos
sender = fail2ban@esferas.org

# Acción predeterminada para bloquear máquinas
banaction = shorewall

# Acción predeterminada para envío de correo electrónico
mta = mail

# Protocolo predeterminado
protocol = tcp


y he ido añadiendo jaulas específicas para cada servicio como en el caso de las conexiones SSH:

[ssh]

enabled  = true
port     = 372
filter   = sshd
logpath  = /var/log/auth.log
maxretry = 6


En el ejemplo indico el puerto especial que empleo para el servicio y doy un poco más de margen por si se me resiste una contraseña, que eso también cuenta 🙂