Skip to main content

Fail2ban + AbuseIPDB

Fail2Ban es una herramienta que se encarga de banear las IP que hacen intentos de conexión a nuestros servidores (ya sea ssh, http, https...). Por defecto cuando Fail2Ban detecta que ha habido varios intentos fallidos, banea la IP durante 15d. De esta forma se evitará que los atacantes/bots que estén realizando un ataque de fuerza bruta puedan estar 24/7 sin parar.

En esta guía se va a proceder a realizarlo con Ubuntu/Debian, pero seguramente para otras distribuciones RHEL sea igual.

Instalar Fail2ban

En la terminal del sistema linux proceda con la instalación de fail2ban.

sudo apt update && sudo apt install fail2ban -y

Cuando se haya instalado, puede que esté desactivado, así que lo primero a realizar es iniciar el servicio al arranque del sistema.

sudo systemctl enable --now fail2ban

Por defecto Fail2ban ya se encarga de banear las IP que intentan acceder por SSH y fallan mas de N veces. Podrás ver las acciones que va realizando en el fichero

tail -f /var/log/fail2ban.log

Comandos útiles Fail2Ban

Visualizar IPs baneadas

sudo fail2ban-client status sshd

Configurar Fail2Ban con AbuseIPDB

Accede a AbuseIPDB, create una cuenta si no dispones de ella y posteriormente entra en la sección de API

En la sección de Create API Key, pulsa en Create Key

copia la API key en un notepad porque la necesitaras a continuación. Vuelve al linux y ejecuta los siguientes comandos.

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

Edita el fichero jail.local y en la sección de sshd

pon lo siguiente.

[sshd]

# To use more aggressive sshd modes set filter parameter "mode" in jail.local:
# normal (default), ddos, extra or aggressive (combines all).
# See "tests/files/logs/sshd" or "filter.d/sshd.conf" for usage example and details.
#mode   = normal
port    = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s
bantime = 15d
findtime= 1h
maxretry= 8
# Ban IP and report to AbuseIPDB for SSH Brute-Forcing
action = %(action_)s
        %(action_abuseipdb)s[
           abuseipdb_apikey="INTRODUCE_LA_API_KEY_ABUSEIPDB",
           abuseipdb_category="18,22",
           abuseipdb_report_matches=false,
           abuseipdb_comment="SSH BruteForce detected by Fail2Ban (failures=<failures>, source=NOMBRE_SERVER)"
         ]

El campo source te lo puedes ahorraahorrar si lo deseas, es solo por si dispones de varios servidores reportando y quieres saber que servidor ha sido... podría quedar perfectamente así

abuseipdb_comment="SSH BruteForce detected by Fail2Ban"

Guarda los cambios y reinicia el servicio de Fail2ban con

sudo systemctl restart fail2ban

Ahora queda a esperar a que un bot comience a intentar realizar un ataque de fuerza bruta, almenos 8 intentos (maxretry=8) para que Fail2ban decida que se banea esa IP y queda reportada en AbuseIPDB.

Y te preguntarás, que son el número 18 y 22 que hay en abuseipdb_category="18,22"? Tengo que poner eso siempre? Bueno pues son las categorías de AbuseIPDB https://www.abuseipdb.com/categories. Para SSH recomiendan poner esas, pero para otros servicios, obviamente deben cambiarse.

Fail2ban ignora el comentario en jail.local

Tal como se ha dejado configurado Fail2ban, este ingorará el comentario puesto y mostrará los logs del intento (con lo que aparecerá el nombre del servidor... quizá información que no queremos que se vea...).

Para solventarlo hay que realizar los siguientes pasos.

cd /etc/fail2ban/action.d/

Copiar el fichero abuseipdb.conf como abuseipdb.local (los ficheros .local tienen preferencia sobre los .conf).

sudo cp abuseipdb.conf abuseipdb.local

Modificar el fichero abuseipdb.local, y en la linea donde indique el actionban

actionban = lgm=$(printf '%%.1000s\n...' "<matches>"); curl -sSf "https://api.abuseipdb.com/api/v2/report" -H "Accept: application/json" -H "Key: <abuseipdb_apikey>" --data-urlencode "comment=$lgm" --data-urlencode "ip=<ip>" --data "categories=<abuseipdb_category>"

Modificarla para que el comentario pase de ser "comment=$lgm" a "comment=<abuseipdb_comment>"

actionban = lgm=$(printf '%%.1000s\n...' "<matches>"); curl -sSf "https://api.abuseipdb.com/api/v2/report" -H "Accept: application/json" -H "Key: <abuseipdb_apikey>" --data-urlencode "comment=<abuseipdb_comment>" --data-urlencode "ip=<ip>" --data "categories=<abuseipdb_category>"

Guardar los cambios, reiniciar el servicio de fail2ban de nuevo.

sudo systemctl restart fail2ban

Y ahora ya aplicará el comentario que se ha puesto en la configuración jail.local.