Configuración de Fail2ban

Autor: Joel Barrios Dueñas
Correo electrónico: darkshram en gmail punto com
Sitio de Red: https://www.alcancelibre.org/

Licencia de este documento: Creative Commons Reconocimiento-NoComercial-CompartirIgual 2.1

© 1999-2022 Joel Barrios Dueñas. Usted es libre de copiar, distribuir y comunicar públicamente la obra y hacer obras derivadas bajo las condiciones siguientes: a) Debe reconocer y citar al autor original. b) No puede utilizar esta obra para fines comerciales (incluyendo su publicación, a través de cualquier medio, por entidades con fines de lucro). c) Si altera o transforma esta obra o genera una obra derivada, sólo puede distribuir la obra generada bajo una licencia idéntica a ésta. Al reutilizar o distribuir la obra, tiene que dejar bien claro los términos de la licencia de esta obra. Alguna de estas condiciones puede no aplicarse si se obtiene el permiso del titular de los derechos de autor. Los derechos derivados de usos legítimos u otras limitaciones no se ven afectados por lo anterior. Licencia completa en castellano. La información contenida en este documento y los derivados de éste se proporcionan tal cual son y los autores no asumirán responsabilidad alguna si el usuario o lector hace mal uso de éstos.

Introducción.

Acerca de Fail2ban.

Fail2Ban es un software diseñado para la prevención de intrusos en el sistema. Protege los servidores de la computadora de ataques de fuerza bruta. Está escrito en Python y ejecuta en sistemas tipo POSIX con interfaz de control de tráfico de paquetes o muro cortafuegos, como TCP Wrapper, iptables, FirewallD o Shorewall.

URL: http://www.fail2ban.org/.

Equipamiento lógico necesario.

Fail2ban está disponible en casi todos los almacenes de sofware de terceros para AlmaLinux, Rocky Linux y Red Hat™ Enterprise Linux, como sería el caso de EPEL.

Ejecute lo siguiente para utilizar EPEL:

dnf -y install epel-release

Ejecute lo siguiente para instalar Fail2ban:

dnf -y install fail2ban

Fail2ban tiene varios sub-paquetes dependiendo de las necesidades del administrador del sistema operativo:

Instale los paquetes fail2ban-mail y fail2ban-shorewall si utiliza Shorewall como muro cortafuegos.

yum -y install fail2ban-mail fail2ban-shorewall

Instale los paquetes fail2ban-mail y fail2ban-firewalld si utiliza FirewallD como muro cortafuegos.

yum -y install fail2ban-mail fail2ban-firewalld

Procedimientos.

Evite tocar el archivo /etc/fail2ban/jail.conf. Es un archivo extenso y complejo en cuanto sa contenido y será muy difícil administrar las configuraciones. Jail2ban dará prioridad a las opciones que se definan en el archivo /etc/fail2ban/jail.local.

Proceda a crear el archivo /etc/fail2ban/jail.local:

vim /etc/fail2ban/jail.local

Añada la cabecera [DEFAULT]:

[DEFAULT]

Es importante señalar que la ausencia de esta cabecera ocasionará que falle el inicio del servicio fail2ban.

Debajo de lo anterior añada lo siguiente para definir la lista blanca mínima de direcciones IP que serán excluidas de supervisión por Fail2ban:

ignoreip = 127.0.0.1/8 ::1

Añada la dirección IP y máscara de subred correspondiente a su red de área local. Ejemplo:

ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24

Defina los valores de bantime, findtime y maxretry por los que considere pertinentes. La opción bantime define el tiempo que tendrán prohibido acceder al servidor los anfitriones infractores. La opción findtime define el lapso de tiempo durante el cual un anfitrión remoto será prohibido si supera el límite intentos de acceso de maxretry. La opción maxretry define el número máximo de intentos antes de prohibir un un anfitrión. Para resumir el escenario predeterminado: los anfitriones remotos serán bloqueados por 120 minutos si dentro de un período de 10 minutos intentan acceder al menos 5 veces. Utilice el siguiente ejemplo:

bantime  = 120m
findtime  = 10m
maxretry = 5

En este escenario: los anfitriones remotos serán bloqueados por 120 minutos si dentro de un período de 10 minutos intentan acceder al menos 5 veces.

Añada lo siguiente para personalizar los valores de destemail y sender para definir la cuenta de correo electrónico hacia la cual se enviarán los reportes de actividad y la dirección de correo electrónico de origen. En esta última debe definirse una cuenta de correo local con un nombre de anfitrión plenamente calificado (FQDN). Ejemplo:

destemail = sysadmin@midominio.org
sender = root@mail.midominio.org

De modo predeterminado Fail2ban utiliza iptables para bloquear anfitriones. Es adecuado si se utiliza un cortafuegos basado exclusivamente sobre iptables.

banaction = iptables-multiport
banaction_allports = iptables-allports

Defina lo siguiente sólo si utiliza FirewallD como muro cortafuegos predeterminado:

banaction = firewallcmd-multiport
banaction_allports = firewallcmd-allports

Defina lo siguiente sólo si utiliza Shorewall como muro cortafuegos predeterminado:

banaction = shorewall
banaction_allports = shorewall

Defina el valor de action para determinar qué hará Fail2ban al prohibir un anfitrión. El valor puede ser cualquiera de los siguientes:

Para efectos de este documento se utilizará action_mwl. Para un entorno en producción probablemetne prefiera action_ para evitar recibir continuos mensajes de Fail2ban. Añada lo siguiente:

action = %(action_mwl)s

