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
-
Un servidor basado en Fedora 33 o CentOS 8 con un usuario no root con privilegios sudo.
-
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:
/etc/fail2ban/jail.conf
etc/fail2ban/jail.d/*.conf
, Alfabéticamente/etc/fail2ban/jail.local
/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.