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 instalar fail2banRocky Linux 8 en un servidor y configurarlo para monitorear sus registros de Nginx en busca de intentos de intrusión.
Prerrequisitos
- Acceso a un entorno de servidor Rocky Linux 8 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 Rocky Linux 8 . - Nginx instalado en su sistema, siguiendo los pasos 1 y 2 de esta guía sobre cómo instalar Nginx en Rocky Linux 8 .
- Nginx instalado y configurado con autenticación de contraseña siguiendo Cómo configurar la autenticación de contraseña con Nginx en Rocky Linux 8 .
Paso 1: Instalación y configuración de Fail2ban
Fail2ban no está disponible en los repositorios de software predeterminados de Rocky. Sin embargo, está disponible en el repositorio EPEL , o Enhanced Packages for Enterprise Linux , que se utiliza habitualmente para paquetes de terceros en Red Hat y Rocky Linux. Si aún no ha añadido EPEL a las fuentes de paquetes de su sistema, puede añadir el repositorio utilizando dnf, como instalaría cualquier otro paquete:
- sudo dnf install epel-release
El dnfadministrador de paquetes comprobará ahora EPEL además de las fuentes de paquetes predeterminadas al instalar software nuevo. Proceda a instalar Fail2ban:
- sudo dnf 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: disabled 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. El editor de texto predeterminado que viene con Rocky Linux 8 es vi. vies un editor de texto extremadamente potente, pero puede resultar algo obtuso para los usuarios que no tienen experiencia con él. Puede instalar un editor más fácil de usar, como por ejemplo nanopara editar archivos de configuración en su servidor Rocky Linux 8:
- sudo dnf install nano
Ahora puedes usar nanopara editar tu archivo de configuración de Nginx:
- 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
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"]…
En el siguiente paso, pasará 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 "[^"]*"")