Fail2ban es una herramienta de seguridad que monitorea los logs de tu servidor y, en caso de detectar intentos de acceso maliciosos (como intentos de fuerza bruta o ataques a tu servidor web), bloquea las direcciones IP sospechosas utilizando reglas de firewall. En el caso de Apache, Fail2ban puede ser configurado para detectar y bloquear IPs que estén intentando explotar vulnerabilidades en tu servidor web, como ataques de fuerza bruta, escaneos de directorios, intentos de acceso no autorizado, etc.

Además, Fail2ban y UFW (Uncomplicated Firewall) son compatibles y de hecho, pueden complementarse muy bien. Cada uno tiene un propósito ligeramente diferente, pero juntos ofrecen una capa adicional de protección en tu servidor.

Cómo funciona Fail2ban con Apache

Fail2ban trabaja monitorizando archivos de log generados por Apache (o cualquier otro servicio que tengas en el servidor) y toma decisiones basadas en patrones o expresiones regulares configuradas para esos logs. Cuando detecta un comportamiento sospechoso, como múltiples intentos fallidos de acceso a una página o a un recurso específico, toma una acción, generalmente bloqueando la IP atacante con iptables o UFW.

Pasos para configurar Fail2ban para Apache

  1. Instalar Fail2ban:

    Si aún no tienes Fail2ban instalado, puedes hacerlo en una distribución basada en Debian (como Ubuntu) con el siguiente comando:

    sudo apt update
    sudo apt install fail2ban
    
  2. Archivos de configuración:

    Fail2ban tiene dos archivos de configuración principales:

    • /etc/fail2ban/fail2ban.conf: Archivo principal de configuración.

    • /etc/fail2ban/jail.conf: Aquí se definen las "prisiones" (jails) para los diferentes servicios que monitorea Fail2ban (por ejemplo, Apache, SSH, etc.).

    La configuración más importante para Apache suele encontrarse en la sección correspondiente a apache dentro de los archivos de configuración.

  3. Configuración básica para Apache en Fail2ban:

    Fail2ban ya viene con configuraciones predeterminadas para Apache, pero puedes personalizarlas según tus necesidades.

    • Acceder a la configuración de Apache en Fail2ban:

      Para habilitar y configurar Fail2ban para Apache, necesitas editar el archivo de configuración de las prisiones. Se recomienda no modificar directamente jail.conf, sino crear un archivo local de configuración en /etc/fail2ban/jail.local (si no existe, puedes crear uno). Este archivo anula las configuraciones predeterminadas en jail.conf.

    sudo nano /etc/fail2ban/jail.local
    
    • Habilitar la prisión para Apache:

      Dentro de este archivo, puedes habilitar las prisiones para Apache agregando las siguientes configuraciones, o descomentando las existentes y ajustando las opciones según tus necesidades.

      [apache]
      enabled = true
      port = http,https
      filter = apache-auth
      logpath = /var/log/apache2/*error.log
      maxretry = 3
      bantime = 600
      findtime = 600
      action = ufw[name=Apache, port=http, protocol=tcp]
      
      • enabled: Habilita la prisión para Apache.

      • port: Define los puertos que quieres monitorear (por defecto, HTTP y HTTPS).

      • filter: Define el filtro que usará Fail2ban para analizar los logs. En este caso, se utiliza apache-auth para los logs de autenticación.

      • logpath: Especifica la ubicación de los archivos de log de Apache. En la mayoría de las distribuciones, los archivos de log de Apache se encuentran en /var/log/apache2/.

      • maxretry: Define el número máximo de intentos fallidos permitidos antes de bloquear la IP.

      • bantime: Define el tiempo (en segundos) que una IP será bloqueada después de alcanzar el número de intentos fallidos. En el ejemplo, se bloquea durante 10 minutos (600 segundos).

      • findtime: Define el período de tiempo (en segundos) en el que se cuentan los intentos fallidos. En este caso, se cuentan durante 10 minutos.

      • action: Define qué acción se tomará para bloquear la IP. En este caso, se utiliza UFW para bloquear el acceso a la IP atacante.

  4. Filtros de Fail2ban:

    Los filtros de Fail2ban se definen en archivos ubicados en /etc/fail2ban/filter.d/. Estos archivos contienen expresiones regulares para detectar patrones específicos en los logs de Apache.

    • El filtro más común para Apache es apache-auth.conf, que busca patrones relacionados con errores de autenticación (por ejemplo, múltiples intentos fallidos de login).

    • También puedes usar apache-badbots.conf para bloquear bots maliciosos que intentan acceder a tus recursos web.

    Por ejemplo, el filtro apache-auth.conf podría detectar algo como esto en el archivo de log:

    authentication failure; logname= uid=0 euid=0 tty= ruser= rhost= user=admin
    

    Si Fail2ban detecta este patrón, bloqueará la IP asociada.

  5. Reiniciar Fail2ban:

    Después de hacer los cambios en la configuración, debes reiniciar Fail2ban para que los nuevos ajustes tomen efecto:

    sudo systemctl restart fail2ban
    

    También puedes verificar el estado de Fail2ban y ver si está protegiendo correctamente Apache:

    sudo systemctl status fail2ban
    
  6. Verificar las prisiones activas:

    Para asegurarte de que la prisión de Apache está habilitada y funcionando, puedes usar el siguiente comando:

    sudo fail2ban-client status apache
    

    Esto mostrará el estado de la prisión apache y las IPs actualmente bloqueadas.

    Si quieres ver todas las prisiones activas, usa:

    sudo fail2ban-client status
    

Resumen del flujo de Fail2ban con Apache:

  1. Monitoreo de logs: Fail2ban revisa los logs de Apache (por defecto en /var/log/apache2/*error.log).

  2. Detección de patrones: Usando filtros (como apache-auth), Fail2ban busca patrones de intentos fallidos de acceso o comportamientos sospechosos (por ejemplo, intentos de login fallidos).

  3. Bloqueo de IP: Si el número de intentos fallidos excede el límite configurado (por ejemplo, 3 intentos), Fail2ban bloquea la IP en cuestión usando UFW o iptables.

  4. Desbloqueo: El bloqueo es temporal, y la IP será desbloqueada después del tiempo configurado (por ejemplo, 10 minutos).

Beneficios de usar Fail2ban con Apache:

  • Protección contra ataques de fuerza bruta: Bloquea a los atacantes que intentan adivinar contraseñas o acceder de manera no autorizada.

  • Bloqueo de bots maliciosos: Impide que los bots automatizados exploren o ataquen tu servidor web.

  • Automatización de la seguridad: Fail2ban permite bloquear automáticamente direcciones IP sospechosas, sin necesidad de intervención manual.

Con Fail2ban, puedes mejorar significativamente la seguridad de tu servidor Apache al bloquear accesos no autorizados y evitar ataques automatizados.

Cómo configurar Fail2ban con un VirtualHost específico

Para configurar Fail2Ban para proteger un VirtualHost específico de Apache, necesitarás crear una configuración personalizada que aplique las reglas de Fail2Ban a los logs correspondientes a ese VirtualHost.

Sigue estos pasos:

1. Configuración de Apache (VirtualHost)

Primero, asegúrate de que el log del VirtualHost esté configurado adecuadamente. Apache puede tener múltiples VirtualHosts y cada uno puede tener su propio archivo de log.

En tu archivo de configuración de Apache para el VirtualHost, asegúrate de tener algo como esto:

<VirtualHost *:80>
    ServerName tu_dominio.com
    DocumentRoot /var/www/tu_sitio

    CustomLog /var/log/apache2/tu_dominio_access.log combined
    ErrorLog /var/log/apache2/tu_dominio_error.log

    # Otras configuraciones...
</VirtualHost>

En este ejemplo, los logs de acceso y error se guardan en tu_dominio_access.log y tu_dominio_error.log respectivamente.

2. Crear un filtro personalizado para Fail2Ban

A continuación, creamos un filtro personalizado para el VirtualHost en Fail2Ban. Los filtros se definen en el directorio /etc/fail2ban/filter.d/. Vamos a crear un filtro que busque patrones específicos en el archivo de logs de Apache.

Crea un archivo de filtro, por ejemplo, apache-tudominio.conf en /etc/fail2ban/filter.d/:

sudo nano /etc/fail2ban/filter.d/apache-tudominio.conf

Y agrega algo como esto (ajusta según el tipo de ataques que deseas bloquear):

[Definition]
failregex = ^<HOST> -.*"(GET|POST|HEAD).*(HTTP/1.1|HTTP/2)".*(403|404|500)
ignoreregex =

Este filtro busca direcciones IP que realicen peticiones que generen respuestas de error 403, 404 o 500, lo cual es común en intentos de acceso no autorizado o malformado.

3. Configurar Fail2Ban para el VirtualHost

Ahora, necesitas decirle a Fail2Ban que use el filtro que acabas de crear para el VirtualHost en cuestión.

Abre el archivo de configuración de Jail de Fail2Ban (/etc/fail2ban/jail.local o /etc/fail2ban/jail.conf si no tienes jail.local):

sudo nano /etc/fail2ban/jail.local

Agrega la siguiente configuración para que Fail2Ban se aplique solo al log específico de tu VirtualHost:

[apache-tudominio]
enabled  = true
port     = http,https
filter   = apache-tudominio
logpath  = /var/log/apache2/tu_dominio_access.log
maxretry = 3
bantime  = 600
findtime = 600

Explicación de las opciones:

  • enabled: Habilita el jail.

  • port: El puerto al que se aplican las reglas, generalmente HTTP (80) y HTTPS (443).

  • filter: El filtro que creaste en el paso anterior.

  • logpath: La ubicación de los logs de acceso de tu VirtualHost.

  • maxretry: El número de intentos fallidos antes de bloquear la IP.

  • bantime: El tiempo (en segundos) durante el cual la IP estará bloqueada.

  • findtime: El período de tiempo en el que se cuentan los intentos fallidos.

4. Reiniciar Fail2Ban

Después de realizar estos cambios, reinicia Fail2Ban para que se apliquen las nuevas reglas:

sudo systemctl restart fail2ban

5. Verificación

Para verificar que todo está funcionando correctamente, puedes revisar el estado de Fail2Ban y ver si se están bloqueando IPs según las reglas configuradas:

sudo fail2ban-client status apache-tudominio

Esto debería mostrarte la cantidad de IPs bloqueadas y otras estadísticas del jail.

Cómo trabajan juntos Fail2ban y UFW

  1. Fail2ban se encarga de monitorear los logs de los servicios (como Apache, SSH, etc.) y detectar patrones sospechosos, como intentos fallidos de login o comportamientos maliciosos. Cuando detecta una actividad sospechosa, bloquea la IP del atacante por un tiempo determinado (configurable) utilizando reglas de firewall.

  2. UFW es un firewall fácil de usar que se configura para permitir o bloquear el tráfico de red en tu servidor. Si bien UFW no tiene la capacidad de detectar intentos fallidos o patrones de comportamiento (eso es lo que hace Fail2ban), se utiliza para bloquear direcciones IP específicas que Fail2ban haya identificado como sospechosas.

Cuando usas Fail2ban con UFW, Fail2ban agrega las reglas necesarias a UFW para bloquear las IPs maliciosas que detecta. Esto significa que Fail2ban actúa como un sistema de detección y UFW como un sistema de bloqueo.

¿Cómo se integran Fail2ban y UFW?

Para que Fail2ban use UFW para bloquear IPs, es necesario que Fail2ban esté configurado para utilizar UFW como acción para bloquear las IPs. Esto se logra mediante la configuración de la acción de Fail2ban en su archivo de configuración.

Pasos para integrar Fail2ban con UFW:

  1. Instalar Fail2ban (si aún no lo has hecho):

    Si no tienes Fail2ban instalado, puedes hacerlo con los siguientes comandos en un sistema basado en Debian/Ubuntu:

    sudo apt update
    sudo apt install fail2ban
    
  2. Configurar Fail2ban para usar UFW:

    En el archivo de configuración de Fail2ban (jail.local), necesitas asegurarte de que la acción esté configurada para usar UFW. La acción predeterminada de Fail2ban es usar iptables, pero puedes especificar UFW como la acción de bloqueo.

    • Edita o crea el archivo jail.local:

      sudo nano /etc/fail2ban/jail.local
      
    • Configura la acción de Fail2ban para que utilice UFW. Aquí hay un ejemplo de cómo habilitar Fail2ban para bloquear direcciones IP con UFW:

      [apache]
      enabled = true
      port = http,https
      filter = apache-auth
      logpath = /var/log/apache2/*error.log
      maxretry = 3
      bantime = 600
      findtime = 600
      action = ufw[name=Apache, port=http, protocol=tcp]
      

      En el parámetro action, se indica que UFW se usará para bloquear las IPs detectadas como maliciosas. Esta configuración implica que Fail2ban bloqueará las IPs con UFW que hayan intentado acceder a tu servidor Apache de manera sospechosa.

  3. Reiniciar Fail2ban para que los cambios surtan efecto:

    Después de editar la configuración, necesitas reiniciar Fail2ban para que cargue la nueva configuración:

    sudo systemctl restart fail2ban
    
  4. Verificar el estado de Fail2ban y UFW:

    Puedes verificar el estado de Fail2ban para asegurarte de que está funcionando correctamente:

    sudo systemctl status fail2ban
    

    Y si quieres ver las IPs bloqueadas por UFW, puedes usar el siguiente comando:

    sudo ufw status
    

    También puedes verificar el estado de las prisiones de Fail2ban para ver si están bloqueando IPs como se espera:

    sudo fail2ban-client status apache
    

    Esto te dará detalles sobre las IPs bloqueadas para Apache, por ejemplo.

¿Por qué usar Fail2ban con UFW?

La integración de Fail2ban con UFW ofrece varias ventajas:

  • Seguridad automatizada: Fail2ban detecta comportamientos sospechosos y bloquea automáticamente las IPs maliciosas con UFW, sin necesidad de intervención manual.

  • Bloqueo en tiempo real: Una vez que Fail2ban detecta una IP sospechosa, la bloquea en el firewall UFW en tiempo real, evitando que esa IP pueda seguir intentando realizar ataques o accesos no autorizados.

  • Reducción de la carga en el servidor: Al bloquear IPs maliciosas con UFW, puedes reducir el riesgo de ataques, como ataques de fuerza bruta, escaneos de puertos o de explotación de vulnerabilidades.

Resumen de los beneficios de usar Fail2ban con UFW:

  • Detección de ataques: Fail2ban monitorea los logs para detectar intentos fallidos de acceso o actividades sospechosas.

  • Bloqueo automático: Fail2ban bloquea las IPs maliciosas utilizando UFW (o iptables), evitando que continúen atacando tu servidor.

  • Flexibilidad: Puedes personalizar la configuración para diferentes servicios (como Apache, SSH, etc.) y diferentes tipos de ataques.

  • Automatización de la seguridad: No necesitas bloquear IPs manualmente; Fail2ban lo hace automáticamente.

En resumen, Fail2ban y UFW pueden trabajar juntos perfectamente para proporcionar una capa de seguridad automática en tu servidor, detectando intentos de acceso maliciosos y bloqueando las IPs de los atacantes.