Introducción
SSH es el método de facto para conectarse a un servidor en la nube. Es duradero y extensible: a medida que se desarrollan nuevos estándares de cifrado, se pueden utilizar para generar nuevas claves SSH, lo que garantiza que el protocolo principal siga siendo seguro. Sin embargo, ningún protocolo o conjunto de software es totalmente infalible, y el hecho de que SSH esté tan ampliamente implementado en Internet significa que 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 su servicio SSH que se ejecuta en cualquier servidor con mucho tráfico, a menudo verá intentos de inicio de sesión sistemáticos y repetidos que representan ataques de fuerza bruta por parte de usuarios y bots por igual. Aunque puede realizar algunas optimizaciones en su servicio SSH para reducir la posibilidad de que estos ataques tengan éxito a casi cero, como deshabilitar la autenticación con contraseña a favor de claves SSH , aún pueden representar una responsabilidad menor y continua.
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 su servicio SSH, de modo que sea imposible conectarse directamente al puerto SSH 22 predeterminado desde Internet externo sin abstracción de software o puertas de enlace adicionales. Estas soluciones 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, verá cómo instalar y usar Fail2ban en un servidor Debian 11.
Prerrequisitos
Para completar esta guía, necesitarás:
-
Un servidor Debian 11 y un usuario no root con privilegios sudo. Puede obtener más información sobre cómo configurar un usuario con estos privilegios en nuestra guía Configuración inicial del servidor con Debian 11 .
-
Opcionalmente, un segundo servidor desde el cual puedes conectarte a tu primer servidor, que usarás para probar si te banean deliberadamente.
Paso 1: Instalación de Fail2ban
Fail2ban está disponible en los repositorios de software de Debian. Comience ejecutando los siguientes comandos como usuario no root para actualizar sus listados de paquetes e instalar Fail2ban:
- sudo apt update
- sudo apt install fail2ban
Fail2ban configurará automáticamente un servicio en segundo plano después de instalarse. Puede comprobar su estado con el systemctlcomando:
- systemctl status fail2ban.service
Output● fail2ban.service - Fail2Ban Service Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enabled Active: active (running) since Tue 2022-06-28 16:23:14 UTC; 17s ago Docs: man:fail2ban(1) Process: 1942 ExecStartPre=/bin/mkdir -p /run/fail2ban (code=exited, status=0/SUCCESS Main PID: 1943 (fail2ban-server) Tasks: 5 (limit: 1132) Memory: 15.8M CPU: 280ms CGroup: /system.slice/fail2ban.service └─1943 /usr/bin/python3 /usr/bin/fail2ban-server -xf start
Puedes seguir usando Fail2ban con su configuración predeterminada, pero primero revisarás algunas de sus características.
Paso 2 – Configuración de Fail2ban
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
Mientras se desplaza por el archivo, este tutorial revisará algunas opciones que quizás desee actualizar. Las configuraciones ubicadas en la [DEFAULT]sección cerca de la parte superior del archivo se aplicarán a todos los servicios compatibles con Fail2ban. En otras partes del archivo, hay encabezados para [sshd]y para otros servicios, que contienen configuraciones específicas del servicio que se aplicarán sobre los valores predeterminados.
/etc/fail2ban/jail.local
[DEFAULT]. . .bantime = 10m. . .
El bantimeparámetro establece el período de tiempo durante el cual se prohibirá el acceso a un cliente cuando no se haya autenticado correctamente. Se mide en segundos. De manera predeterminada, está establecido en 10 minutos.
/etc/fail2ban/jail.local
[DEFAULT]. . .findtime = 10mmaxretry = 5. . .
Los dos parámetros siguientes son findtimey maxretry. Estos funcionan en conjunto para establecer las condiciones en las que se considera que un cliente es un usuario ilegítimo y debe ser baneado.
La maxretryvariable establece la cantidad de intentos que un cliente debe realizar para autenticarse dentro de un período de tiempo definido por findtime, antes de ser bloqueado. Con la configuración predeterminada, el servicio fail2ban bloqueará a un cliente que intente iniciar sesión sin éxito 5 veces en un período de 10 minutos.
/etc/fail2ban/jail.local
[DEFAULT]. . .destemail = root@localhostsender = root@fq-hostnamemta = sendmail. . .
Si necesita recibir alertas por correo electrónico cuando Fail2ban tome medidas, debe evaluar las configuraciones destemail, sendernamey mta. El destemailparámetro establece la dirección de correo electrónico que debe recibir los mensajes de prohibición. El sendernameestablece el valor del campo “De” en el correo electrónico. El mtaparámetro configura qué servicio de correo se utilizará para enviar correo. De manera predeterminada, es sendmail, pero es posible que desee utilizar Postfix u otra solución de correo.
/etc/fail2ban/jail.local
[DEFAULT]. . .action = $(action_)s. . .
Este pará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.
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"]# See the IMPORTANT note in action.d/xarf-login-attack for when to use this action## ban send a xarf e-mail to abuse contact of IP address and include relevant log lines# to the destemail.action_xarf = %(action_)s xarf-login-attack[service=%(__name__)s, sender="%(sender)s", logpath="%(logpath)s", port="%(port)s"]# ban IP on CloudFlare send an e-mail with whois report and relevant log lines# to the destemail.action_cf_mwl = cloudflare[cfuser="%(cfemail)s", cftoken="%(cfapikey)s"] %(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]…
Por ejemplo, action_mwtoma una acción y envía un correo electrónico, action_mwltoma una acción, envía un correo electrónico e incluye el registro, y action_cf_mwlhace todo lo anterior además de enviar una actualización a la API de Cloudflare asociada con su cuenta para prohibir al infractor allí también.
Configuraciones de cárceles individuales
A continuación, se encuentra la parte del archivo de configuración que se ocupa de los servicios individuales. Estos se especifican mediante encabezados de sección, como [sshd].
Cada una de estas secciones debe habilitarse individualmente agregando una enabled = truelínea debajo del encabezado, con sus otras configuraciones.
/etc/fail2ban/jail.local
[jail_to_enable]. . .enabled = true. . .
De manera predeterminada, el servicio SSH está habilitado y todos los demás están deshabilitados. Otras configuraciones que se establecen aquí son las filterque se usarán para decidir si una línea en un registro indica una autenticación fallida y las logpathque le indican a fail2ban dónde se encuentran los registros para ese servicio en particular.
El filtervalor es en realidad una referencia a un archivo ubicado en el /etc/fail2ban/filter.ddirectorio, sin su .confextensión. Estos archivos contienen expresiones regulares (una forma abreviada común de analizar texto) que determinan si una línea del registro es un intento de autenticación fallido. No abordaremos estos archivos en profundidad en esta guía, porque son bastante complejos y las configuraciones predefinidas coinciden bien con las líneas adecuadas.
Sin embargo, puedes ver qué tipo de filtros están disponibles consultando ese directorio:
- ls /etc/fail2ban/filter.d
Si ve un archivo que parece estar relacionado con un servicio que está utilizando, debe abrirlo con un editor de texto. La mayoría de los archivos están bastante bien comentados y debería poder al menos saber contra qué tipo de condición se diseñó el script para protegerse. La mayoría de estos filtros tienen secciones apropiadas (deshabilitadas) en el jail.confarchivo que podemos habilitar en el jail.localarchivo si lo deseamos.
Por ejemplo, imagina que estás ofreciendo un sitio web mediante Nginx y te das cuenta de que una parte protegida con contraseña de tu sitio está siendo bloqueada con intentos de inicio de sesión. Puedes indicarle a fail2ban que use el nginx-http-auth.confarchivo para verificar esta condición dentro del /var/log/nginx/error.logarchivo.
En realidad, esto ya está configurado en una sección llamada [nginx-http-auth]en su /etc/fail2ban/jail.confarchivo. Solo necesitaría agregar el enabledparámetro:
/etc/fail2ban/jail.local
. . .[nginx-http-auth]enabled = true. . .
Cuando haya terminado de editar, guarde y cierre el archivo. Si ha realizado algún cambio, puede reiniciar el servicio Fail2ban mediante systemctl:
- sudo systemctl restart fail2ban
En el siguiente paso, demostrará Fail2ban en acción.
Paso 3: Prueba de las políticas de prohibición (opcional)
Desde otro servidor, uno que no necesite iniciar sesión en su servidor Fail2ban en el futuro, puede probar las reglas haciendo que se bloquee ese segundo servidor. Después de iniciar sesión en su segundo servidor, intente conectarse por SSH al servidor Fail2ban. Puede intentar conectarse usando un nombre inexistente:
- ssh blah@your_server
Ingresa caracteres aleatorios en la solicitud de contraseña. Repite esto varias veces. En algún momento, el error que estás recibiendo debería cambiar de Permission denieda Connection refused. Esto indica que tu segundo servidor ha sido baneado del servidor Fail2ban.
En su servidor Fail2ban, puede ver la nueva regla al verificar su iptablessalida. iptableses un comando para interactuar con reglas de firewall y puertos de bajo nivel en su servidor. Si siguió la guía de DigitalOcean para la configuración inicial del servidor, podrá usarla ufwpara administrar reglas de firewall en un nivel superior. Al ejecutarla, iptables -Sse mostrarán todas las reglas de firewall que ufwya se crearon:
- sudo iptables -S
Output-P INPUT DROP-P FORWARD DROP-P OUTPUT ACCEPT-N f2b-sshd-N ufw-after-forward-N ufw-after-input-N ufw-after-logging-forward-N ufw-after-logging-input-N ufw-after-logging-output-N ufw-after-output-N ufw-before-forward-N ufw-before-input-N ufw-before-logging-forward-N ufw-before-logging-input-N ufw-before-logging-output…
Si canaliza la salida de iptables -Sto greppara buscar dentro de esas reglas la cadena f2b, podrá ver las reglas que ha agregado fail2ban:
- sudo iptables -S | grep f2b
Output-N f2b-sshd-A INPUT -p tcp -m multiport --dports 22 -j f2b-sshd-A f2b-sshd -s 134.209.165.184/32 -j REJECT --reject-with icmp-port-unreachable-A f2b-sshd -j RETURN
La línea que contiene REJECT --reject-with icmp-port-unreachablehabrá sido agregada por Fail2ban y debería reflejar la dirección IP de su segundo servidor.
Conclusión
Ahora debería poder configurar algunas políticas de prohibición para sus servicios. Fail2ban es una forma útil de proteger cualquier tipo de servicio que utilice autenticación. Si desea obtener más información sobre cómo funciona fail2ban, puede consultar nuestro tutorial sobre cómo funcionan las reglas y los archivos de fail2ban .
Para obtener información sobre cómo usar Fail2ban para proteger otros servicios, puede leer Cómo proteger un servidor Nginx con Fail2Ban y Cómo proteger un servidor Apache con Fail2Ban .