Vamos a instalar fail2ban. Para los que no saben, fail2ban es una herramienta que detecta intentos de acceso a servicios en nuestro servidor linux. Revisa que dichos intentos no sean exitosos y luego de un número definido de intentos se bloquea el acceso a la dirección IP que está generando la solicitud de acceso.
Por ejemplo, si fail2ban detecta que se intenta acceder al puerto ssh (22) de nuestra máquina sin exito durante 4 veces seguidas, el sistema envía una señal al firewall para que bloquee el acceso al servidor de origen.
Empecemos entonces.
Lo primero que debemos hacer es instalar el paquete epel-release en nuestra máquina para que se pueda instalar fail2ban.
[root@repslave2 ~]# yum install epel-release Complementos cargados:fastestmirror, langpacks Determining fastest mirrors epel/x86_64/metalink | 62 kB 00:00:00 * base: mirror.unimagdalena.edu.co * epel: mirrors.lug.mtu.edu * extras: mirror.unimagdalena.edu.co * updates: mirror.unimagdalena.edu.co base | 3.6 kB 00:00:00 epel | 4.7 kB 00:00:00 extras | 2.9 kB 00:00:00 updates | 2.9 kB 00:00:00 (1/11): extras/7/x86_64/primary_db | 249 kB 00:00:00 (3/11): epel/x86_64/group_gz | 99 kB 00:00:01 (9/11): epel/x86_64/updateinfo | 1.0 MB 00:00:04 (10/11): epel/x86_64/primary_db | 7.0 MB 00:00:08 (11/11): updates/7/x86_64/primary_db | 21 MB 00:00:42 Resolviendo dependencias --> Ejecutando prueba de transacción ---> Paquete epel-release.noarch 0:7-11 debe ser actualizado ---> Paquete epel-release.noarch 0:7-14 debe ser una actualización --> Resolución de dependencias finalizada Dependencias resueltas ====================================================================================================================================================================================================== Package Arquitectura Versión Repositorio Tamaño ====================================================================================================================================================================================================== Actualizando: epel-release noarch 7-14 epel 15 k Resumen de la transacción ====================================================================================================================================================================================================== Actualizar 1 Paquete Tamaño total de la descarga: 15 k Is this ok [y/d/N]: y Downloading packages: Delta RPMs disabled because /usr/bin/applydeltarpm not installed. advertencia:/var/cache/yum/x86_64/7/epel/packages/epel-release-7-14.noarch.rpm: EncabezadoV4 RSA/SHA256 Signature, ID de clave 352c64e5: NOKEY ] 0.0 B/s | 0 B --:--:-- ETA No se ha instalado la llave pública de epel-release-7-14.noarch.rpm epel-release-7-14.noarch.rpm | 15 kB 00:00:01 Obteniendo clave desde file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 Importando llave GPG 0x352C64E5: Usuarioid : "Fedora EPEL (7) <epel@fedoraproject.org>" Huella : 91e9 7d7c 4a5e 96f1 7f3e 888f 6a2f aea2 352c 64e5 Paquete : epel-release-7-11.noarch (@extras) Desde : /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 Está de acuerdo [s/N]:s Running transaction check Running transaction test Transaction test succeeded Running transaction Actualizando : epel-release-7-14.noarch 1/2 Limpieza : epel-release-7-11.noarch 2/2 Comprobando : epel-release-7-14.noarch 1/2 Comprobando : epel-release-7-11.noarch 2/2 Actualizado: epel-release.noarch 0:7-14 ¡Listo! [root@repslave2 ~]#
En nuestro caso el sistema encontró que epel-release se había instalado anteriormente y lo que hace es actualizar el paquete.
Luego procedemos a instalar fail2ban
[root@repslave2 ~]# yum install fail2ban fail2ban-systemd Complementos cargados:fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: mirror.unimagdalena.edu.co * epel: mirrors.lug.mtu.edu * extras: mirror.unimagdalena.edu.co * updates: mirror.unimagdalena.edu.co Resolviendo dependencias --> Ejecutando prueba de transacción ---> Paquete fail2ban.noarch 0:0.11.2-3.el7 debe ser instalado --> Procesando dependencias: fail2ban-firewalld = 0.11.2-3.el7 para el paquete: fail2ban-0.11.2-3.el7.noarch --> Procesando dependencias: fail2ban-sendmail = 0.11.2-3.el7 para el paquete: fail2ban-0.11.2-3.el7.noarch --> Procesando dependencias: fail2ban-server = 0.11.2-3.el7 para el paquete: fail2ban-0.11.2-3.el7.noarch ---> Paquete fail2ban-systemd.noarch 0:0.11.2-3.el7 debe ser instalado --> Ejecutando prueba de transacción ---> Paquete fail2ban-firewalld.noarch 0:0.11.2-3.el7 debe ser instalado ---> Paquete fail2ban-sendmail.noarch 0:0.11.2-3.el7 debe ser instalado ---> Paquete fail2ban-server.noarch 0:0.11.2-3.el7 debe ser instalado --> Resolución de dependencias finalizada Dependencias resueltas ====================================================================================================================================================================================================== Package Arquitectura Versión Repositorio Tamaño ====================================================================================================================================================================================================== Instalando: fail2ban noarch 0.11.2-3.el7 epel 16 k fail2ban-systemd noarch 0.11.2-3.el7 epel 16 k Instalando para las dependencias: fail2ban-firewalld noarch 0.11.2-3.el7 epel 16 k fail2ban-sendmail noarch 0.11.2-3.el7 epel 19 k fail2ban-server noarch 0.11.2-3.el7 epel 464 k Resumen de la transacción ====================================================================================================================================================================================================== Instalar 2 Paquetes (+3 Paquetes dependientes) Tamaño total de la descarga: 530 k Tamaño instalado: 1.5 M Is this ok [y/d/N]: y Downloading packages: (1/5): fail2ban-firewalld-0.11.2-3.el7.noarch.rpm | 16 kB 00:00:00 (2/5): fail2ban-0.11.2-3.el7.noarch.rpm | 16 kB 00:00:01 (3/5): fail2ban-sendmail-0.11.2-3.el7.noarch.rpm | 19 kB 00:00:00 (4/5): fail2ban-systemd-0.11.2-3.el7.noarch.rpm | 16 kB 00:00:02 (5/5): fail2ban-server-0.11.2-3.el7.noarch.rpm | 464 kB 00:00:04 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ Total 111 kB/s | 530 kB 00:00:04 Running transaction check Running transaction test Transaction test succeeded Running transaction Instalando : fail2ban-server-0.11.2-3.el7.noarch 1/5 Instalando : fail2ban-firewalld-0.11.2-3.el7.noarch 2/5 Instalando : fail2ban-sendmail-0.11.2-3.el7.noarch 3/5 Instalando : fail2ban-0.11.2-3.el7.noarch 4/5 Instalando : fail2ban-systemd-0.11.2-3.el7.noarch 5/5 Comprobando : fail2ban-firewalld-0.11.2-3.el7.noarch 1/5 Comprobando : fail2ban-systemd-0.11.2-3.el7.noarch 2/5 Comprobando : fail2ban-server-0.11.2-3.el7.noarch 3/5 Comprobando : fail2ban-0.11.2-3.el7.noarch 4/5 Comprobando : fail2ban-sendmail-0.11.2-3.el7.noarch 5/5 Instalado: fail2ban.noarch 0:0.11.2-3.el7 fail2ban-systemd.noarch 0:0.11.2-3.el7 Dependencia(s) instalada(s): fail2ban-firewalld.noarch 0:0.11.2-3.el7 fail2ban-sendmail.noarch 0:0.11.2-3.el7 fail2ban-server.noarch 0:0.11.2-3.el7 ¡Listo! [root@repslave2 ~]#
Iniciamos el servicio y lo habilitamos para que inicie cuando nuestro servidor se reinicie
[root@repslave2 ~]# systemctl enable fail2ban Created symlink from /etc/systemd/system/multi-user.target.wants/fail2ban.service to /usr/lib/systemd/system/fail2ban.service. [root@repslave2 ~]# systemctl start fail2ban [root@repslave2 ~]# systemctl status fail2ban ● fail2ban.service - Fail2Ban Service Loaded: loaded (/usr/lib/systemd/system/fail2ban.service; enabled; vendor preset: disabled) Active: active (running) since jue 2023-06-15 10:49:52 -05; 5s ago Docs: man:fail2ban(1) Process: 21156 ExecStartPre=/bin/mkdir -p /run/fail2ban (code=exited, status=0/SUCCESS) Main PID: 21158 (fail2ban-server) CGroup: /system.slice/fail2ban.service └─21158 /usr/bin/python2 -s /usr/bin/fail2ban-server -xf start jun 15 10:49:52 repslave2 systemd[1]: Starting Fail2Ban Service... jun 15 10:49:52 repslave2 systemd[1]: Started Fail2Ban Service. jun 15 10:49:52 repslave2 fail2ban-server[21158]: Server ready [root@repslave2 ~]#
Perfecto! Ya tenemos instalado fail2ban. ahora procedemos a configurar los servicios que queremos bloquear por intentos fallidos.
Copiamos el archivo de configuración general a un archivo que podamos modificar en nuestro servidor
[root@repslave2 ~]# cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local [root@repslave2 ~]#
Editamos el archivo recién creado , nos fijamos en las siguientes líneas
# "ignoreip" can be a list of IP addresses, CIDR masks or DNS hosts. Fail2ban # will not ban a host which matches an address in this list. Several addresses # can be defined using space (and/or comma) separator. #ignoreip = 127.0.0.1/8 ::1 # "bantime" is the number of seconds that a host is banned. bantime = 10m # A host is banned if it has generated "maxretry" during the last "findtime" # seconds. findtime = 10m # "maxretry" is the number of failures before a host get banned. maxretry = 5
ignoreip = aquí va la dirección IP o nombre de servidor que queremos que no se tenga en cuenta para los bloqueos. Este es un servidor de confianza.
bantime = Tiempo en que permanecerá bloqueada la ip “sospechosa”
findtime = Este tiempo es un indicador del periodo que se cubre en donde el servidor “sospechoso” ha realizado intentos fallidos a nuestra máquina
maxretry = Es el número de intentos fallidos que se realizan antes de ser bloqueada la IP
Esta sería la configuración general. Ahora vamos a configurar el servicio ssh como ejemplo para que a partir de este ejemplo podamos realizar la configuración de otros servicios.
Como buena práctica creamos un archivo por servicio, en este caso vamos a crear el archivo correspondiente al servicio ssh, este será /etc/fail2ban/jail.d/sshd.local
Y agregamos lo siguiente
[sshd]
enabled = true
port = ssh
action = iptables-multiport
logpath = /var/log/secure
maxretry = 5
bantime = 600
[root@repslave2 ~]# cat /etc/fail2ban/jail.d/sshd.local [sshd] enabled = true port = ssh action = iptables-multiport logpath = /var/log/secure maxretry = 5 bantime = 600 [root@repslave2 ~]#
enabled = lo dejamos en true para que se active la política correspondiente a ssh
port = ssh el puerto de servicio mencionado por el cual fail2ban vigilará el servicio.
action = describe la acción y pasos que fail2ban debe realizar para bloquear o desbloquear una dirección IP
logpath = se refiere al archivo de log que fail2ban debe verificar intentos fallidos
maxretry y bantime tienen el mismo significado del archivo principal, solo que podemos definir tiempos distintos para cada servicio. Los valores aquí indicados son en segundos.
Listo, una vez realizamos los ajustes necesarios, procedemos a reiniciar el servicio fail2ban
[root@repslave2 fail2ban]# systemctl restart fail2ban.service [root@repslave2 fail2ban]# systemctl status fail2ban.service ● fail2ban.service - Fail2Ban Service Loaded: loaded (/usr/lib/systemd/system/fail2ban.service; enabled; vendor preset: disabled) Active: active (running) since vie 2023-06-16 11:43:35 -05; 6s ago Docs: man:fail2ban(1) Process: 24354 ExecStop=/usr/bin/fail2ban-client stop (code=exited, status=0/SUCCESS) Process: 24357 ExecStartPre=/bin/mkdir -p /run/fail2ban (code=exited, status=0/SUCCESS) Main PID: 24361 (fail2ban-server) CGroup: /system.slice/fail2ban.service └─24361 /usr/bin/python2 -s /usr/bin/fail2ban-server -xf start jun 16 11:43:35 repslave2 systemd[1]: Starting Fail2Ban Service... jun 16 11:43:35 repslave2 systemd[1]: Started Fail2Ban Service. jun 16 11:43:35 repslave2 fail2ban-server[24361]: Server ready [root@repslave2 fail2ban]#
Para ver el estado de las políticas del servicio ssh en fail2ban ejecutamos el siguiente comando fail2ban-client status
[root@repslave2 fail2ban]# fail2ban-client status Status |- Number of jail: 1 `- Jail list: sshd [root@repslave2 fail2ban]#
Como podemos ver, el servicio ssh se encuentra en monitoreo por fail2ban, además podemos ejecutar el comando fail2ban-client status sshd para ver si hay IPs en la lista de rechazados.
[root@repslave2 fail2ban]# 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: [root@repslave2 fail2ban]#
Cuando tenemos IPs rechazadas, las podemos ver con el comando anterior, en el siguiente ejemplo vemos una IP rechazada. Realicé un intento de acceso por ssh de forma erronea para ilustrar el ejemplo.
[root@repslave2 fail2ban]# fail2ban-client status sshd Status for the jail: sshd |- Filter | |- Currently failed: 0 | |- Total failed: 5 | `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd `- Actions |- Currently banned: 1 |- Total banned: 1 `- Banned IP list: 192.168.10.237 [root@repslave2 fail2ban]#
En este caso la IP rechazada es la 192.168.10.237
A nivel general, cuando ejecutamos el comando iptables -L -n vemos las ips bloqueadas
[root@repslave2 fail2ban]# iptables -L -n ..... Chain f2b-sshd (1 references) target prot opt source destination REJECT all -- 192.168.10.237 0.0.0.0/0 reject-with icmp-port-unreachable RETURN all -- 0.0.0.0/0 0.0.0.0/0 [root@repslave2 fail2ban]#
Esto indica que nuestra configuración se ha llevado a cabo de forma exitosa.
Esto es todo…. Saludos…