Integración de Fail2ban con tu propia API en Python

Escrito el 2023-07-01 por Alberto Ferrer
Tiempo de lectura: 5 minuto(s)
Etiquetas: fail2ban api python seguridad

¡Hola! En este artículo, exploraremos cómo integrar Fail2ban con tu propia API en Python para proteger tu servidor de direcciones IP sospechosas. Implementar la integración de Fail2ban con tu API te permitirá actuar rápidamente contra las direcciones IP sospechosas. Sin embargo, en esta ocasión nos centraremos en la integración con Fail2ban, sin explorar otras herramientas como Prometheus por el momento.

Paso 1: Implementar tu propia API en Python

Lo primero que necesitamos hacer es implementar nuestra propia API en Python. Para ello, vamos a utilizar un script que hemos creado llamado fail2ban-barrahome.py. Este script se encargará de realizar las solicitudes a tu API y enviar los reportes de abuso correspondientes. Aquí tienes el código completo:

#!/usr/bin/env python3
import json
import requests
import sys
import logging

# Configuración del registro
logging.basicConfig(filename='fail2ban-barrahome.log', level=logging.INFO, format='%(asctime)s %(message)s')

def reportar_abuso(ip, comentario, categorias, clave):
    if not all([ip, comentario, categorias, clave]):
        logging.error('Todos los argumentos (ip, comentario, categorias, clave) son requeridos.')
        sys.exit(1)
    url = 'https://www.barrahome.org/api/v2/report'
    headers = {'Accept': 'application/json', 'Key': clave}
    data = {'ip': ip, 'comment': comentario, 'categories': categorias}

    try:
        response = requests.post(url, headers=headers, data=json.dumps(data))
        response.raise_for_status()
    except requests.exceptions.HTTPError as errh:
        logging.error("Error HTTP:", errh)
    except requests.exceptions.ConnectionError as errc:
        logging.error("Error de conexión:", errc)
    except requests.exceptions.Timeout as errt:
        logging.error("Error de tiempo de espera:", errt)
    except requests.exceptions.RequestException as err:
        logging.error("Algo salió mal con la solicitud:", err)
    else:
        logging.info(f'Reporte de abuso exitoso para {ip}. El servidor respondió con: {response.text}')

if __name__ == "__main__":
    if len(sys.argv) != 5:
        logging.error("Número incorrecto de argumentos. Se esperaban 4, se recibieron " + str(len(sys.argv) - 1))
        sys.exit(1)
    reportar_abuso(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4])

En este script, hemos definido una función llamada reportar_abuso que toma la dirección IP sospechosa, un comentario, las categorías relacionadas y la clave de la API como argumentos. Luego, se realiza una solicitud POST a la API utilizando la biblioteca requests. Si la solicitud es exitosa, se registra un mensaje de éxito en el archivo de registro.

Asegúrate de personalizar este script según tus necesidades y de tener instaladas las bibliotecas necesarias, como requests.

Paso 2: Crear la acción personalizada de Fail2ban

Ahora, vamos a crear una acción personalizada en Fail2ban que utilice nuestro script de Python para reportar las direcciones IP sospechosas. Aquí está el contenido del archivo de configuración barrahome.conf:

[Definition]
norestored = 1
actionstart =
actionstop =
actioncheck =
actionban = lgm=$(printf '%%.1000s\n...' "<matches>"); /home/alberto/scripts/fail2ban-barrahome.py <ip> "$lgm" <barrahome_category> <barrahome_apikey>
actionunban =

[Init]
barrahome_apikey =

En este archivo, hemos definido la acción personalizada actionban, que ejecutará nuestro script fail2ban-barrahome.py con los argumentos adecuados. Asegúrate de reemplazar <barrahome_category> y <barrahome_apikey> con los valores correctos para tu API.

Paso 3: Modificar el archivo Jail

Por último, vamos a modificar el archivo jail.local de Fail2ban para utilizar nuestra nueva acción personalizada. Aquí tienes un ejemplo de cómo se vería la sección relevante del archivo:

[sshd]
mode     = ddos
enabled  = true
port     = ssh
bantime  = 24h
findtime = 3
maxretry = 2
logpath  = %(sshd_log)s
backend  = %(sshd_backend)s
action = %(known/action)s
         barrahome[barrahome_apikey="my-api-key", barrahome_category="18,22"]

En este ejemplo, hemos agregado la línea barrahome[barrahome_apikey="my-api-key", barrahome_category="18,22"] a la configuración de la acción en la sección [sshd]. Asegúrate de reemplazar my-api-key con tu clave de API y ajustar las categorías según tus necesidades.

Aquí está el texto con los acentos agregados:

Qué podríamos agregar al proceso y los dejaré pendientes para el próximo artículo:

  • Agregar el hostname del servidor que envía el reporte.
  • Exportar la lista de IPs en json o CSV para que se puedan importar.
  • Geolocalización.
  • Número de intentos. (HECHO)
  • Crear una entrada de esto en mis proyectos. (HECHO)
  • Proceso para reportar IPs a sus debidas ISPs.

Espero que esta guía te haya sido útil y que puedas implementar con éxito la integración de Fail2ban con tu propia API en Python. Si tienes alguna pregunta, no dudes en dejar un comentario. ¡Hasta la próxima!