Contenidos
- 1 Introducción
- 2 Instalación y configuración
- 3 Comprobar IPs bloqueadas
- 4 Bloquear IP
- 5 Desbloquear IP
- 6 Envío de avisos por email
- 7 Comprobación de errores (testing filters)
- 8 Comprobar la configuración
- 9 Saber país de origen de las IP bloqueadas
- 10 Reportar IPs bloqueadas a AbuseIPDB
- 11 Alternativas
- 12 Más información
Introducción
Si tenemos instalado un servidor Linux con acceso desde el exterior por SSH podemos comprobar en el fichero /var/log/auth.log muchas entradas del tipo:Failed password for invalid user 1234 from 163.172.227.51 port 61482 ssh2
May 22 12:41:12 server sshd[13690]: Invalid user admin from 163.172.227.51
May 22 12:41:12 server sshd[13690]: input_userauth_request: invalid user admin [preauth]
May 22 12:41:15 server sshd[13690]: Failed password for invalid user admin from 163.172.227.51 port 62014 ssh2
May 22 13:03:13 server sshd[13933]: Invalid user support from 222.254.76.38
May 22 13:03:13 server sshd[13933]: input_userauth_request: invalid user support [preauth]
May 22 13:03:16 server sshd[13933]: Failed password for invalid user support from 222.254.76.38 port 39190 ssh2
Son intentos de acceso por fuerza bruta fallidos que podemos evitar gracias a fail2ban.
Fail2ban es un potente programa que comprueba los logs de distintos servicios y, si encuentra varios intentos de acceso fallidos desde la misma IP, la bloquea a través de iptables.
Viene configurado por defecto para filtrar accesos por SSH, pero también puede filtrar accesos por Apache, MySQL, Postfix y más. Cada uno de los filtros por servicio los define como jails, así podemos hablar de jail de SSH, jail de Apache, etc.
Instalación y configuración
Veamos como podemos instalar y configurar fail2ban en Ubuntu 16.04:
sudo apt install fail2ban
El fichero de configuración es /etc/fail2ban/jail.conf, pero lo copiaremos como jail.local y trabajaremos sobre esta copia, ya que el jail.conf se puede sobreescribir en posteriores actualizaciones del sistema:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Editaremos jail.local, atentiendo a estos parámetros bajo la sección [DEFAULT]:
- ignoreip: Aquí podemos indicar IPs que fail2ban no bloqueará. Por defecto es 127.0.0.1/8, para evitar bloquear al propio servidor. Podemos indicar otras IPs separadas por espacio.
- bantime: Tiempo en segundos que permanecerá bloqueado un equipo. Podemos poner -1 para un bloqueo permanente.
- findtime: Tiempo en que se comprueban los accesos fallidos desde una IP. 600 segundos por defecto. Trabaja en conjunto con maxretry.
- maxretry: Máximo número de intentos fallidos durante el tiempo indicado en findtime antes de bloquear una IP. 3 por defecto. Así, por ejemplo, si hay desde una misma IP 3 intentos de acceso fallidos en 600 segundos, la bloqueará.
Si queremos que fail2ban monitorice otro servicio aparte de SSH, vamos a /etc/fail2ban/jail.d/, copiamos el archivo defaults-debian.conf a defaults-debian.local y añadimos ahí los servicios que queramos monitorizar con este formato:
[sshd]
enabled = true
[sshd-ddos]
enabled = true
Me gusta añadir siempre monitorización para los ataques de ddos además de los de SSH. Podemos comprobar todos los servicios disponibles para monitorizar en el fichero jail.local (vienen entre corchetes).
Una vez hechos los cambios los hacemos efectivos con:
service fail2ban reload
Para comprobar que está funcionando hacemos sudo iptables -L -n y devolverá algo como esto:
Chain INPUT (policy ACCEPT)
target prot opt source destination
f2b-sshd-ddos tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 22
f2b-sshd tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 22
Chain FORWARD (policy ACCEPT)
target prot opt source destinationChain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain f2b-sshd (1 references)
target prot opt source destination
REJECT all -- 59.45.175.86 0.0.0.0/0 reject-with icmp-port-unreachable
REJECT all -- 62.210.178.242 0.0.0.0/0 reject-with icmp-port-unreachable
RETURN all -- 0.0.0.0/0 0.0.0.0/0
Chain f2b-sshd-ddos (1 references)
target prot opt source destination
RETURN all -- 0.0.0.0/0 0.0.0.0/0
Vemos que tenemos un jail SSH y otro DDOS e incluso ha bloqueado un par de IPs por intentos fallidos por SSH.
Comprobar IPs bloqueadas
Podemos comprobar las Ips bloqueadas de varias formas diferentes:
- Con iptables:
sudo iptables -L -n
- Con el propio comando de fail2ban:
fail2ban-client status NOMBRE_DEL_JAIL
El nombre del Jail será en este caso sshd o sshd-ddos. Podemos comprobar todos los jail activos con:fail2ban-client status
Esta forma es la menos cómoda porque las IPs bloqueadas no se muestran una por línea, aunque puede sernos útil ya que muestra el número total de IPs bloqueadas. - Buscando en los logs de fail2ban:
zgrep 'Ban' /var/log/fail2ban.log*
Si queremos confirmar el bloqueo de una IP concreta podemos combinar los anteriores comandos con grep para buscar esa IP.
Bloquear IP
Para bloquear una IP concreta para un servicio o jail concreto:
fail2ban-client set NOMBRE_DEL_JAIL banip DIRECCION_IP
Para bloquearla con iptables de cualquier acceso al sistema:
iptables -I INPUT -s DIRECCION_IP -j DROP
Desbloquear IP
Si comprobamos con los comandos anteriores que se ha bloqueado una IP legítima, podemos desbloquearla con este comando:
fail2ban-client unban DIRECCION_IP
Para desbloquear una IP de un jail concreto:
fail2ban-client set NOMBRE_DEL_JAIL unbanip DIRECCION_IP
Para desbloquear TODAS las IP bloqueadas de un jail concreto (solo desde la versión 0.10.0):
fail2ban-server set NOMBRE_DEL_JAIL unbanip --all
Para desbloquear todas las IP bloqueadas de todos los jail:
fail2ban-server unban --all
El nombre del Jail será en este caso sshd o sshd-ddos. Podemos comprobar todos los jail activos con:
fail2ban-client status
Envío de avisos por email
Podemos configurar fail2ban para que nos mande un mail por cada nueva IP que bloquee, indicando un WHOIS de la misma, cambiando en jail.local:
action = %(action_)s
por
action = %(action_mw)s
También podremos configurar estas opciones de configuración:
- destemail: indicamos mail del destinatario.
- sender: dirección que aparecerá como remitente.
- mta: será mail o sendmail, el programa que usará para enviar el correo y que debemos tenerlo instalado previamente en el sistema.
Lamentablemente, tras probarlo, no he conseguido que me enviase ningún email, seguramente por no tener bien configurado sendmail, pero no le dediqué mucho tiempo ya que no me interesa recibir estos avisos por email.
Comprobación de errores (testing filters)
En caso de problemas, podemos comprobar el log de fail2 ban en /var/log/fail2ban.log
Si habeis usado expresiones regulares, podeis validarlas con el comando fail2ban-regex. Por ejemplo:
fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf
Para testear el filtro con otros modos:
fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf[logtype=short,mode=aggressive]
Comprobar la configuración
El siguiente comando nos devolverá la configuración que está aplicando fail2ban, aunque no de forma muy amigable:
fail2ban-client --dp
Saber país de origen de las IP bloqueadas
Podemos saber el origen de una IP con el comando geoiplookup.
Lo instalamos y ejecutamos así:
sudo apt install geoip-bin
geoiplookup {IP}
Si tenemos instalado el firewall CSF podemos saberlo con este comando:
csf -i {IP}
Para consultar con un comando todas las IP bloqueadas:
iptables -n -L f2b-sshd | grep REJECT | awk '{print $4}' | xargs -n1 geoiplookup | sort | uniq -c
Podemos hacer que fail2ban nunca bloquee IPs de un país concreto:
https://www.webfoobar.com/node/54
Más información de bloqueo por países:
https://www.ip2location.com/free/visitor-blocker
Reportar IPs bloqueadas a AbuseIPDB
AbuseIPDB es una página web que registra IPs maliciosas. Podemos integrar su API con fail2ban para que las IPs que bloqueamos sean reportadas a su base de datos.
Alternativas
- CrowdSec: como fail2ban, pero además registra y comprueba las IPs con una lista negra global
- denyhosts: Algunas diferencias con fail2ban:
- Denyhosts solo bloquea accesos por SSH mientras que fail2ban, no solo viene configurado de serie para monitorizar más servicios, sino que se le puede configurar cualquier servicio que registre los intentos de acceso en un log.
- Denyhosts bloquea las IP añadiéndolas a /etc/hosts.deny mientras que fail2ban las bloquea a través del firewall de linux.
- Denyhosts puede configurarse para bloquear IPs obtenidas a través de internet de una base de datos de IPs maliciosas conocidas.
- Sshguard: muy similar a fail2ban, comprueba los logs en busca de logins fallidos de diferentes servicios y bloquea las IPs en el firewall. Pero sólo funciona con SSH.
- Snort: detección y prevención de intrusiones en tiempo real.
- CSF: Completo firewall con opcion, entre muchas otras, de bloquear IP tras intentos de acceso fallidos. También tiene posibilidad de bloqueo por países.
Deja una respuesta