Cómo instalar y configurar Fail2Ban en CentOS 8 y Fedora 33

Fail2Ban es una utilidad de análisis de registros que escanea los archivos de registro de varios procesos y prohíbe las direcciones IP que cometen demasiados fallos de contraseña. Cuando se localice un intento de inicio de sesión, Fail2Ban añadirá una nueva regla a iptables para bloquear la dirección IP del atacante, de forma temporal o permanente. También puede alertarte por correo electrónico de lo mismo.

Se centra principalmente en la detección de intrusiones a través de SSH, pero puede configurarse para que funcione con cualquier servicio que utilice archivos de registro.

Requisitos previos

  1. Un servidor basado en Fedora 33 o CentOS 8 con un usuario no root con privilegios sudo.

  2. Instalar el editor Nano porque es lo que vamos a utilizar.

    $ sudo dnf install nano -y
    

Instalar Fail2Ban

Para instalar Fail2Ban en CentOS 8, necesitas instalar primero el repositorio EPEL Yum.

$ sudo dnf install epel-release

Fedora 33 viene con Fail2Ban.

Ejecuta el siguiente comando para instalar Fail2Ban tanto en Fedora 33 como en CentOS 8.

$ sudo dnf install fail2ban

Una vez instalado, tenemos que habilitar el servicio.

$ sudo systemctl enable fail2ban

A continuación, inicia el servicio Fail2Ban.

$ sudo systemctl start fail2ban

Ahora puedes comprobar el estado del servicio para ver si funciona correctamente.

$ sudo systemctl status fail2ban
? fail2ban.service - Fail2Ban Service
     Loaded: loaded (/usr/lib/systemd/system/fail2ban.service; enabled; vendor preset: disabled)
     Active: active (running) since Mon 2020-11-02 21:15:59 UTC; 5s ago
       Docs: man:fail2ban(1)
    Process: 19031 ExecStartPre=/bin/mkdir -p /run/fail2ban (code=exited, status=0/SUCCESS)
   Main PID: 19032 (f2b/server)
      Tasks: 3 (limit: 1125)
     Memory: 11.0M
        CPU: 96ms
     CGroup: /system.slice/fail2ban.service
             ??19032 /usr/bin/python3 -s /usr/bin/fail2ban-server -xf start

Nov 02 21:15:59 howtoforge-tutorial systemd[1]: Starting Fail2Ban Service...
Nov 02 21:15:59 howtoforge-tutorial systemd[1]: Started Fail2Ban Service.
Nov 02 21:15:59 howtoforge-tutorial fail2ban-server[19032]: Server ready

Configurar Fail2Ban

El servicio Fail2Ban guarda sus archivos de configuración en el directorio /etc/fail2ban. En él encontrarás un archivo jail.conf. Este archivo suele anularse durante las actualizaciones de los paquetes, por lo que no debería editarse.

En su lugar, todas las configuraciones deben hacerse en un nuevo archivo que llamaremos jail.local. Las configuraciones de estos 2 archivos pueden ser anuladas a través de los archivos del directorio /etc/fail2ban/jail.d/.

