En esta entrada, veremos como configurar Fail2Ban para localizar patrones de acceso y en consecuencia, bloquear.
Por ejemplo, viendo los logs del sistema, vemos que la IP 185.161.248.218, está intentando acceder al servidor con un usuario root (masivamente):
Feb 12 12:13:36 node01 unix_chkpwd[3947]: password check failed for user (root)
Feb 12 12:13:36 node01 sshd[3945]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=185.161.248.218 user=root
Feb 12 12:13:38 node01 sshd[3945]: Failed password for root from 185.161.248.218 port 8289 ssh2
Feb 12 12:13:38 node01 sshd[3945]: Received disconnect from 185.161.248.218 port 8289:11: Client disconnecting normally [preauth]
Feb 12 12:13:38 node01 sshd[3945]: Disconnected from authenticating user root 185.161.248.218 port 8289 [preauth]
Para ello, vamos a:
- Deshabilitar Firewall
- Instalar IPtables
- Definir entradas/salidas IPtables
- Instalar Fail2Ban
- Configurar Fail2Ban
Paramos, deshabilitamos y eliminamos el servicio FirewallD (en caso disponer)
systemctl stop firewalld
systemctl disable firewalld
systemctl mask --now firewalld
systemctl mask firewalld
yum -y remove firewalld
Instalamos IPtables
yum clean all
yum install -y iptables-services iptables-utils
systemctl enable iptables
systemctl start iptables
Configuramos reglas para iptables donde permitiremos (ACCEPT) únícamente acceso via puerto 22, 80 y 443. El resto, bloqueamos (DROP).
iptables -nvL
iptables -F INPUT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport http -j ACCEPT
iptables -A INPUT -p tcp --dport https -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -j DROP
/usr/sbin/iptables-save > /etc/sysconfig/iptables
/usr/sbin/iptables-save | uniq | iptables-restore
/usr/sbin/iptables-save > /etc/sysconfig/iptables
/usr/sbin/iptables-restore < /etc/sysconfig/iptables
/usr/libexec/iptables/iptables.init save
service iptables restart
Instalamos Fail2Ban
yum -y install epel-release
yum -y update
yum -y install sqlite fail2ban fail2ban-all geoip
systemctl enable fail2ban
systemctl start fail2ban
Llegados a este punto, el servicio ya estará funcionando. Ahora, vamos a crear una regla para bloquear accesos no deseados por el puerto 22 (SSH) durante un periodo determinado (20 minutos):
cat > /etc/fail2ban/jail.d/sshd.conf << EOF
[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
maxretry = 2
banaction = iptables-multiport[name="SSH", port="22", protocol=tcp]
bantime = 20m
backend = systemd
EOF
systemctl reload fail2ban
Para asegurar que funciona, localizamos la traza en el log:
==> /var/log/secure <==
Feb 18 20:15:39 node01 sshd[5595]: Connection from 159.89.123.103 port 48322 on 139.162.206.138 port 22
Feb 18 20:15:39 node01 sshd[5595]: Invalid user kafka from 159.89.123.103 port 48322
Feb 18 20:15:39 node01 sshd[5595]: pam_unix(sshd:auth): check pass; user unknown
Feb 18 20:15:39 node01 sshd[5595]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=159.89.123.103
Feb 18 20:15:41 node01 sshd[5595]: Failed password for invalid user kafka from 159.89.123.103 port 48322 ssh2
En este momento, Fail2Ban se ejecuta y detecta un acceso no válido por parte de 159.89.123.103 donde su ejecución (Ban) es la siguiente:
==> /var/log/fail2ban.log <==
2024-02-18 20:15:42,022 fail2ban.filter [5524]: INFO [sshd] Found 159.89.123.103 - 2024-02-18 20:15:41
2024-02-18 20:15:42,065 fail2ban.actions [5524]: NOTICE [sshd] Ban 159.89.123.103
Como se observa, se ha bloqueado la IP 159.89.123.103 en el filtro que hemos configurado anteriormente
[root@node01 ~]# fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 28
| `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
|- Currently banned: 1
|- Total banned: 5
`- Banned IP list: 159.89.123.103
Quien es 159.89.123.103? Que reputación tiene? Lo podemos ver el en AbuseIPDB aunque ya se aprecia que era un acceso ilícito que hemos bloqueado con facilidad
Pasados los 20 minutos, anteriormente configurados, veremos que se aplica automáticamente un desbloqueo (Unban):