Introducción
Al configurar un servidor web, a menudo hay secciones del sitio a las que se desea restringir el acceso. Las aplicaciones web suelen proporcionar sus propios métodos de autenticación y autorización, pero el propio servidor web puede utilizarse para restringir el acceso si estos son inadecuados o no están disponibles. Sin embargo, la autenticación del servidor web también representa una superficie de ataque o un vector de ataque muy predecible a través del cual las personas pueden intentar obtener acceso.
Cualquier servicio que esté expuesto a la red es un objetivo potencial de este tipo. Si revisa los registros de cualquier servidor web con mucho tráfico, verá a menudo intentos de inicio de sesión sistemáticos y repetidos que representan ataques de fuerza bruta por parte de usuarios y bots por igual.
Las implementaciones de producción a gran escala para las que esta responsabilidad es completamente inaceptable generalmente implementarán una VPN como WireGuard frente a cualquier punto final privado, de modo que sea imposible conectarse directamente a estas URL desde Internet externo sin abstracción de software o puertas de enlace adicionales. Estas soluciones de VPN son ampliamente confiables, pero agregarán complejidad y pueden romper algunas automatizaciones u otros pequeños ganchos de software.
Antes o además de comprometerse con una configuración VPN completa, puede implementar una herramienta llamada Fail2ban . Fail2ban puede mitigar significativamente los ataques de fuerza bruta al crear reglas que alteran automáticamente la configuración de su firewall para prohibir IP específicas después de una cierta cantidad de intentos de inicio de sesión fallidos. Esto permitirá que su servidor se proteja contra estos intentos de acceso sin su intervención.
En esta guía, aprenderá cómo instalarlo fail2banen un servidor Ubuntu 22.04 y configurarlo para monitorear sus registros de Nginx en busca de intentos de intrusión.
Prerrequisitos
- Acceso a un entorno de servidor Ubuntu 22.04 con un usuario no root con
sudoprivilegios para realizar tareas administrativas. Para saber cómo crear un usuario de este tipo, siga la guía de configuración inicial del servidor Ubuntu 22.04 . - Nginx instalado en su sistema, siguiendo los pasos 1 y 2 de esta guía sobre cómo instalar Nginx en Ubuntu 22.04 .
- Nginx instalado y configurado con autenticación de contraseña siguiendo Cómo configurar la autenticación de contraseña con Nginx en Ubuntu 22.04 .
Paso 1: Instalación y configuración de Fail2ban
Fail2ban está disponible en los repositorios de software de Ubuntu. Comience ejecutando los siguientes comandos como usuario no root para actualizar las listas de paquetes e instalar Fail2ban:
- sudo apt update
- sudo apt install fail2ban
Fail2ban configurará automáticamente un servicio en segundo plano después de su instalación. Sin embargo, está deshabilitado de forma predeterminada, ya que algunas de sus configuraciones predeterminadas pueden causar efectos no deseados. Puede verificar esto utilizando el systemctlcomando:
- systemctl status fail2ban.service
Output○ fail2ban.service - Fail2Ban Service Loaded: loaded (/lib/systemd/system/fail2ban.service; disabled; vendor preset: enabled Active: inactive (dead) Docs: man:fail2ban(1)
Puedes habilitar Fail2ban de inmediato, pero primero revisaremos algunas de sus características.
El servicio fail2ban guarda sus archivos de configuración en el /etc/fail2bandirectorio. Hay un archivo con valores predeterminados llamado jail.conf. Vaya a ese directorio e imprima las primeras 20 líneas de ese archivo usando head -20:
- cd /etc/fail2ban
- head -20 jail.conf
Output## WARNING: heavily refactored in 0.9.0 release. Please review and# customize settings for your setup.## Changes: in most of the cases you should not modify this# file, but provide customizations in jail.local file,# or separate .conf files under jail.d/ directory, e.g.:## HOW TO ACTIVATE JAILS:## YOU SHOULD NOT MODIFY THIS FILE.## It will probably be overwritten or improved in a distribution update.## Provide customizations in a jail.local file or a jail.d/customisation.local.# For example to change the default bantime for all jails and to enable the# ssh-iptables jail the following (uncommented) would appear in the .local file.# See man 5 jail.conf for details.## [DEFAULT]
Como verás, las primeras líneas de este archivo están comentadas ; comienzan con #caracteres que indican que deben leerse como documentación y no como configuraciones. Como también verás, estos comentarios te indican que no debes modificar este archivo directamente. En su lugar, tienes dos opciones: crear perfiles individuales para Fail2ban en varios archivos dentro del jail.d/directorio o crear y recopilar todas tus configuraciones locales en un jail.localarchivo. El jail.confarchivo se actualizará periódicamente a medida que Fail2ban se actualice, y se usará como una fuente de configuraciones predeterminadas para las que no has creado ninguna modificación.
En este tutorial, crearás jail.local. Puedes hacerlo copiando jail.conf:
- sudo cp jail.conf jail.local
Ahora puede comenzar a realizar cambios de configuración. Abra el archivo en nanosu editor de texto favorito:
- sudo nano jail.local
Cambiar valores predeterminados
Comenzará evaluando los valores predeterminados establecidos dentro del archivo. Estos se encontrarán en la [DEFAULT]sección dentro del archivo. Estos elementos establecen la política general y se pueden anular en cada aplicación. Si está utilizando nano, puede buscar dentro del archivo presionando Ctrl+W, ingresando una cadena de búsqueda y luego presionando Enter.
Uno de los primeros elementos que hay que tener en cuenta es la lista de clientes que no están sujetos a las fail2banpolíticas. Esto lo establece la ignoreipdirectiva. A veces es una buena idea añadir su propia dirección IP o red a la lista de excepciones para evitar quedarse fuera. Esto es un problema menor con los inicios de sesión en servidores web que con SSH, ya que si puede mantener el acceso a la shell siempre puede revertir una prohibición. Puede descomentar esta línea y añadir direcciones IP o redes adicionales delimitadas por un espacio a la lista existente:
/etc/fail2ban/jail.local
[DEFAULT]. . .#ignoreip = 127.0.0.1/8 your_home_IP
Otro elemento que puede que quieras ajustar es el bantime, que controla durante cuántos segundos se banea a un miembro infractor. Lo ideal es configurarlo en un tiempo lo suficientemente largo como para interrumpir los esfuerzos maliciosos y automatizados, pero lo suficientemente corto como para permitir que los usuarios corrijan los errores. De forma predeterminada, este valor está configurado en 10 minutos. Puedes aumentar o disminuir este valor:
/etc/fail2ban/jail.local
[DEFAULT]. . .bantime = 10m
Los dos elementos siguientes determinan el alcance de las líneas de registro utilizadas para determinar un cliente infractor. El findtimeespecifica una cantidad de tiempo en segundos y la maxretrydirectiva indica la cantidad de intentos que se tolerarán dentro de ese tiempo. Si un cliente realiza más de maxretryintentos dentro de la cantidad de tiempo establecida por findtime, se lo baneará:
/etc/fail2ban/jail.local
[DEFAULT]. . .findtime = 10mmaxretry = 5
Configuración de notificaciones por correo electrónico (opcional)
Opcionalmente, puede habilitar las notificaciones por correo electrónico para recibir correos electrónicos cuando se produzca una prohibición. Primero deberá configurar un MTA en su servidor para que pueda enviar correos electrónicos. Para aprender a usar Postfix para esta tarea, siga Cómo instalar y configurar Postfix en Ubuntu 22.04 .
Una vez que hayas configurado tu MTA, tendrás que ajustar algunas configuraciones adicionales dentro de la [DEFAULT]sección del /etc/fail2ban/jail.localarchivo. Comienza por configurar la mtadirectiva. Si configuras Postfix, como se muestra en el tutorial anterior, cambia este valor a “mail”:
/etc/fail2ban/jail.local
[DEFAULT]. . .mta = mail
Proporcione la dirección de correo electrónico que recibirá el correo en el destemailcampo. La senderopción configura la dirección desde la que se enviará el correo y debe ser compatible con su configuración de Postfix:
/etc/fail2ban/jail.local
[DEFAULT]. . .destemail = youraccount@email.comsendername = root@fq-hostname
El actionparámetro configura la acción que Fail2ban toma cuando desea instituir una prohibición. El valor action_se define en el archivo poco antes de este parámetro. La acción predeterminada es actualizar la configuración del firewall para rechazar el tráfico del host infractor hasta que transcurra el tiempo de prohibición.
/etc/fail2ban/jail.local
[DEFAULT]. . .action = $(action_)s. . .
Hay otros action_scripts proporcionados por defecto que puedes reemplazar $(action_)con los anteriores:
/etc/fail2ban/jail.local
…# ban send an e-mail with whois report to the destemail.action_mw = %(action_)s %(mta)s-whois[sender="%(sender)s", dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"]# ban send an e-mail with whois report and relevant log lines# to the destemail.action_mwl = %(action_)s %(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]…
Tanto action_mwy como action_mwlse encargarán de enviar correos electrónicos utilizando la configuración que hayas proporcionado. En el siguiente paso, pasarás a la configuración específica de Nginx.
Paso 2: Configuración de Fail2Ban para supervisar los registros de Nginx
Ahora que tiene algunas de las fail2banconfiguraciones generales establecidas, puede habilitar algunas cárceles específicas de Nginx que monitorearán los registros de su servidor web en busca de patrones específicos.
Cada cárcel dentro del archivo de configuración está marcada por un encabezado que contiene el nombre de la cárcel entre corchetes; cada sección, excepto la [DEFAULT]sección 1, indica la configuración de una cárcel específica. De manera predeterminada, solo la [ssh]cárcel está habilitada.
Para habilitar el monitoreo de registros de los intentos de inicio de sesión de Nginx, habilite la [nginx-http-auth]cárcel. Agregue una enabled = truedirectiva dentro de esta sección:
/etc/fail2ban/jail.local
…[nginx-http-auth]enabled = trueport = http,httpslogpath = %(nginx_error_log)s. . .
Cuando haya terminado de realizar modificaciones, guarde y cierre el archivo. Si está utilizando nano, presione Ctrl+X, luego cuando se le solicite Yy luego Enter. A continuación, revisará la configuración del filtro para nginx-http-auth.
Paso 3: Revisión de filtros para Nginx Jails
Es posible que hayas notado que el [nginx-http-auth]bloque jail.localno contiene ninguna regla específica de Nginx. Estas reglas no están codificadas automáticamente dentro de Fail2ban; de hecho, el [nginx-http-auth]encabezado corresponde directamente a un nombre de archivo dentro del filter.ddirectorio de filtros preempaquetados de Fail2ban. Si enumeras el contenido de este directorio, puedes ver los otros filtros preempaquetados disponibles, en caso de que necesites usarlos alguna vez:
- ls /etc/fail2ban/filter.d
Output3proxy.conf freeswitch.conf proftpd.confapache-auth.conf froxlor-auth.conf pure-ftpd.confapache-badbots.conf gitlab.conf qmail.confapache-botsearch.conf grafana.conf recidive.confapache-common.conf groupoffice.conf roundcube-auth.confapache-fakegooglebot.conf gssftpd.conf scanlogd.confapache-modsecurity.conf guacamole.conf screensharingd.confapache-nohome.conf haproxy-http-auth.conf selinux-common.confapache-noscript.conf horde.conf selinux-ssh.confapache-overflows.conf ignorecommands sendmail-auth.confapache-pass.conf kerio.conf sendmail-reject.confapache-shellshock.conf lighttpd-auth.conf sieve.confassp.conf mongodb-auth.conf slapd.confasterisk.conf monit.conf softethervpn.confbitwarden.conf murmur.conf sogo-auth.conf…
Por ahora, eche un vistazo a nginx-http-auth.conf:
- cat /etc/fail2ban/filter.d/nginx-http-auth.conf
Output# fail2ban filter configuration for nginx[Definition]failregex = ^ [error] d+#d+: *d+ user "(?:[^"]+|.*?)":? (?:password mismatch|was not found in "[^"]*"")