Instalar Fail2Ban en CentOS para proteger los accesos SSH y FTP

Fail2BanLinux

Fail2Ban es una aplicación de seguridad para servidores Unix para proteger accesos maliciosos a través de los protocolos SSH y FTP entre otras cosas. En esta guía veremos cómo instalarlo y configurarlo en CentOS, Fedora y Red Hat (RHEL).

Fail2Ban utiliza Python para revisar los logs de acceso y detectar los intentos de intrusión por fuerza bruta, creando reglas en el archivo de iptables para bloquear el acceso a ciertas IPs. En ocasiones, si miramos el log de intentos de acceso SSH o FTP, veremos que es inmenso, pudiéndose producir ataques incluso cada segundo si no tomamos las medidas adecuadas.

Instalar Fail2Ban en Centos, Fedora y Red Hat

Para instalar Fail2Ban lo primero que tendremos que hacer es habilitar el repositorio EPEL. Una vez habilitado el repositorio EPEL, utilizamos el siguiente comando de yum para instalar Fail2Ban:

# yum install fail2ban

Configuración básica de Fail2Ban

El archivo de configuración se localiza en el directorio /etc/fail2ban/jail.conf, pero necesitamos crear una copia del archivo denominada jail.local tal y como se nos indica en la cabecera del archivo.

# cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

Ahora editamos el archivo con nuestro editor preferido como por ejemplo nano o cualquier otro y realizamos los siguientes cambios en la sección [DEFAULT] del documento (los comentarios en inglés son los que vienen por defecto):

[DEFAULT]
# "ignoreip" can be an IP address, a CIDR mask or a DNS host. Fail2ban will not
 # ban a host which matches an address in this list. Several addresses can be
 # defined using space separator.
 ignoreip = 127.0.0.1/8 85.14.151.612
# External command that will take an tagged arguments to ignore, e.g. <ip>,
 # and return true if the IP is to be ignored. False otherwise.
 # ignorecommand = /path/to/command <ip>
 ignorecommand =
# "bantime" is the number of seconds that a host is banned.
 bantime = 3600
# A host is banned if it has generated "maxretry" during the last "findtime"
 # seconds.
 findtime = 600
# "maxretry" is the number of failures before a host get banned.
 maxretry = 3

El parámetro ignoreip sirve para agregar IPs que no queremos que sean baneadas por error a la lista blanca, como por ejemplo nuestra propia IP para que nunca perdamos el acceso a nuestro servidor o VPS por error. Podemos escribir tantas IPs como queramos separándolas por un espacio.

El parámetro bantime es el número de segundos que un host será bloqueado del servidor en caso de que se violen las reglas o se supere el número máximo de intentos de acceso permitidos. Dado que la mayor parte de estos intentos serán bots, se recomienda poner un valor superior a los 10 minutos que están por defecto.

El parámetro maxretry es el número de intentos fallidos de acceso antes de que la IP del host sea baneada.

findtime es el espacio de tiempo en el que deben ocurrir todos los intentos especificados en maxretry para que la  cuenta sea baneada.

Configurando ssh-iptables

Debemos asegurarnos de que la protección SSH está habilitada en la sección [ssh-iptables] del archivo de configuración.

[ssh-iptables]
enabled = true
filter = sshd
action = iptables[name=SSH, port=ssh, protocol=tcp]
sendmail-whois[name=SSH, dest=root, sender=fail2ban@example.com]
logpath = /var/log/secure
maxretry = 5

El parámetro enabled simplemente activa la protección SSH. Podemos desactivarla con el valor off.

El parámetro filter es la ruta del archivo de configuración que usa Fail2Ban para buscar patrones que coincidan. El nombre es una versión corta de etc/fail2ban/filter.d/sshd.conf

Action es también una versión corta de la ruta de los archivos situados en el directorio action.d. Aquí se definen las acciones a realizar cuando se tenga que banear una IP. iptables es la acción por defecto y se encuentra en /etc/fail2ban/action.d/iptables.conf. Las variables contenidas en iptables sirven para personalizar aún más Fail2Ban, seleccionando como protocolo por ejemplo TCP o UPD. El puerto nos permite activar la regla para el puerto SSH no estándar, puesto que ssh se refiere al puerto 22.

iptables[name=SSH, port=30000, protocol=tcp]

En caso de que queramos recibir avisos cada vez que una IP sea bloqueda, podemos modificar los parámetros de sendmail con los apropiados.

logpath es la localización del archivo de log que se seguirá y por por defecto está en /var/log/secure.

maxretry es lo mismo que habíamos explicada para la sección general, con la diferencia de que podemos especificar un valor distinto para cada servicio en caso de ser necesario.

Configuración para el servidor FTP

También podemos protegernos de accesos FTP maliciosos. Vamos a la sección [vsftpd-iptables] o a la del servidor FTP que estemos utilizando como por ejemplo proftpd y lo activamos. Para el servidor vsftpd tendríamos que configurar la siguiente sección:

[vsftpd-iptables]
enabled = true
filter = vsftpd
action = iptables[name=VSFTPD, port=21, protocol=tcp]
 sendmail-whois[name=VSFTPD, dest=you@example.com]
logpath = /var/log/vsftpd.log
maxretry = 5
bantime = 1800

Los parámetros se configuran exactamente del mismo modo que para SSH.

Reiniciando Fail2Ban

Una vez hayamos terminado de realizar la configuración adecuada, reiniciaremos Fail2Ban.

# sudo service fail2ban restart
# chkconfig fail2ban on

Podemos ver las reglas que Fail2Ban está aplicando  ejecutando:

# iptables -L

Y esto es todo, espero que os haya servido de ayuda.


Avatar de Edu Lazaro

Edu Lázaro: Ingeniero técnico en informática, actualmente trabajo como desarrollador web y programador de videojuegos.

👋 Hola! Soy Edu, me encanta crear cosas y he redactado esta guía. Si te ha resultado útil, el mayor favor que me podrías hacer es el de compatirla en Twitter 😊

Si quieres conocer mis proyectos, sígueme en Twitter.

3 comentarios en “Instalar Fail2Ban en CentOS para proteger los accesos SSH y FTP

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

“- Hey, Doc. No tenemos suficiente carretera para ir a 140/h km. - ¿Carretera? A donde vamos, no necesitaremos carreteras.”