Ir al contenido principal

fail2ban

Traducción Beta No Oficial

Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →

Fail2ban es un marco de software de prevención de intrusiones que protege servidores informáticos contra ataques de fuerza bruta. Fail2ban opera monitoreando archivos de registro (ej. /var/log/auth.log, /var/log/apache/access.log, etc.) en busca de entradas específicas y ejecutando scripts según su contenido.

Jellyfin genera registros que Fail2ban puede monitorear para prevenir ataques de fuerza bruta en tu máquina.

Requisitos

  • Jellyfin accesible remotamente

  • Fail2ban instalado y en ejecución

  • Conocer la ubicación de los registros de Jellyfin: por defecto /var/log/jellyfin/ para escritorio y /config/log/ para contenedores Docker.

  • Nivel de registro de Jellyfin configurado en Info (las entradas de autenticación fallidas no se registran en Error). Esta configuración se encuentra en logging.json

Paso uno: crear el jail

Debes crear un jail para Fail2ban. Si usas Ubuntu y nano como editor, ejecuta:

sudoedit /etc/fail2ban/jail.d/jellyfin.local

Agrega esto al nuevo archivo, reemplazando /path_to_logs con la ruta a los archivos de registro mencionados anteriormente, ej. /var/log/jellyfin/:

[jellyfin]

backend = auto
enabled = true
port = 80,443
protocol = tcp
filter = jellyfin
maxretry = 3
bantime = 86400
findtime = 43200
logpath = /path_to_logs/log_*.log

Guarda y cierra nano.

Nota:

  1. Si Jellyfin se ejecuta en un contenedor Docker, agrega lo siguiente al archivo jellyfin.local:

    action = iptables-allports[name=jellyfin, chain=DOCKER-USER]
  2. Si Jellyfin usa un puerto no estándar, cambia los puertos de 80,443 al puerto relevante, como 8096,8920

Paso dos: crear el filtro

El filtro contiene reglas que Fail2ban usará para identificar intentos de autenticación fallidos. Crea el filtro ejecutando:

sudoedit /etc/fail2ban/filter.d/jellyfin.conf

Pega:

[Definition]
failregex = ^.*Authentication request for .* has been denied \(IP: "<ADDR>"\)\.

Guarda y cierra, luego recarga Fail2ban:

sudo systemctl restart fail2ban

Verifica que Fail2ban esté en ejecución:

sudo systemctl status fail2ban

Paso tres: probar

Suponiendo que tienes al menos un intento de autenticación fallido, puedes probar este nuevo jail con fail2ban-regex:

sudo fail2ban-regex /path_to_logs/log_*.log /etc/fail2ban/filter.d/jellyfin.conf --print-all-matched

Configuración avanzada de Fail2Ban: Gestión de bloqueos en un servidor proxy ascendente

Para mejorar la seguridad, Fail2Ban puede gestionar bloqueos de IP en un servidor proxy inverso ascendente en lugar de directamente en el servidor de Jellyfin. Esta configuración permite bloquear IPs maliciosas más cerca del punto de entrada de tu red, beneficiando potencialmente a otros servicios que usen el mismo proxy.

Esta guía ofrece una configuración para gestionar bloqueos de IP en un servidor proxy inverso ascendente usando Cadenas Dinámicas, donde cada jail de Fail2Ban crea y gestiona su propia cadena iptables en el servidor ascendente.

Supuestos

  • Fail2Ban está instalado en tu servidor local (donde se ejecuta Jellyfin).

  • iptables está configurado en el servidor ascendente.

Paso uno: Configurar autenticación SSH por clave

Asegúrate de que el servidor Fail2Ban pueda conectarse por SSH al servidor ascendente sin contraseña. Esto es crucial para automatizar el proceso de bloqueo/desbloqueo de IPs.

Reemplaza <upstream-server-ip> con la dirección IP real de tu servidor ascendente.

  1. Generar clave SSH (si aún no existe):

    ssh-keygen -t rsa -b 4096 -f /root/.ssh/id_rsa
  2. Copiar la clave SSH al servidor ascendente:

    ssh-copy-id -i /root/.ssh/id_rsa.pub root@<upstream-server-ip>
  3. Prueba de acceso SSH:

    Asegúrate de que la conexión SSH funcione sin necesidad de contraseña:

    ssh -i /root/.ssh/id_rsa root@<upstream-server-ip>

