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.
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.
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/.
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:
fail2ban
: meta-paquete vacío que tiene como dependencias sólo los componentes básicos seleccionados por el distribuidor de los paquetes utilizados.fail2ban-all
: paquete que instala todos los complementos.fail2ban-firewalld
: complemento para FirewallD.fail2ban-hostsdeny
: complemento para TCP Wrappers.fail2ban-mail
: complemento que incluye todos los filtros necesarios para correo electrónico.fail2ban-sendmail
: complemento específico para Sendmail.fail2ban-server
: paquete principal con los componentes mínimos.fail2ban-shorewall
: complemento específico para Shorewall.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
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:
action_
: Sólo prohibir anfitrión remoto. Opción recomendada si prefiere evitar recibir continuos mensajes de fail2ban.action_mw
: Prohibir anfitrión remoto y enviar reporte por correo electrónico al administrador del sistema.action_mwl
: Prohibir anfitrión remoto y enviar reporte por correo electrónico incluyendo el reporte de whois
y lineas de registro relevantes.action_xarf
: Prohibir anfitrión remoto y enviar un mensaje de correo electrónico al administrador con copia para la dirección de correo electrónico de contacto para reporte de abusos de la dirección IP involucrada —determinada por la información obtenida con whois
. Incluye además líneas de registro relevantes.action_cf_mwl
: Prohibir anfitrión remoto en CloudFlare y enviar reporte por correo electrónico incluyendo el reporte de whois
y lineas de registro relevantes.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.
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, \+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
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.
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