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, estos pueden utilizarse para generar nuevas claves SSH, lo que garantiza la seguridad del protocolo principal. Sin embargo, ningún protocolo ni pila de software es totalmente infalible, y la amplia implementación de SSH en internet lo convierte en una superficie o vector de ataque muy predecible a través del cual se puede intentar acceder.
Cualquier servicio expuesto a la red es un objetivo potencial en este sentido. Si revisa los registros de su servicio SSH en cualquier servidor con mucho tráfico, verá con frecuencia intentos de inicio de sesión repetidos y sistemáticos que representan ataques de fuerza bruta, tanto por parte de usuarios como de bots. Si bien puede optimizar su servicio SSH para reducir prácticamente a cero la probabilidad de éxito de estos ataques, como deshabilitar la autenticación con contraseña en favor de claves SSH , aún pueden representar una pequeña responsabilidad.
Las implementaciones de producción a gran escala, para las cuales esta responsabilidad es completamente inaceptable, suelen implementar una VPN como WireGuard frente a su servicio SSH, lo que impide la conexión directa al puerto SSH 22 predeterminado desde internet externo sin abstracción de software adicional ni puertas de enlace. Estas soluciones VPN gozan de amplia confianza, pero añadirán complejidad y pueden interrumpir algunas automatizaciones u otros pequeños ganchos de software.
Antes o además de implementar una configuración VPN completa, puede implementar una herramienta llamada Fail2ban . Fail2ban puede mitigar significativamente los ataques de fuerza bruta al crear reglas que modifican automáticamente la configuración de su firewall para bloquear IP específicas después de un cierto número 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 Ubuntu 22.04.
Prerrequisitos
Para completar esta guía, necesitarás:
- Un servidor Ubuntu 22.04 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 Ubuntu 22.04” .
- Opcionalmente, un segundo servidor al que puedes conectarte a tu primer servidor y que usarás para probar si te banean deliberadamente.
Paso 1: Instalación de Fail2ban
Fail2ban está disponible en los repositorios de software de Ubuntu. Para empezar, ejecute los siguientes comandos como usuario no root para actualizar la lista de paquetes e instalar Fail2ban:
sudo apt update
sudo apt install fail2ban
Fail2ban configurará automáticamente un servicio en segundo plano tras su instalación. Sin embargo, está deshabilitado por defecto, ya que algunas de sus configuraciones predeterminadas pueden causar efectos no deseados. Puede comprobarlo con el systemctl
comando:
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 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/fail2ban
directorio. Hay un archivo con valores predeterminados llamado jail.conf
. Acceda 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á, las primeras líneas de este archivo están comentadas ; comienzan con #
caracteres que indican que deben interpretarse como documentación y no como configuración. Como también verá, estos comentarios le indican que no modifique este archivo directamente. En su lugar, tiene dos opciones: crear perfiles individuales para Fail2ban en varios archivos dentro del jail.d/
directorio o crear y recopilar todas sus configuraciones locales en un jail.local
archivo. El jail.conf
archivo se actualizará periódicamente a medida que Fail2ban se actualiza y se utilizará como fuente de las configuraciones predeterminadas para las que no ha creado ninguna modificación.
En este tutorial, crearás un archivo jail.local
. Puedes hacerlo copiando jail.conf
:
sudo cp jail.conf jail.local
Ahora puede empezar a realizar cambios en la configuración. Abra el archivo en nano
su editor de texto favorito:
sudo nano jail.local
Mientras revisa el archivo, este tutorial revisará algunas opciones que quizás desee actualizar. La configuración ubicada en la [DEFAULT]
sección cerca de la parte superior del archivo se aplicará a todos los servicios compatibles con Fail2ban. En otras partes del archivo, encontrará encabezados para [sshd]
y para otros servicios, que contienen configuraciones específicas de cada servicio que se aplicarán sobre los valores predeterminados. /etc/fail2ban/jail.local
[DEFAULT]
. . .
bantime = 10m
. . .
Este bantime
parámetro establece el tiempo que se baneará a un cliente si no se autentica correctamente. Se mide en segundos. El valor predeterminado es de 10 minutos. /etc/fail2ban/jail.local
[DEFAULT]
. . .
findtime = 10m
maxretry = 5
. . .
Los siguientes dos parámetros son findtime
y maxretry
. Estos funcionan en conjunto para establecer las condiciones bajo las cuales un cliente se considera un usuario ilegítimo y debe ser baneado.
La maxretry
variable establece el número de intentos que un cliente debe realizar para autenticarse dentro de un período definido por [nombre del cliente] 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@localhost
sender = root@<fq-hostname>
mta = sendmail
. . .
Si necesita recibir alertas por correo electrónico cuando Fail2ban realiza alguna acción, debe evaluar las configuraciones , y . El destemail
parámetro sendername
establece la dirección de correo electrónico que debe recibir los mensajes de prohibición. El parámetro establece el valor del campo “De” en el correo electrónico. El parámetro configura el servicio de correo que se usará para enviar el correo. Por defecto, es , pero puede que le convenga usar Postfix u otra solución de correo.mtadestemailsendernamemtasendmail
/etc/fail2ban/jail.local
[DEFAULT]
. . .
action = $(action_)s
. . .
Este parámetro configura la acción que Fail2ban realiza al iniciar un bloqueo. El valor action_
se define en el archivo justo 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 bloqueo.
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_mw
toma una acción y envía un correo electrónico, action_mwl
toma una acción, envía un correo electrónico e incluye el registro, y action_cf_mwl
hace 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 carcelarias individuales
A continuación, se encuentra la parte del archivo de configuración que gestiona los servicios individuales. Estos se especifican mediante encabezados de sección, como [sshd]
.
Cada una de estas secciones debe habilitarse individualmente agregando una enabled = true
línea debajo del encabezado, con sus otras configuraciones. /etc/fail2ban/jail.local
[jail_to_enable]
. . .
enabled = true
. . .
De forma predeterminada, el servicio SSH está habilitado y todos los demás están deshabilitados. Otras configuraciones que se establecen aquí son las filter
que se usarán para determinar si una línea en un registro indica una autenticación fallida y las logpath
que indican a fail2ban dónde se encuentran los registros de ese servicio en particular.
El filter
valor es en realidad una referencia a un archivo ubicado en el /etc/fail2ban/filter.d
directorio, sin .conf
extensión. Estos archivos contienen expresiones regulares (una forma abreviada común de analizar texto) que determinan si una línea del registro representa un intento de autenticación fallido. No profundizaremos en estos archivos en esta guía, ya que son bastante complejos y la configuración predefinida se ajusta correctamente a las líneas correspondientes.
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, debería abrirlo con un editor de texto. La mayoría de los archivos están bien comentados y debería poder al menos identificar el tipo de condición que el script estaba diseñado para proteger. La mayoría de estos filtros tienen secciones apropiadas (deshabilitadas) en el jail.conf
archivo que podemos habilitar jail.local
si lo desea.
Por ejemplo, imagina que estás sirviendo un sitio web con Nginx y te das cuenta de que una sección protegida con contraseña se ve bloqueada con los intentos de inicio de sesión. Puedes indicarle a fail2ban que use el nginx-http-auth.conf
archivo para comprobar si existe esta condición /var/log/nginx/error.log
.
Esto ya está configurado en una sección llamada [nginx-http-auth]
en tu /etc/fail2ban/jail.conf
archivo. Solo necesitas agregar el enabled
parámetro: /etc/fail2ban/jail.local
. . .
[nginx-http-auth]
enabled = true
. . .
Cuando termine de editar, guarde y cierre el archivo. Ahora puede habilitar el servicio Fail2ban para que se ejecute automáticamente. Primero, ejecute systemctl enable
:
sudo systemctl enable fail2ban
Luego, inícielo manualmente por primera vez con systemctl start
:
sudo systemctl start fail2ban
Puedes verificar que se está ejecutando con systemctl status
:
sudo systemctl status fail2ban
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á 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 tu servidor Fail2ban en el futuro, puedes probar las reglas baneando ese segundo servidor. Después de iniciar sesión en tu segundo servidor, intenta acceder por SSH al servidor Fail2ban. Puedes intentar conectarte con un nombre inexistente:
ssh blah@your_server
Introduce caracteres aleatorios en la solicitud de contraseña. Repite esto varias veces. En algún momento, el error que recibes debería cambiar de Permission denied
a Connection refused
. Esto indica que tu segundo servidor ha sido baneado del servidor Fail2ban.
En su servidor Fail2ban, puede ver la nueva regla revisando la iptables
salida. iptables
es un comando para interactuar con las reglas de puerto y firewall de bajo nivel en su servidor. Si siguió la guía de DigitalOcean para la configuración inicial del servidor, la usará ufw
para administrar las reglas de firewall a un nivel superior. Al ejecutarlo, iptables -S
se mostrarán todas las reglas de firewall ufw
ya creadas:
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 -S
para grep
buscar dentro de esas reglas la cadena f2b
, podrá ver las reglas que fail2ban agregó:
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-unreachable
habrá 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 el funcionamiento de las reglas y 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 en Ubuntu 14.04 y Cómo proteger un servidor Apache con Fail2Ban en Ubuntu 14.04 .