En esta ocasión veremos cómo instalar Fail2Ban en CentOS 7 paso a paso, de modo que protegeremos los servicios críticos de nuestro servidor o VPS CentOS contra usuarios maliciosos y ataques, ya que en algunos escenarios no basta sólo con tener el firewall activado.
Contenido
Antes de instalar Fail2Ban en CentOS 7
Para poder seguir esta guía de instalación de Fail2Ban en CentOS 7 deberías partir de unos requisitos básicos:
- Un sistema CentOS 7 actualizado.
- Un usuario con permisos de sudo o el mismo root.
- Conexión a Internet.
- Otros sistemas en red para probar la conectividad.
Es interesante que el servidor CentOS 7 en el que vas a instalar Fail2Ban ya cuente con los servicios que quieres proteger para empezar a probar filtros.
Cómo instalar Fail2Ban en CentOS 7
Vamos a instalar Fail2Ban en CentOS 7 usando los paquetes disponibles en el repositorio EPEL, por lo que la primera acción es instalar este repositorio imprescindible para CentOS 7 si no lo habías hecho anteriormente:
~$ sudo yum install -y epel-release
El paso lógico será actualizar las listas de paquetes y, por qué no, aprovechar para actualizar los paquetes instalados:
~$ sudo yum update -y
El paquete que buscamos es fail2ban, así que procedemos a instalarlo en CentOS 7 también con la herramienta yum:
~$ sudo yum install -y fail2ban
Se descargarán e instalarán el paquete fail2ban y sus dependencias, y al terminar el proceso tendremos un nuevo servicio disponible en CentOS 7, el servicio fail2ban.service o simplemente fail2ban.
Como ocurre habitualmente en CentOS 7, el nuevo servicio fail2ban no queda en ejecución tras la instalación, ni tampoco está activado para iniciar automáticamente en cada arranque de CentOS 7, así que solucionaremos ambas situaciones con un solo comando:
~$ sudo systemctl enable --now fail2ban
En estos momentos ya está en ejecución el servicio fail2ban y listo para iniciar automáticamente con CentOS 7. Puedes comprobar el estado del servicio siempre que lo necesites con el comando systemctl status fail2ban
:
Cómo configurar Fail2Ban en CentOS 7
Al empezar a configurar Fail2Ban en CentOS 7 hay que tener en cuenta la gran cantidad de archivos de configuración de que consta, organizados bajo la ruta /etc/fail2ban/.
El archivo principal es jail.conf pero en vez de editarlo lo habitual es trabajar sobre jail.local, que inicialmente no existe, para evitar que futuras actualizaciones sobrescriban las configuraciones actuales.
En el directorio filter.d/ encontraremos una serie de filtros ya predefinidos para multitud de servicios.
Y en jail.d/ podemos situar configuraciones individuales para cada «jaula» que establezcamos, si no lo hacemos a través del archivo jail.local.
Empezaremos con la configuración general, creando el nuevo archivo jail.local:
~$ sudo nano /etc/fail2ban/jail.local
El contenido inicial podría ser el siguiente:
[DEFAULT] ignoreip = 192.168.1.0/24 bantime = 43200 findtime = 300 maxretry = 3
La explicación de las directivas y sus valores es la siguiente:
- Con ignoreip excluimos direcciones o redes de la supervisión de Fail2Ban (nuestra propia dirección IP, red local, etc.). Podría ser una lista separada por espacios en blanco.
- El tiempo de bloqueo se establece con bantime, en este ejemplo serían 12 horas (43.200 segundos).
- La directiva findtime establece el tiempo, a partir del momento actual, durante el que se toman en cuenta los posibles ataques, en el ejemplo serían los últimos 300 segundos.
- El tope de fallos que dispara el bloqueo se configura en maxretry.
En este ejemplo, por tanto, al cometer 3 conexiones maliciosas (según el criterio de los filtros que vayamos a usar) durante los últimos 5 minutos, el firewall bloqueará la dirección IP infractora durante 12 horas. Puedes, por supuesto establecer tus propios valores de configuración.
Estos son valores por defecto, cada jaula puede personalizar sus propios valores, según las características del servicio a proteger y de la naturaleza de los posibles ataques.
Jaula de Fail2Ban para SSH en CentOS 7
La configuración actual de Fail2Ban de por sí no hace nada, ya que es necesario crear las jaulas para los servicios que queremos proteger.
Empezaremos añadiendo una jaula sencilla para el servicio SSH. Usaremos el enfoque de crear archivos individuales en el directorio jail.d/, así que crearemos la nueva jaula:
~$ sudo nano /etc/fail2ban/jail.d/10-sshd.conf
El contenido es el siguiente:
[sshd] enabled = true
Guardamos los cambios y cerramos el archivo.
Básicamente la etiqueta entre corchetes es el nombre de la jaula y, si no incluyes una directiva filter, hace referencia al filtro que se va a usar, que debe coincidir con el nombre de alguno de los filtros presentes en el directorio filter.d/:
~$ ls -l /etc/fail2ban/filter.d/sshd.conf -rw-r--r--. 1 root root 4487 may 11 2017 /etc/fail2ban/filter.d/sshd.conf
Y la directiva enabled simplemente indica si se activa la jaula o no. Por tanto no hace falta borrar el archivo de configuración de una jaula para desactivarla, bastará con indicar el valor false en la directiva enabled.
Este es un caso de jaula que se puede utilizar sin configurar, basta con activar.
Recargamos la configuración del servicio fail2ban como cualquier otro servicio:
~$ sudo systemctl reload fail2ban
Para probar el funcionamiento de Fail2Ban en CentOS 7 realizaremos repetidos intentos fallidos de conexión con un cliente SSH desde otra máquina, fallando la contraseña de acceso:
Vemos que a partir de un momento dado la conexión se rechaza, ¡hemos sido bloqueados! Si echamos un vistazo al log de Fail2Ban, en /var/log/fail2ban.log, veremos lo siguiente:
~$ sudo tail /var/log/fail2ban.log ... ...16:48:39,066 fail2ban.filter [1860]: INFO [sshd] Found 192.168.0.100 ...16:48:41,322 fail2ban.filter [1860]: INFO [sshd] Found 192.168.0.100 ...16:48:46,336 fail2ban.filter [1860]: INFO [sshd] Found 192.168.0.100 ...16:48:46,487 fail2ban.actions [1860]: NOTICE [sshd] Ban 192.168.0.100
Jaula de Fail2Ban para MariaDB en CentOS 7
Vamos a añadir una jaula para MariaDB que bloqueará los intentos de conexión remota al servicio. Si buscas en filter.d/ no encontrarás filtros específicos par MariaDB, pero existe un filtro para MySQL, mysqld-auth.conf, que podremos usar. Si le echamos un vistazo a su contenido, entre los comentarios podremos leer esto:
... # To log wrong MySQL access attempts add to /etc/my.cnf in [mysqld]: # log-error=/var/log/mysqld.log # log-warning = 2 ...
El filtro indica cómo debe ser la configuración de MySQL en cuanto al nombre del archivo de registro o log y el nivel de los eventos a registrar.
Editamos el archivo de configuración de MariaDB:
~$ sudo nano /etc/my.cnf
Y en la sección mysqld añadiremos la directiva log-warning:
... log-warning=2 ...
Guardamos los cambios y reiniciamos el servicio MariaDB.
El archivo de log de MariaDB se guarda en una ubicación y con un nombre distinto al de MySQL pero, como habrás visto, no lo hemos cambiado. Solucionaremos esto en la configuración de la jaula, que creamos a continuación:
~$ sudo nano /etc/fail2ban/jail.d/20-mariadb.conf
El contenido tendrá una estructura similar al del ejemplo anterior, pero incluyendo nuevas directivas:
[mariadb] enabled = true filter = mysqld-auth logpath = /var/log/mariadb/mariadb.log
Esta vez hemos usado un nombre personalizado para la jaula, mariadb, que no coincide con ningún filtro existente, por lo que incluimos la directiva filter para especificar el filtro que se debe usar.
La directiva logpath indica al filtro mysqld-auth la ruta donde se encuentra el archivo de registro ya que, como sabemos MySQL y MariaDB usan rutas y nombres distintos.
Hemos terminado de configurar la jaula para MariaDB, así que podemos guardar los cambios, cerrar el archivo y recargar la configuración del servicio fail2ban:
~$ sudo systemctl reload fail2ban
Probaremos la nueva jaula conectando repetidamente desde otra máquina al servicio MariaDB para ver qué ocurre:
Al cuarto intento se rechaza la conexión, hemos sido bloqueados de nuevo.
Esto es lo que registraba mientras tanto Fail2Ban en la máquina CentOS 7:
... ...20:02:16,397 fail2ban.filter [2070]: WARNING Determined IP using DNS Lookup: debian9.local = ['192.168.0.100'] ...20:02:16,398 fail2ban.filter [2070]: INFO [mariadb] Found 192.168.0.100 ...20:02:26,421 fail2ban.filter [2070]: WARNING Determined IP using DNS Lookup: debian9.local = ['192.168.0.100'] ...20:02:26,422 fail2ban.filter [2070]: INFO [mariadb] Found 192.168.0.100 ...20:02:33,441 fail2ban.filter [2070]: WARNING Determined IP using DNS Lookup: debian9.local = ['192.168.0.100'] ...20:02:33,442 fail2ban.filter [2070]: INFO [mariadb] Found 192.168.0.100 ...20:02:33,860 fail2ban.actions [2070]: NOTICE [mariadb] Ban 192.168.0.100 ...
Cómo eliminar un bloqueo
Si por cualquier circunstancia necesitamos eliminar un bloqueo de una dirección IP, usaremos el cliente fail2ban-client, indicando la jaula sobre la que queremos actuar y la dirección IP:
~$ sudo fail2ban-client set sshd unbanip 192.168.0.100
La dirección IP queda liberada, de hecho Fail2Ban registrará el evento en su archivo de log:
... ...17:06:16,871 fail2ban.actions [1860]: NOTICE [sshd] Unban 192.168.0.100 ...
Puedes desbloquear una dirección IP previamente bloqueada por Fail2Ban, pero esto no elimina el registro de actividad de esta dirección IP, por tanto si los intentos anteriores de conexión entran todavía dentro del período de tiempo a tener en cuenta (el findtime), un único nuevo fallo en la conexión provocaría el bloqueo inmediato.
Estado de Fail2Ban en CentOS 7
Una forma fácil de saber qué jaulas tiene activadas Fail2Ban en nuestro sistema CentOS 7 sería a través del cliente fail2ban-client:
~$ sudo fail2ban-client status Status |- Number of jail: 2 `- Jail list: mariadb, sshd
Veremos cuántas jaulas hay activas y qué filtros emplean. Puedes obtener información sobre una jaula concreta añadiendo al comando anterior su nombre:
~$ sudo fail2ban-client status sshd Status for the jail: sshd |- Filter | |- Currently failed: 0 | |- Total failed: 5 | `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd `- Actions |- Currently banned: 1 |- Total banned: 1 `- Banned IP list: 192.168.0.100
Conclusión
Acabas de ver cómo instalar y configurar Fail2Ban en CentOS 7 y estoy seguro de que estás sorprendido de su potencia y con ganas de aplicarlo a los servicios de tu propio servidor o VPS CentOS. Y no es para menos, yo también me asombré cuando lo descubrí. Lo que sí hay que reconocer es que algunos filtros pueden causar algún dolor de cabeza hasta conseguir modificarlos o adaptarlos a nuestras necesidades, pero es un trabajo que merece sin duda la pena.
Si tienes alguna duda, pregunta, sugerencia, etc. puedes dejar un comentario.
¡Apoya comoinstalar.me!
Si esta guía de instalación y configuración de Fail2Ban en CentOS 7 te ha resultado útil (que estoy seguro de que sí), quizás quieras contribuir mínimamente al mantenimiento de este sitio. Un buen apoyo a esta guía motivará la ampliación a otros filtros de Fail2Ban y más artículos relacionados.
Puedes hacerlo dejando una propina de tan sólo 1 $ en PayPal:
O, si te sientes especialmente agradecido, puedes invitarme a un café:
¡Gracias!
Deberías dejar posibilidad de donar más… 🙂
No te imaginas la ayuda que me das. Es un dolor de cabeza esa molestia de los ataques.
Gracias.
¡Me alegro de que te sirva, Omar! Yo mismo uso Fail2Ban para proteger el servidor que aloja este sitio web.
¡Y gracias por el apoyo!