En este artículo veremos cómo instalar Fail2Ban en Debian 9 Stretch paso a paso, de modo que podremos proteger los servicios de nuestro VPS Debian contra ataques de fuerza bruta.
Tabla de contenidos
Antes de instalar Fail2Ban en Debian 9 Stretch
Si quieres completar esta breve guía de instalación de Fail2Ban en Debian 9 Stretch deberías satisfacer estos mínimos requerimientos:
- Una máquina Debian 9 Stretch actualizada.
- Acceso a línea de comandos con un usuario con privilegios de sudo o el propio root.
- Conexión a Internet.
- Otras máquinas en red, para probar el servicio.
Cómo instalar Fail2Ban en Debian 9 Stretch
Para instalar Fail2Ban en Debian 9 Stretch usaremos los paquetes disponibles en los propios repositorios de la distribución, por lo que la primera tarea a realizar es actualizar estas listas de paquetes:
~$ sudo apt update
Si hubiera paquetes instalados actualizables, puedes aprovechar la ocasión para dejar el sistema totalmente actualizado:
~$ sudo apt upgrade -y
El paquete que necesitamos no es otro que fail2ban, así que lo descargaremos e instalaremos con apt:
~$ sudo apt install -y fail2ban
Tras la descarga e instalación del paquete fail2ban y de sus dependencias, tendremos un nuevo servicio en Debian 9, el servicio fail2ban.service, al que también podemos referirnos con el nombre corto, fail2ban.
Este servicio fail2ban queda en ejecución tras la instalación, y también queda habilitado para iniciar automáticamente con cada arranque de Debian 9.
Podemos comprobar en cualquier momento el estado del servicio fail2ban mediante el comando systemctl status fail2ban
:
Cómo configurar Fail2Ban en Debian 9 Stretch
Para configurar Fail2Ban en Debian 9 Stretch trabajaremos sobre sus archivos y directorios de configuración, alojados en la ruta /etc/fail2ban/.
El archivo principal es /etc/fail2ban/jail.conf, donde se encuentran gran cantidad de directivas de configuración con valores por defecto. Podrías pensar que este es el archivo sobre el que debemos trabajar, pero no es así.
Fail2Ban tiene previsto el uso de un segundo archivo de configuración, /etc/fail2ban/jail.local, que no existe por defecto y cuyos valores tendrán prevalencia sobre los de jail.conf. De esta forma evitamos que la configuración se pierda en caso de actualización del paquete y sobrescritura del archivo de jail.conf.
Creamos el archivo jail.local:
~$ sudo nano /etc/fail2ban/jail.local
El contenido que añadiremos será la configuración general, la sección DEFAULT, que establece unos valores generales que serán asumidos si no se especifican otros concretos para cada servicio:
[DEFAULT] ignoreip = 192.168.1.0/24 bantime = 86400 findtime = 300 maxretry = 3
Por ejemplo, en este archivo de prueba jail.local las directivas de la sección DEFAULT significan lo siguiente:
ignoreip
Una lista (separada por espacios en blanco) de direcciones IP o redes que son excluidas del filtrado, como podría ser nuestra propia estación de trabajo, nuestra red local o simplemente ninguna excepción, comentando o eliminando esta directiva.
bantime
El tiempo que queda bloqueada la dirección IP que incurre en un comportamiento malicioso. En el ejemplo se han indicado 86.400 segundos o, lo que es lo mismo, 1 día.
findtime
Período de tiempo a contar desde el momento actual durante el que se tienen en cuenta las conexiones erróneas hasta llegar al máximo permitido. En el ejemplo se han especificado 300 segundos (5 minutos), lo que quiere decir que si durante los últimos 5 minutos se producen el número máximo de fallos permitido, Fail2Ban tomará las acciones oportunas.
maxretry
Número máximo de intentos de conexión permitidos en el tiempo máximo indicado por findtime.
En resumen, la configuración general de este ejemplo bloqueará durante 1 día la dirección IP que cometa 3 fallos durante los últimos 5 minutos.
Añadir los filtros para los servicios
Ahora debemos ir añadiendo las «jaulas» para los servicios que queramos proteger. Empezaremos con el servicio SSH, para lo que añadiremos al final del archivo jail.local este pequeño bloque:
... [sshd] enabled = true
El nombre de la sección, sshd, es el nombre de la jaula para el servicio. Si no se indica una directiva filter debe corresponder con el nombre del filtro preexistente de Fail2Ban para el servicio SSH.
Para saber de qué filtros dispones, echa un vistazo al contenido del directorio /etc/fail2ban/filter.d/, donde los nombres de los archivos (sin tener en cuenta la extensión .conf) son los nombres de los filtros que podemos incluir en jail.local. Dicho esto, habrás deducido que existe un archivo /etc/fail2ban/filter.d/sshd.conf.
Esta jaula ha sido fácil de activar, vamos a añadir otra un poco más complicada. Por ejemplo, si tienes activado el acceso remoto al servicio MariaDB podrías comprobar si existe algún filtro en filter.d/, pero no lo hay. Sin embargo, sí existe un archivo mysqld-auth.conf del que al examinar su contenido podremos ver lo siguiente:
... # To log wrong MySQL access attempts add to /etc/my.cnf in [mysqld]: # log-error=/var/log/mysqld.log # log-warning = 2 ...
Es un filtro para MySQL concretamente, y nos da ciertas instrucciones para configurar el servicio, como la ubicación del registro de MySQL y el nivel de alertas. En MariaDB varían algunas cosas, empezando por la ubicación del archivo de configuración del servicio, que en lugar de ser /etc/my.cnf es /etc/mysql/mariadb.conf.d/50-server.cnf:
~$ sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
Por otro lado, las directivas de configuración de MySQL usan guiones medios «-» mientras que en MariaDB se usan guiones bajos «_». No vamos a cambiar la ruta del archivo de registros o log, pero sí debemos indicar el nivel de alertas con la directiva log_warning en lugar de log-warning:
... # Error log - should be very few entries. # log_error = /var/log/mysql/error.log log_warning = 2 ...
Reiniciamos el servicio MariaDB para que los cambios tengan efecto:
~$ sudo systemctl restart mariadb
Y regresamos al archivo jail.local para añadir el filtro de MariaDB:
... [mariadb] enabled = true filter = mysqld-auth logpath = /var/log/mysql/error.log
En esta ocasión en la etiqueta entre corchetes hemos incluido un nombre personalizado para la jaula que no coincide con el nombre de archivo de ningún filtro. Por tanto hemos tenido que añadir la directiva filter con el nombre del filtro que se usará.
Además, para esta jaula hemos tenido que indicar dónde debe encontrar Fail2Ban el archivo de registro de MariaDB a través de la directiva logpath.
Guardados los cambios y cerrado el archivo jail.local, aplicaremos la nueva configuración del servicio fail2ban:
~$ sudo systemctl reload fail2ban
Comprobar el estado del servicio
Una vez cargada la nueva configuración de Fail2Ban podemos comprobar el estado del servicio con el cliente fail2ban-client:
~$ sudo fail2ban-client status Status |- Number of jail: 2 `- Jail list: mariadb, sshd
Podemos apreciar que se ha cargado la configuración para las dos jaulas, y también veremos sus respectivos nombres.
Cómo probar Fail2Ban en Debian 9
Ahora puedes intentar conectar una y otra vez desde otra máquina con un cliente SSH, fallando siempre la contraseña.
Observamos que tras fallar por tercera vez en el siguiente intento no se solicita contraseña, ya que la conexión es rechazada. Si observamos los registros de Fail2Ban en el servidor Debian 9:
~$ sudo tail /var/log/fail2ban.log
Podremos ver registrados los intentos de conexión y el aviso de bloqueo de la dirección IP atacante:
... ...12:09:01,820 fail2ban.filter [542]: INFO [sshd] Found 192.168.0.109 ...12:09:04,676 fail2ban.filter [542]: INFO [sshd] Found 192.168.0.109 ...12:09:08,275 fail2ban.filter [542]: INFO [sshd] Found 192.168.0.109 ...12:09:08,924 fail2ban.actions [542]: NOTICE [sshd] Ban 192.168.0.109
La máquina desde la que hemos realizado los intentos fallidos de conexión a SSH ha sido bloqueada.
Ahora intentaremos conectar repetidamente desde la máquina anterior al servicio MariaDB con el cliente mysql, introduciendo siempre una contraseña errónea:
En los tres primeros intentos obtenemos el típico mensaje de error que se produce en caso de usuario o contraseña erróneos. Pero al cuarto intento el mensaje de error simplemente avisa de que no es posible la conexión porque es rechazada por el servidor. Si analizamos los registros de Fail2Ban en el servidor Debian 9 observaremos lo siguiente:
... ...14:24:28,608 fail2ban.filter [2577]: WARNING Determined IP using DNS Lookup: debian92.local = ['192.168.0.109'] ...14:24:28,612 fail2ban.filter [2577]: INFO [mariadb] Found 192.168.0.109 ...14:24:34,378 fail2ban.filter [2577]: WARNING Determined IP using DNS Lookup: debian92.local = ['192.168.0.109'] ...14:24:34,379 fail2ban.filter [2577]: INFO [mariadb] Found 192.168.0.109 ...14:24:38,684 fail2ban.filter [2577]: WARNING Determined IP using DNS Lookup: debian92.local = ['192.168.0.109'] ...14:24:38,686 fail2ban.filter [2577]: INFO [mariadb] Found 192.168.0.109 ...14:24:39,378 fail2ban.actions [2577]: NOTICE [mariadb] Ban 192.168.0.109
Esta dirección IP ha sido bloqueada también para el servicio MariaDB.
Cómo desbloquear una dirección IP
Para desbloquear una dirección IP que ha sido bloqueada por Fail2Ban usaremos el cliente de consola fail2ban-client. Para desbloquear la dirección IP del ejemplo anterior usaremos el siguiente comando:
~$ sudo fail2ban-client set sshd unbanip 192.168.0.109 192.168.000.109
Debemos indicar tanto la jaula como la dirección IP, así que si queremos desbloquear esa dirección IP para el servicio MariaDB el comando será muy parecido, indicando la jaula de MariaDB:
~$ sudo fail2ban-client set mariadb unbanip 192.168.0.109
Y en los registros de Fail2Ban podremos ver ambos desbloqueos:
... ...14:42:02,254 fail2ban.actions [2577]: NOTICE [sshd] Unban 192.168.0.109 ...14:42:20,073 fail2ban.actions [2577]: NOTICE [mariadb] Unban 192.168.0.109
La dirección IP ha sido desbloqueada para ambos servicios. Pero si se produjera otro error de autenticación desde esta IP después de desbloquearla, y dentro del período de los últimos 5 minutos se hubieran cometido los errores anteriores, se bloquearía de nuevo. Esto es así porque en los registros figuran los fallos de conexión anteriores y no se descartan por el simple hecho de desbloquear la dirección IP.
Conclusión
Ahora que sabes cómo instalar y configurar Fail2Ban en Debian 9 Stretch podrás proteger tus servicios más críticos, ya que aunque tengamos el firewall activado se permite la conexión a estos servicios. Cada servicio exigirá conocer el funcionamiento del filtro, pero no es difícil hacer las modificaciones necesarias cuando sea preciso. Y siempre podemos añadir nuevos filtros personalizados desde Internet.
Si tienes alguna duda, pregunta, sugerencia, etc. puedes dejar un comentario.
Y si con esta guía de instalación y configuración de Fail2Ban en Debian 9 Stretch has conseguido aumentar la seguridad de tu servidor o VPS Debian, y te apetece expresar tu agradecimiento, puedes hacerlo dejando una propina de 1 $ desde PayPal:
O, si te sientes especialmente agradecido, puedes invitarme a un café:
¡Gracias!
Buena guía. Fail2Ban es de esas cosas que configuras una vez cada x años y nunca recuerdas cómo hacerlo la próxima vez que lo necesitas. Es difícil encontrar una buena explicación como esta y encima en español.