Paso dos: Configurar Fail2Ban para cadenas dinámicas

  1. Crear el archivo de acción para Fail2Ban:

    En el servidor Fail2Ban, crea un nuevo archivo de acción:

    sudo nano /etc/fail2ban/action.d/proxy-iptables-dynamic.conf

    Y añade la siguiente configuración, que creará, gestionará y eliminará dinámicamente cadenas iptables en el servidor ascendente por cada jail:

    Recuerda reemplazar <upstream-server-ip> con la dirección IP real de tu servidor ascendente.

    [Definition]

    # Option: actionban
    # 1. Create the chain if it doesn't exist
    # 2. Add the banned IP to the dynamic chain based on the jail name
    # 3. Log the event
    actionban = ssh -i /root/.ssh/id_rsa -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null root@<upstream-server-ip> \
    'iptables -N f2b-<name> 2>/dev/null || true; \
    iptables -C INPUT -j f2b-<name> 2>/dev/null || iptables -I INPUT -j f2b-<name>; \
    iptables -I f2b-<name> 1 -s <ip> -j DROP' && \
    echo "Banned <ip> from jail <name> via upstream proxy" >> /var/log/fail2ban.log

    # Option: actionunban
    # 1. Remove the banned IP from the dynamic chain
    # 2. Remove the chain if it becomes empty (cleanup)
    # 3. Log the event
    actionunban = ssh -i /root/.ssh/id_rsa -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null root@<upstream-server-ip> \
    'iptables -D f2b-<name> -s <ip> -j DROP; \
    if ! iptables -L f2b-<name> | grep -q "DROP"; then \
    iptables -D INPUT -j f2b-<name>; \
    iptables -F f2b-<name>; \
    iptables -X f2b-<name>; \
    fi' && \
    echo "Unbanned <ip> from jail <name> via upstream proxy and cleaned up chain if empty" >> /var/log/fail2ban.log

    Tras realizar los cambios, guarda y cierra el archivo.

  2. Actualizar los jails de Fail2Ban para usar la acción de cadena dinámica:

    Abre tu archivo de configuración de jails, normalmente ubicado en /etc/fail2ban/jail.local:

    sudo nano /etc/fail2ban/jail.local

    Y para cada jail que quieras gestionar mediante el proxy ascendente, añade o modifica la línea de acción para usar la acción proxy-iptables-dynamic. Aquí tienes una configuración de ejemplo para dos jails:

    [jellyfin]
    enabled = true
    filter = jellyfin
    logpath = /path/to/jellyfin/log
    maxretry = 3
    bantime = 3600
    action = proxy-iptables-dynamic

    [nginx-http-auth]
    enabled = true
    filter = nginx-http-auth
    logpath = /var/log/nginx/error.log
    maxretry = 5
    bantime = 3600
    action = proxy-iptables-dynamic

    Tras realizar los cambios, guarda y cierra el archivo.

Paso tres: Añadir las IPs del proxy a Jellyfin

  1. Obtener las IPs del proxy

    Dado que estás usando un servidor proxy, necesitamos que Jellyfin registre las IPs correctas en los logs para que fail2ban pueda leerlas.

    Dependiendo de tu configuración de hosting, estos rangos de IP podrían provenir de IPs internas de Docker, haproxy o algún otro servicio.

    Jellyfin acepta IPs con máscaras de subred como 172.18.0.1/24. Necesitarás una lista separada por comas de estas.

  2. Añadir proxies a Jellyfin

    Abre el panel de control de tu servidor Jellyfin, ve a Advanced -> Networking, y desplázate hasta Known proxies.

    Introduce tu lista de rangos de IP de proxy separados por comas. Deberás reiniciar el servidor Jellyfin como se indica.

Paso cuatro: Reiniciar Fail2Ban y probar la configuración

  1. Reiniciar Fail2Ban:

    Después de realizar los cambios de configuración, reinicie Fail2Ban para aplicar la nueva configuración:

    sudo systemctl restart fail2ban
  2. Comprobar estado de la cárcel:

    Verifique el estado de sus cárceles para asegurarse de que funcionan correctamente:

    sudo fail2ban-client status jellyfin
  3. Probar un bloqueo:

    Active un bloqueo realizando intentos de inicio de sesión inválidos o bloqueando manualmente una IP. Por ejemplo:

    sudo fail2ban-client set jellyfin banip 192.168.1.100
  4. Verificar en el servidor ascendente:

    Compruebe si la IP está bloqueada en la cadena correspondiente de la cárcel ('f2b-jail-name') en el servidor ascendente:

    ssh root@<upstream-server-ip> "iptables -L f2b-jellyfin"
  5. Probar desbloqueo:

    Para probar el desbloqueo, elimine manualmente el bloqueo de la IP:

    sudo fail2ban-client set jellyfin unbanip 192.168.1.100
  6. Verificar desbloqueo:

    Verifica que la IP haya sido eliminada de la cadena correspondiente al jail ('f2b-jail-name'):

    ssh root@<upstream-server-ip> "iptables -L f2b-jellyfin"

Paso cinco: Supervisar registros

Supervise el registro de Fail2Ban para asegurarse de que las acciones se ejecutan correctamente:

tail -f /var/log/fail2ban.log

Este registro mostrará mensajes cada vez que se bloquee o desbloquee una IP, ayudándole a confirmar que la configuración funciona como se espera.