Todos los filtros están desactivados de modo predeterminado en /etc/fail2ban/jail.conf. Puede activar los filtros que guste sin necesidad de tocar este archivo.

Añada lo siguiente para habilitar el filtro de SSH.

[sshd]
enabled = true
port    = ssh

Si utiliza SSH en un puerto distinto al 22, defina éste en el valor de port. Ejemplo:

[sshd]
enabled = true
port    = 22022

Añada lo siguiente si utiliza Postfix y Dovecot:

[postfix]
enabled = true

[dovecot]
enabled = true

Añada en su lugar lo siguiente si utiliza Sendmail y Dovecot:

[sendmail-auth]
enabled = true

[dovecot]
enabled = true

Añada lo siguiente sólo si utiliza Roundcube Mail, si la configuración de éste incluye la opción $config['log_logins'] = true; en el archivo /etc/roundcubemail/config.inc.php y si existe el archivo /var/log/roundcubemail/errors.

[roundcube-auth]
enabled = true

Añada lo siguiente sólo si utiliza VSFTPD, la configuración de éste incluye la opción dual_log_enable=YES en el archivo /etc/vsftpd/vsftpd.conf y si además existe el archivo /var/log/vsftpd.log.

[vsftpd]
enabled = true

Hasta este punto, el contenido del archivo /etc/fail2ban/jail.local debe ser similar a la siguiente:

[DEFAULT]

bantime  = 120m
findtime  = 10m
maxretry = 5

ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24

destemail = sysadmin@midominio.org
sender = root@mail.midominio.org

banaction = firewallcmd-multiport
banaction_allports = firewallcmd-allports

action = %(action_mwl)s

[sshd]
enabled = true
port    = 22022
backend = systemd

[postfix]
enabled = true
backend = systemd

[dovecot]
enabled = true
backend = systemd

[roundcube-auth]
enabled = true
backend = systemd

[vsftpd]
enabled = true
backend = systemd

La configuración se verá similar a la siguiente en un escenario donde se utiliza SSH en el puerto 22022, Shorewall como muro cortafuegos predeterminado, Sendmail como MTA, Dovecot y VSFTPD:

[DEFAULT]

bantime  = 120m
findtime  = 10m
maxretry = 5

ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24

destemail = sysadmin@midominio.org
sender = root@mail.midominio.org

banaction = shorewall
banaction_allports = shorewall

action = %(action_mwl)s

[sshd]
enabled = true
port    = 22022
backend = systemd

[sendmail-auth]
enabled = true
backend = systemd

[dovecot]
enabled = true
backend = systemd

[roundcube-auth]
enabled = true
backend = systemd

[vsftpd]
enabled = true
backend = systemd

Guarde los cambios y salga del editor de texto.

Si aún no lo ha hecho, genere los archivos /var/log/roundcubemail/errors y /var/log/vsftpd.log:

touch /var/log/roundcubemail/errors
chown apache:apache /var/log/roundcubemail/errors
touch /var/log/vsftpd.log
chmod 600 /var/log/vsftpd.log

Fail2ban fallará al iniciar si definió los filtros para Roundcube Mail y VSFTPD y los archivos de registro correspondientes son inexistentes.

Activar, iniciar y reiniciar el servicio.

Ejecute lo siguiente para activar el iniciar el servicio fail2ban:

systemctl enable --now fail2ban

Ejecute lo siguiente para reiniciar el servicio fail2ban:

systemctl restart fail2ban

Ejecute lo siguiente para hacer que el servicio fail2ban vuelva a leer la configuración:

systemctl reload fail2ban

Examine el contenido del archivo /var/log/fail2ban.log en caso de haber errores al iniciar el servicio:

tail -80 /var/log/fail2ban.log

Haga las correcciones pertinentes en caso de ser necesario.

Comprobaciones:

Fail2ban incluye una herramienta denominada fail2ban-client que permite realizar tareas administrativas de manera fácil.

Ejecute lo siguiente para ver el estado del servicio:

fail2ban-client status

Lo anterior debe devolver algo similar a lo siguiente:

Status
|- Number of jail:  4
\- Jail list:   dovecot, postfix, roundcube-auth, sshd

Ejecute lo siguiente para examinar el estado de prohibiciones del filtro para dovecot:

fail2ban-client status dovecot

Lo anterior debe mostrar algo similar a lo siguiente en un sistema recién configurado:

Status for the jail: dovecot
|- Filter
|  |- Currently failed: 0
|  |- Total failed: 0
|  \- File list:    /var/log/maillog
\- Actions
   |- Currently banned: 0
   |- Total banned: 0
   \- Banned IP list:   

Para prohibir el acceso a una dirección IP en particular, puede ejecutar fail2ban-client con las opciones set, el nombre de la jaula, la opción banip y la dirección IP. Ejemplo:

fail2ban-client set dovecot banip 200.1.2.3

En un sistema que lleva algunos días operando se debe mostrar una salida similar a la siguiente:

Status for the jail: dovecot
|- Filter
|  |- Currently failed: 3
|  |- Total failed: 366
|  \- File list:    /var/log/maillog
\- Actions
   |- Currently banned: 1
   |- Total banned: 47
   \- Banned IP list:   200.1.2.3

Ejecute algo similar al siguiente ejemplo para eliminar la prohibición de una dirección IP específica:

fail2ban-client unban 200.1.2.3

Ejecute lo siguiente para eliminar todas las prohibiciones.

fail2ban-client unban --all

Ejecute lo siguiente para conocer y estudiar más detalles respecto del uso de fail2ban-client:

man 1 fail2ban-client

Bibliografía.