Dentro de las preocupaciones que tenemos los que gestionamos servidores que ofrecen servicios a través de Internet destaca sin duda su seguridad a la vez que aseguramos su funcionamiento continuo. Uno de los ataques más recurrentes y habituales que sufren estos servidores es el de fuerza bruta, que consiste en la prueba sistemática y continua de un servicio hasta que se descubre una vulnerabilidad o hasta que se consigue que el servicio (en algunos casos incluso el propio servidor) deje de funcionar. Ante este tipo de ataques se utiliza una medida sencilla y efectiva, como es la utilización de algún sistema de control o filtrado de paquetes (por ejemplo, el conocido TCP Wrapper o el no menos popular iptables, el cortafuegos del núcleo de Linux). A través de alguna de estas herramientas podemos bloquear las direcciones IP de las que proceden los ataques. Sin embargo, son muchos los servicios a controlar y las IPs a bloquear al cabo de un tiempo. Afortunadamente, contamos con una gran herramienta que permite la automatización de esta línea de defensa: Fail2ban.
Se trata de un sistema de prevención de intrusiones que funciona no sólo en Linux sino en cualquier sistema POSIX que incluya un interfaz a un sistema de control de paquetes como los que he comentado antes, lo que quiere decir que funciona en otros sistemas como FreeBSD y Mac OS X. Además, como está escrito en Python, bastaría desplegar el código fuente y ejecutarlo para «echarlo a andar». Sin embargo, es mucho mejor y más sencillo instalarlo a través de los repositorios oficiales de nuestra distribución Linux de elección.
En el caso de Debian, basta con:
# apt-get install fail2ban
Mientras que en el caso de Red Hat y sus derivativas se instala con:
# yum install fail2ban
Fail2ban funciona monitorizando los ficheros de registro del sistema en busca de entradas concretas y actuando en consecuencia a través de la ejecución de scripts que llevan a cabo las acciones deseadas por el administrador. Por ejemplo, si se detectan demasiados intentos erróneos de acceso al servidor FTP, se puede bloquear la IP desde la que se han realizado y enviar un email al administrador notificando el evento. Este bloqueo se realiza habitualmente mediante la adición de reglas en el cortafuegos y/o al fichero hosts.deny
de TCP Wrapper. Además, se le puede indicar a Fail2ban que desbloquee la IP tras cierto periodo de tiempo, lo que nos sirve para evitar que conexiones legítimas (imaginemos un cliente de correo reinstalado al que se le introduce mal la contraseña del usuario) queden bloqueadas definitivamente. Generalmente, basta un bloqueo temporal para detener un ataque de fuerza bruta. Por defecto, 3 intentos fallidos (parámetro maxretry
) en los últimos 10 minutos (parámetro findtime
) provocan que una IP sea bloqueada otros 10 minutos (parámetro bantime
).
Una vez instalado, Fail2ban nos ofrece una serie de configuraciones estándares para los servicios más habituales (apache, postfix, ssh, etc.), por lo que sólo tenemos que editar el fichero /etc/fail2ban/jail.conf
y activar los filtros que nos convengan (basta con cambiar enabled = false
por enabled = true
en el filtro correspondiente). Estos filtros se definen a mediante expresiones regulares Python y se almacenan en ficheros dentro del directorio /etc/fail2ban/filter.d
, por lo que es relativamente sencillo crear nuevos y adaptar los existentes. De igual modo, las acciones se guardan en el directorio /etc/fail2ban/action.d
, en un formato propio de Fail2ban (muy sencillo) a través del cual se especifican los comandos a ejecutar y otros parámetros necesarios para un correcto funcionamiento de cada acción. Por cierto, a la combinación de un filtro y una acción se le conoce con el nombre de «jail» (cárcel). De ahí el nombre del fichero de activación de filtros.
Cada vez que realicemos un cambio en los ficheros de configuración de Fail2ban es necesario reiniciarlo, como es habitual en cualquier servicio:
# service fail2ban restart
Desgraciadamente, no hay sistema perfecto y Fail2ban presenta dos importantes carencias: no protege ante ataques distribuidos y no incluye soporte IPv6. Aún así, Fail2ban supone una gran ayuda y una línea más en la defensa de nuestros servidores expuestos en Internet.
Quiero hacer dos matizaciones sobre Fail2ban en Debian que no he recogido en el artículo. La primera es que los cambios no debemos hacerlos en
jail.conf
sino enjail.local
, fichero que habrá que crear la primera vez, de forma que nuestras modificaciones se respeten cuando actualicemos la versión. La segunda es que en el fichero/usr/share/doc/fail2ban/examples/jail.conf.gz
se muestran más ejemplos interesantes de filtros.Supongo que estas matizaciones son de aplicación en otras distribuciones, sean o no derivadas de Debian, pero habría que comprobar caso por caso.