Las configuraciones se aplican en el siguiente orden:

  1. /etc/fail2ban/jail.conf
  2. etc/fail2ban/jail.d/*.conf, Alfabéticamente
  3. /etc/fail2ban/jail.local
  4. /etc/fail2ban/jail.d/*.local, Alfabéticamente

jail.conf contiene una sección [DEFAULT] seguida de secciones para servicios individuales. Cualquiera de estas secciones puede anularse definiéndolas en los archivos .local.

Configurar jail.local

Vamos a crear un nuevo archivo jail.local.

$ sudo nano /etc/fail2ban/jail.local

Pega en él el siguiente código.

[DEFAULT]
# Ban hosts for one hour:
bantime = 3600

# Override backend=auto in /etc/fail2ban/jail.conf
backend = systemd

[sshd]
enabled = true

Pulsa Ctrl + X para cerrar el editor y pulsa Y cuando se te pida que guardes el archivo. Esto establece un nuevo bantime por defecto para todos los servicios, cambia el backend a systemd y habilita la jaula `sshd.

Reinicia Fail2ban para aplicar los nuevos cambios.

$ sudo systemctl restart fail2ban

Podemos confirmar la configuración recién aplicada utilizando la utilidad fail2ban-client.

$ sudo fail2ban-client status
Status
|- Number of jail:      1
`- Jail list:   sshd

También podemos obtener el estado detallado de cada jaula específicamente de la siguiente manera.

$ sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
|  |- Currently failed: 0
|  |- Total failed:     0
|  `- Journal matches:  _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
   |- Currently banned: 0
   |- Total banned:     0
   `- Banned IP list:

Más ajustes

jail.conf proporciona muchas más configuraciones que se pueden personalizar mediante el archivo /jail.local. A continuación veremos algunos ajustes.

Lista blanca de IP

Puedes poner en una lista blanca/ignorar IPs para que no sean bloqueadas por Fail2ban utilizando el siguiente código.

[DEFAULT]
ignoreip = 127.0.0.1/8 123.45.67.89

Si quieres poner en la lista blanca IPs sólo para determinadas cárceles, puedes hacerlo a través de fail2ban-client.

$ sudo fail2ban-client set JAIL addignoreip 123.45.67.89

Sustituye JAIL en el comando anterior por el nombre de la cárcel para la que quieres editar la configuración.

Tiempo de prohibición y cantidad de reintentos

Hay 3 ajustes que pueden establecer el tiempo y el número de reintentos para un baneo.

bantime - es el tiempo, en segundos, durante el cual se banea una IP. Para establecer un baneo permanente, fija este valor en un número negativo. El valor por defecto es de 10 minutos o 600 segundos.

findtime - es la duración del tiempo entre intentos de acceso antes de que se establezca un baneo. Este valor es siempre un número de segundos. Por ejemplo, si Fail2ban está configurado para prohibir una IP después de 5 intentos fallidos de inicio de sesión, esos 5 intentos deben ocurrir dentro del límite de 10 minutos establecido en bantime.

maxretry - es el número de reintentos desde una misma dirección IP antes de que se imponga un baneo. El valor por defecto es 3.

Para personalizar estos ajustes, pega las siguientes líneas en el archivo \etc\fail2ban\jail.local en la sección [DEFAULT].

bantime = 3600
findtime = 300
maxretry = 4

Alertas por correo electrónico

Para enviar alertas por correo electrónico, tendrás que instalar primero un Agente de Transferencia de Correo (MTA). Para nuestro propósito, instalaremos sendmail.

$ sudo dnf install sendmail

Para recibir el correo electrónico, añade el siguiente código en el archivo \etc\fail2ban\jail.local en la sección [DEFAULT].

destemail = [email protected]
sendername = Fail2Ban
mta = sendmail
action = %(action_mw)s

destemail se refiere al ID de correo electrónico de destino, que es el ID en el que quieres recibir los correos, sendername se refiere al nombre del remitente, por lo que estamos utilizando Fail2Ban para ello. mta se refiere al Agente de Transferencia de Correo que se está utilizando, que aquí es sendmail. Si estás utilizando Postfix, entonces utiliza el valor mail para la variable mta.

action se refiere a la acción por defecto que se lleva a cabo una vez que se detecta una intrusión. El valor por defecto es %(action_)s, que sólo banea al usuario. %(action_mw)s banea y envía un correo electrónico con un informe Whois; mientras que %(action_mwl)s banea y envía un correo electrónico con el informe Whois junto con la información de los archivos de registro pertinentes. Esto también puede cambiarse en función de la cárcel.

Ajustes para cárceles individuales

Como ya sabemos, la sección [DEFAULT] se aplica a todas las Cárceles, es hora de examinar algunas Cárceles específicas y su configuración.

Cárcel SSHD

Ya hemos definido anteriormente [sshd] en nuestro archivo jail.local. Podemos personalizarlo un poco más con el siguiente código.

[sshd]

enabled = true
port = ssh
logpath = %(ssh_log)s

En este caso, estamos utilizando una variable predefinida ssh para el puerto que es el puerto SSH por defecto. Si utilizas un puerto SSH diferente, debes cambiarlo. logpath se refiere a la ubicación del archivo de registro a monitorizar. %(ssh_log)s utiliza un valor definido en el archivo de configuración estándar de Fail2ban (/etc/fail2ban/paths-common.conf).

Cárcel de Nginx

Nginx tiene varias Cárceles que se pueden utilizar en Fail2Ban. Por ejemplo, si una parte de tu sitio protegida por contraseña es atacada repetidamente, puedes utilizar una sección [nginx-http-auth] en el archivo jail.local para ello.

[nginx-http-auth]
enabled = true

También podemos añadir una sección llamada [nginx-botsearch] para detener las peticiones a carpetas o ubicaciones que no existen.

[nginx-badbots]
enabled  = true

También hay otras jaulas Nginx, pero no vienen preconfiguradas con Fail2Ban. Hay que crearlas manualmente y la mayoría de ellas pueden basarse en las de Apache que incluye Fail2Ban.

Filtros Fail2Ban y Failregexs

Hay otro ajuste en la configuración de Fail2Ban llamado filtros. Los filtros deciden si una línea del archivo de registro indica una autenticación fallida.

El valor del filtro en el archivo de configuración es una referencia a un archivo situado en el directorio /etc/fail2ban/filter.d con su extensión .conf eliminada.

Puedes ver qué tipo de filtros están disponibles comprobando el directorio.

$ ls /etc/fail2ban/filter.d

Verás en él 2 archivos de registro para Nginx; nginx-badbots.conf y nginx-http-auth.conf.

Estos archivos de configuración utilizan expresiones regulares (regex) para analizar los archivos de registro. Se denominan Failregexs. Puedes personalizar o crear nuevos filtros escribiendo tus propias expresiones regulares. No cubriremos estas expresiones regulares en profundidad porque están fuera del alcance de este tutorial.

Supervisar los registros de Fail2Ban y el cortafuegos

Puedes comprobar el estado de Fail2Ban utilizando systemctl como se ha dicho anteriormente.

$ sudo systemctl status fail2ban

Para obtener un poco más de detalle, puedes utilizar el comando journalctl.

$ sudo journalctl -b -u fail2ban

También puedes utilizar fail2ban-client para consultar el estado de fail2ban-server o de una cárcel individual.

$ sudo fail2ban-client status
$ sudo fail2ban-client status jail_name

También puedes consultar el archivo de registro de Fail2ban.

$ sudo tail -F /var/log/fail2ban.log

Puedes listar las reglas actuales configuradas para iptables.

$ sudo iptables -L

También puedes listar las reglas de iptables en un formato que refleje los comandos necesarios para activar esas reglas.

$ sudo iptables -S

Conclusión

Con esto concluye nuestro tutorial sobre la instalación y configuración de Fail2Ban en un servidor basado en Fedora 33 o CentOS 8. Si tienes alguna pregunta, publícala en los comentarios de abajo.

También te podría gustar...