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-2024 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.

Los ataques de fuerza bruta realizados por los cientos de miles de robots que rondan por Internet pueden generar muchos problemas en servidores en producción. La mejor herramientas para bloquear este tipo de acceso es Fail2ban.

Acerca de Fail2ban.

Fail2Ban es un software diseñado para la prevención de intrusos en el sistema. Protege los servicios 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 software de terceros para Alma Linux, 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.

dnf -y install fail2ban-mail fail2ban-shorewall

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

dnf -y install fail2ban-mail fail2ban-firewalld

Procedimientos.

Evite tocar el archivo /etc/fail2ban/jail.conf. Es un archivo extenso y complejo en cuanto su contenido y será muy difícil administrar las configuraciones. Fail2ban 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 sub-red 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.

Protección para Nginx.

Genere el archivo /etc/fail2ban/filter.d/nginx-noscript.conf:

vim /etc/fail2ban/filter.d/nginx-noscript.conf

Añada el siguiente contenido:

[Definition]

failregex = ^<HOST> -.*GET.*(\.asp|\.aspx|\.exe|\.jsp|\.php|\.pl|\.cgi|\.scgi)

ignoreregex =

Lo anterior define se consideren como accesos que serán prohibidos los fallos ―errores 404― de todas las expresiones regulares que coincidan con las extensiones mostradas arriba al acceder a un URL.

Guarde los cambios y salga del editor de texto.

Edite nuevamente el archivo /etc/fail2ban/jail.local:

vim /etc/fail2ban/jail.local

Añada el siguiente contenido:

