Introducción
SSH es el método por defecto para conectar a un servidor en la nube. Es duradero y es extensible, ya que conforme se desarrollan nuevos estándares de cifrado, pueden utilizarse para generar nuevas claves SSH, garantizando que el protocolo principal siga siendo seguro. Sin embargo, ningún protocolo o conjunto de software es completamente infalible, y dado que SSH está tan ampliamente desplegado en Internet, representa una superficie de ataque muy predecible o un vector de ataque a través del cual las personas pueden intentar obtener acceso.
Cualquier servicio expuesto a la red es un objetivo potencial de esta manera. Si revisas los registros de tu servicio SSH en cualquier servidor con mucho tráfico, a menudo verás intentos de inicio de sesión repetidos y sistemáticos que representan ataques de fuerza bruta tanto por parte de usuarios como de bots. Aunque puedes realizar algunas optimizaciones en tu servicio SSH para reducir la probabilidad de que estos ataques tengan éxito casi a cero, como desactivar la autenticación por contraseña a favor de las claves SSH, aún pueden representar una responsabilidad menor y continua.
Las implementaciones de producción a gran escala para las cuales 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 predeterminado 22 desde Internet sin abstracción de software adicional o pasarelas. Estas soluciones VPN son ampliamente confiables, pero agregarán complejidad y pueden romper algunas automatizaciones u otros ganchos de software pequeños.
Antes o además de comprometerse con una configuración completa de VPN, puede implementar una herramienta llamada Fail2ban. Fail2ban puede mitigar significativamente los ataques de fuerza bruta mediante la creación de reglas que alteran automáticamente la configuración de su firewall para prohibir IPs específicas después de un cierto número de intentos de inicio de sesión fallidos. Esto permitirá que su servidor se endurezca contra estos intentos de acceso sin intervención de su parte.
En esta guía, verás cómo instalar y usar Fail2ban en un servidor Ubuntu 22.04.
Prerrequisitos
Para completar esta guía, necesitarás:
-
Un servidor Ubuntu 22.04 y un usuario no root con privilegios sudo. Puedes aprender más sobre cómo configurar un usuario con estos privilegios en nuestra guía Configuración inicial del servidor con Ubuntu 22.04.
-
Opcionalmente, un segundo servidor al que puede conectarse desde su primer servidor, que usará para probar ser deliberadamente prohibido.
Paso 1: Instalación de Fail2ban
Fail2ban está disponible en los repositorios de software de Ubuntu. Comience ejecutando los siguientes comandos como usuario no root para actualizar sus listas de paquetes e instalar Fail2ban:
Fail2ban configurará automáticamente un servicio en segundo plano después de ser instalado. Sin embargo, está desactivado de manera predeterminada, porque algunos de sus ajustes por defecto pueden causar efectos no deseados. Puede verificar esto usando el comando systemctl
:
Output○ fail2ban.service - Fail2Ban Service
Loaded: loaded (/lib/systemd/system/fail2ban.service; disabled; vendor preset: enabled
Active: inactive (dead)
Docs: man:fail2ban(1)
Podría habilitar Fail2ban de inmediato, pero primero revisará algunas de sus características.
Paso 2: Configuración de Fail2ban
El servicio fail2ban guarda sus archivos de configuración en el directorio /etc/fail2ban
. Hay un archivo con los valores predeterminados llamado jail.conf
. Ve a ese directorio e imprime las primeras 20 líneas de ese archivo usando head -20
:
Output#
# ADVERTENCIA: muy refactorizado en la versión 0.9.0. Por favor, revise y
# personalize la configuración para su entorno.
#
# Cambios: en la mayoría de los casos no debería modificar este
# archivo, sino proporcionar personalizaciones en el archivo jail.local,
# o archivos .conf separados en el directorio jail.d/, por ejemplo:
#
# CÓMO ACTIVAR CÁRCELES:
#
# NO DEBERÍA MODIFICAR ESTE ARCHIVO.
#
# Probablemente será sobrescrito o mejorado en una actualización de distribución.
#
# Proporcione personalizaciones en un archivo jail.local o en un jail.d/customisation.local.
# Por ejemplo, para cambiar el tiempo de prohibición predeterminado para todas las cárceles y para habilitar el
# cárcel ssh-iptables, lo siguiente (descomentado) aparecería en el archivo .local.
# Vea el manual 5 jail.conf para más detalles.
#
# [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 en lugar de como ajustes. Como también verás, estos comentarios te están indicando que no modifiques este archivo directamente. En su lugar, tienes dos opciones: o bien crear perfiles individuales para Fail2ban en varios archivos dentro del directorio jail.d/
, o crear y recopilar todas tus configuraciones locales en un archivo jail.local
. El archivo jail.conf
se actualizará periódicamente a medida que Fail2ban mismo se actualice, y se utilizará como fuente de ajustes predeterminados para los cuales no has creado ninguna anulación.
En este tutorial, crearás jail.local
. Puedes hacerlo copiando jail.conf
:
Ahora puedes comenzar a realizar cambios de configuración. Abre el archivo en nano
o tu editor de texto favorito:
Mientras estás desplazándote por el archivo, este tutorial revisará algunas opciones que es posible que desees actualizar. Los ajustes ubicados bajo la sección [DEFAULT]
cerca del principio 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 ajustes específicos del servicio que se aplicarán por encima de los predeterminados.
[DEFAULT]
. . .
bantime = 10m
. . .
El parámetro bantime
establece la duración del tiempo durante el cual un cliente será prohibido cuando haya fallado en autenticarse correctamente. Esto se mide en segundos. Por defecto, está establecido en 10 minutos.
[DEFAULT]
. . .
findtime = 10m
maxretry = 5
. . .
Los siguientes dos parámetros son findtime
y maxretry
. Estos trabajan juntos para establecer las condiciones bajo las cuales un cliente es considerado un usuario ilegítimo que debería ser prohibido.
La variable maxretry
establece el número de intentos que un cliente tiene para autenticarse dentro de una ventana de tiempo definida por findtime
, antes de ser prohibido. Con la configuración predeterminada, el servicio fail2ban prohibirá a un cliente que intente iniciar sesión sin éxito 5 veces dentro de una ventana de 10 minutos.
[DEFAULT]
. . .
destemail = root@localhost
sender = root@<fq-hostname>
mta = sendmail
. . .
Si necesitas recibir alertas por correo electrónico cuando Fail2ban actúe, debes evaluar los ajustes de destemail
, sendername
y mta
. El parámetro destemail
establece la dirección de correo electrónico que debería recibir los mensajes de prohibición. El sendername
establece el valor del campo “De” en el correo electrónico. El parámetro mta
configura qué servicio de correo se utilizará para enviar el correo. De manera predeterminada, esto es sendmail
, pero es posible que desees utilizar Postfix u otra solución de correo.
[DEFAULT]
. . .
action = $(action_)s
. . .
Este parámetro configura la acción que Fail2ban toma cuando desea instituir una prohibición. El valor action_
está definido en el archivo poco antes de este parámetro. La acción predeterminada es actualizar la configuración de tu firewall para rechazar el tráfico del host ofensor hasta que el tiempo de prohibición transcurra.
Existen otros scripts de action_
proporcionados de forma predeterminada que puedes reemplazar $(action_)
con lo siguiente:
…
# prohibir y enviar un correo electrónico con el informe whois al correo electrónico de destino.
action_mw = %(action_)s
%(mta)s-whois[sender="%(sender)s", dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"]
# prohibir y enviar un correo electrónico con el informe whois y líneas de registro relevantes
# al correo electrónico de destino.
action_mwl = %(action_)s
%(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]
# Vea la nota IMPORTANTE en action.d/xarf-login-attack para cuándo usar esta acción
#
# prohibir y enviar un correo electrónico xarf al contacto de abuso de la dirección IP e incluir líneas de registro relevantes
# al correo electrónico de destino.
action_xarf = %(action_)s
xarf-login-attack[service=%(__name__)s, sender="%(sender)s", logpath="%(logpath)s", port="%(port)s"]
# prohibir la IP en CloudFlare y enviar un correo electrónico con el informe whois y líneas de registro relevantes
# al correo electrónico de destino.
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_mw
toma acción y envía un correo electrónico, action_mwl
toma acción, envía un correo electrónico e incluye registro, y action_cf_mwl
hace todo lo anterior además de enviar una actualización a la API de Cloudflare asociada con tu cuenta para prohibir al infractor allí también.
Configuración Individual de Cárcel
A continuación se muestra la parte del archivo de configuración que trata sobre servicios individuales. Estos se especifican mediante encabezados de sección, como [sshd]
.
Cada una de estas secciones debe habilitarse individualmente agregando una línea enabled = true
debajo del encabezado, con sus otras configuraciones.
[jail_to_enable]
. . .
enabled = true
. . .
Por defecto, el servicio SSH está habilitado y todos los demás están desactivados.
.
Algunas otras configuraciones que se establecen aquí son el filter
que se utilizará para decidir si una línea en un registro indica una autenticación fallida y el logpath
que indica a fail2ban dónde se encuentran los registros para ese servicio en particular.
El valor de filter
es en realidad una referencia a un archivo ubicado en el directorio /etc/fail2ban/filter.d
, con su extensión .conf
eliminada. Estos archivos contienen expresiones regulares (una abreviatura común para el análisis de texto) que determinan si una línea en el registro es un intento de autenticación fallido. No cubriremos estos archivos en detalle en esta guía, porque son bastante complejos y los ajustes predefinidos coinciden bien con las líneas apropiadas.
Sin embargo, puedes ver qué tipo de filtros están disponibles mirando ese directorio:
Si ves un archivo que parece relacionado con un servicio que estás utilizando, debes abrirlo con un editor de texto. La mayoría de los archivos están bastante bien comentados y deberías poder al menos saber qué tipo de condición fue diseñada para proteger el script. La mayoría de estos filtros tienen secciones apropiadas (desactivadas) en el archivo jail.conf
que podemos habilitar en el archivo jail.local
si se desea.
Por ejemplo, imagina que estás sirviendo un sitio web usando Nginx y te das cuenta de que una parte protegida por contraseña de tu sitio está siendo bombardeada con intentos de inicio de sesión. Puedes indicarle a fail2ban que use el archivo nginx-http-auth.conf
para verificar esta condición dentro del archivo /var/log/nginx/error.log
.
Esto ya está configurado en una sección llamada [nginx-http-auth]
en tu archivo /etc/fail2ban/jail.conf
. Solo necesitarías agregar el parámetro enabled
:
. . .
[nginx-http-auth]
enabled = true
. . .
Cuando hayas terminado de editar, guarda y cierra el archivo. En este punto, puedes habilitar tu servicio Fail2ban para que se ejecute automáticamente de ahora en adelante. Primero, ejecuta systemctl enable
:
Luego, inícialo manualmente por primera vez con systemctl start
:
Puedes verificar que esté en ejecución con systemctl status
:
Output● fail2ban.service - Fail2Ban Service
Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enab>
Active: active (running) since Mon 2022-06-27 19:25:15 UTC; 3s ago
Docs: man:fail2ban(1)
Main PID: 39396 (fail2ban-server)
Tasks: 5 (limit: 1119)
Memory: 12.9M
CPU: 278ms
CGroup: /system.slice/fail2ban.service
└─39396 /usr/bin/python3 /usr/bin/fail2ban-server -xf start
Jun 27 19:25:15 fail2ban22 systemd[1]: Started Fail2Ban Service.
Jun 27 19:25:15 fail2ban22 fail2ban-server[39396]: Server ready
En el siguiente paso, demostrarás Fail2ban en acción.
Paso 3 — Probando las Políticas de Bloqueo (Opcional)
Desde otro servidor, uno que no necesitará iniciar sesión en tu servidor Fail2ban en el futuro, puedes probar las reglas haciendo que ese segundo servidor sea bloqueado. Después de iniciar sesión en tu segundo servidor, intenta conectarte por SSH al servidor Fail2ban. Puedes intentar conectar usando un nombre inexistente:
Ingrese caracteres aleatorios en el prompt de contraseña. Repita esto varias veces. En algún momento, el error que está recibiendo debería cambiar de Permiso denegado
a Conexión rechazada
. Esto indica que su segundo servidor ha sido prohibido en el servidor Fail2ban.
En su servidor Fail2ban, puede ver la nueva regla revisando la salida de su iptables
. iptables
es un comando para interactuar con reglas de puertos y firewall de bajo nivel en su servidor. Si siguió la guía de DigitalOcean para la configuración inicial del servidor, estará usando ufw
para administrar reglas de firewall a un nivel más alto. Ejecutar iptables -S
le mostrará todas las reglas de firewall que ufw
ya creó:
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 -S
a grep
para buscar dentro de esas reglas la cadena f2b
, puede ver las reglas que han sido agregadas por fail2ban:
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-unreachable
habrá sido agregada por Fail2ban y debería reflejar la dirección IP de su segundo servidor.
Conclusión
Deberías poder configurar algunas políticas de prohibición para tus servicios ahora. Fail2ban es una forma útil de proteger cualquier tipo de servicio que utilice autenticación. Si quieres aprender más sobre cómo funciona fail2ban, puedes consultar nuestro tutorial sobre cómo funcionan las reglas y archivos de fail2ban.
Para obtener información sobre cómo usar fail2ban para proteger otros servicios, puedes leer sobre Cómo proteger un servidor Nginx con Fail2Ban en Ubuntu 14.04 y Cómo proteger un servidor Apache con Fail2Ban en Ubuntu 14.04.
Source:
https://www.digitalocean.com/community/tutorials/how-to-protect-ssh-with-fail2ban-on-ubuntu-22-04