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.
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/.
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:
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.
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
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:
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.
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