[nginx-noscript]
enabled  = true
port     = http,https
filter   = nginx-noscript
maxretry = 2
nginx_access_log = /var/log/nginx/*-access_log
logpath  = %(nginx_access_log)s

Guarde los cambios y salga del editor de texto.

Edite el archivo /etc/fail2ban/filter.d/nginx-http-auth.conf:

vim /etc/fail2ban/filter.d/nginx-http-auth.conf

Para considerar se filtren los fallos de autenticación al acceder a alguna parte del sitio Web, cambie el contenido existente para que coincida con lo siguiente:

# fail2ban filter configuration for nginx

[Definition]

failregex = ^ \[error\] \d+#\d+: \*\d+ user "(?:[^"]+|.*?)":? (?:password mismatch|was not found in "[^\"]*"), client: <HOST>, server: \S*, request: "\S+ \S+ HTTP/\d+\.\d+", host: "\S+"(?:, referrer: "\S+")?\s*$
            ^ \[error\] \d+#\d+: \*\d+ no user/password was provided for basic authentication, client: <HOST>, server: \S+, request: "\S+ \S+ HTTP/\d+\.\d+", host: "\S+"\s*$

ignoreregex = 

datepattern = {^LN-BEG}

# DEV NOTES:
# Based on samples in https://github.com/fail2ban/fail2ban/pull/43/files
# Extensive search of all nginx auth failures not done yet.
# 
# Author: Daniel Black

Guarde los cambios y salga del editor de texto.

Edite nuevamente el archivo /etc/fail2ban/jail.local:

vim /etc/fail2ban/jail.local

Añada el siguiente contenido:

[nginx-http-auth]
enabled  = true
filter   = nginx-http-auth
port     = http,https
nginx_error_log = /var/log/nginx/*-error_log
logpath  = %(nginx_error_log)s

Guarde los cambios y salga del editor de texto.

Para bloquear los robots indeseables que rondan por Internet indexando los contenidos de los sitios Web, genere el archivo /etc/fail2ban/filter.d/nginx-badbots.conf:

vim /etc/fail2ban/filter.d/nginx-badbots.conf

Añada el siguiente contenido:

# Fail2Ban configuration file
#
# Regexp to catch known spambots and software alike. Please verify
# that it is your intent to block IPs which were driven by
# above mentioned bots.

[Definition]

badbotscustom = EmailCollector|WebEMailExtrac|TrackBack/1\.02|sogou music spider|(?:Mozilla/\d+\.\d+ )?Jorgee
badbots = Atomic_Email_Hunter/4\.0|atSpider/1\.0|autoemailspider|bwh3_user_agent|China Local Browse 2\.6|ContactBot/0\.2|ContentSmartz|DataCha0s/2\.0|DBrowse 1\.4b|DBrowse 1\.4d|Demo Bot DOT 16b|Demo Bot Z 16b|DSurf15a 01|DSurf15a 71|DSurf15a 81|DSurf15a VA|EBrowse 1\.4b|Educate Search VxB|EmailSiphon|EmailSpider|EmailWolf 1\.00|ESurf15a 15|ExtractorPro|Franklin Locator 1\.8|FSurf15a 01|Full Web Bot 0416B|Full Web Bot 0516B|Full Web Bot 2816B|Guestbook Auto Submitter|Industry Program 1\.0\.x|ISC Systems iRc Search 2\.1|IUPUI Research Bot v 1\.9a|LARBIN-EXPERIMENTAL \(efp@gmx\.net\)|LetsCrawl\.com/1\.0 \+http\://letscrawl\.com/|Lincoln State Web Browser|LMQueueBot/0\.2|LWP\:\:Simple/5\.803|Mac Finder 1\.0\.xx|MFC Foundation Class Library 4\.0|Microsoft URL Control - 6\.00\.8xxx|Missauga Locate 1\.0\.0|Missigua Locator 1\.9|Missouri College Browse|Mizzu Labs 2\.2|Mo College 1\.9|MVAClient|Mozilla/2\.0 \(compatible; NEWT ActiveX; Win32\)|Mozilla/3\.0 \(compatible; Indy Library\)|Mozilla/3\.0 \(compatible; scan4mail \(advanced version\) http\://www\.peterspages\.net/?scan4mail\)|Mozilla/4\.0 \(compatible; Advanced Email Extractor v2\.xx\)|Mozilla/4\.0 \(compatible; Iplexx Spider/1\.0 http\://www\.iplexx\.at\)|Mozilla/4\.0 \(compatible; MSIE 5\.0; Windows NT; DigExt; DTS Agent|Mozilla/4\.0 efp@gmx\.net|Mozilla/5\.0 \(Version\: xxxx Type\:xx\)|NameOfAgent \(CMS Spider\)|NASA Search 1\.0|Nsauditor/1\.x|PBrowse 1\.4b|PEval 1\.4b|Poirot|Port Huron Labs|Production Bot 0116B|Production Bot 2016B|Production Bot DOT 3016B|Program Shareware 1\.0\.2|PSurf15a 11|PSurf15a 51|PSurf15a VA|psycheclone|RSurf15a 41|RSurf15a 51|RSurf15a 81|searchbot admin@google\.com|ShablastBot 1\.0|snap\.com beta crawler v0|Snapbot/1\.0|Snapbot/1\.0 \(Snap Shots&#44; \+http\://www\.snap\.com\)|sogou develop spider|Sogou Orion spider/3\.0\(\+http\://www\.sogou\.com/docs/help/webmasters\.htm#07\)|sogou spider|Sogou web spider/3\.0\(\+http\://www\.sogou\.com/docs/help/webmasters\.htm#07\)|sohu agent|SSurf15a 11 |TSurf15a 11|Under the Rainbow 2\.2|User-Agent\: Mozilla/4\.0 \(compatible; MSIE 6\.0; Windows NT 5\.1\)|VadixBot|WebVulnCrawl\.unknown/1\.0 libwww-perl/5\.803|Wells Search II|WEP Search 00

failregex = ^<HOST> -.*"(GET|POST|HEAD).*HTTP.*"(?:%(badbots)s|%(badbotscustom)s)"$

ignoreregex =

datepattern = ^[^\[]*\[({DATE})
              {^LN-BEG}

# DEV Notes:
# List of bad bots fetched from http://www.user-agents.org
# Generated on Thu Nov  7 14:23:35 PST 2013 by files/gen_badbots.
#
# Author: Yaroslav Halchenko

Guarde los cambios y salga del editor de texto.

Edite nuevamente el archivo /etc/fail2ban/jail.local:

vim /etc/fail2ban/jail.local

Añada el siguiente contenido:

[nginx-badbots]
enabled  = true
port     = http,https
filter   = nginx-badbots
maxretry = 2
nginx_access_log = /var/log/nginx/*-access_log
logpath  = %(nginx_access_log)s

Guarde los cambios y salga del editor de texto.

Reinicie el servicio fail2ban:

systemctl restart fail2ban

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.