Cómo proteger SSH con Fail2Ban en Ubuntu

Introducción

Si bien la conexión a tu servidor a través de SSH puede ser muy segura, el propio demonio de SSH es un servicio que debe estar expuesto a Internet para que funcione correctamente. Esto conlleva cierto riesgo inherente y crea un vector de ataque para los posibles ciberdelincuentes.

Cualquier servicio que esté expuesto a la red es un objetivo potencial de esta manera. Si prestas atención a los registros de aplicaciones para estos servicios, a menudo verás intentos de inicio de sesión repetidos y sistemáticos que representan ataques de fuerza bruta por parte de usuarios y robots por igual.

Un servicio llamado fail2ban puede mitigar este problema mediante la creación de reglas que pueden alterar automáticamente la configuración iptables de tu firewall en función de un número predefinido de intentos de inicio de sesión fallidos. Esto permitirá que tu servidor responda a intentos de acceso ilegítimos sin tu intervención.

En esta guía, veremos cómo instalar y usar fail2ban en un servidor Ubuntu.

Instalar Fail2Ban en Ubuntu

El proceso de instalación de esta herramienta es simple porque el equipo de empaquetado de Ubuntu mantiene un paquete en los repositorios predeterminados.

Primero, debemos actualizar el índice de nuestro paquete local y luego podemos usarlo apt para descargar e instalar el paquete:

Como puedes ver, la instalación es trivial. Ahora podemos comenzar a configurar la utilidad para nuestro propio uso.

Configurar Fail2Ban con sus ajustes de servicio

El servicio fail2ban mantiene sus archivos de configuración en el directorio /etc/fail2ban. Hay un archivo con los valores predeterminados llamados jail.conf.

Dado que este archivo puede modificarse mediante actualizaciones de paquetes, no debemos editar este archivo en el lugar, sino copiarlo para que podamos realizar nuestros cambios de forma segura. Para que estos dos archivos funcionen juntos con éxito, lo mejor es incluir solo las configuraciones que deseas anular en el archivo jail.local. Todas las opciones predeterminadas se tomarán del archivo jail.conf.

Aunque solo deberíamos incluir las desviaciones del valor predeterminado en el archivo jail.local, es más fácil crear un archivo jail.local basado en el archivo jail.conf existente . Así que copiaremos ese archivo, con los contenidos comentados, como base para el archivo jail.local. Tu puedes hacer esto escribiendo:

Una vez que se copie el archivo, podemos abrir el archivo jail.conf original para ver cómo se configuran las cosas de forma predeterminada

Configuraciones

En este archivo, hay algunas configuraciones que tal vez desees ajustar. La configuración ubicada debajo de la sección [DEFAULT] se aplicará a todos los servicios habilitados para fail2ban que no estén anulados en la propia sección del servicio.

La configuración ignoreip configura las direcciones de origen que fail2ban ignora. De forma predeterminada, está configurado para no prohibir el tráfico proveniente de la máquina local. Puedes agregar direcciones adicionales para ignorar agregando una sección [DEFAULT] con una configuración ignoreip debajo del archivo jail.local. Puedes agregar direcciones adicionales agregándolas al final de la directiva, separadas por un espacio.

El parámetro bantime establece la cantidad de tiempo que un cliente estará prohibido cuando no se hayan autenticado correctamente. Esto se mide en segundos. De forma predeterminada, esto se establece en 600 segundos o 10 minutos.

Otros parámetros

Los siguientes dos parámetros a los que deseas prestar atención son findtimemaxretry. Estos trabajan juntos para establecer las condiciones bajo las cuales se encuentra que un cliente es un usuario ilegítimo que debe ser prohibido.

La variable maxretry establece el número de intentos que un cliente debe autenticar 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 3 veces en una ventana de 10 minutos.

Tendrás que evaluar los ajustes de destemailsendernamemta si deseas configurar alertas de correo electrónico. El parámetro destemail establece la dirección de correo electrónico que debe recibir mensajes de prohibición.  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 correo. Una vez más, agrégalos al archivo jail.local, debajo del encabezado [DEFAULT] y establece los valores adecuados si deseas ajustarlos.

Este parámetro configura la acción que fail2ban realiza cuando quiere instituir una prohibición. El valor action_ se define en el archivo poco antes de este parámetro. La acción predeterminada es simplemente configurar el firewall para rechazar el tráfico del host ofensivo hasta que transcurra el tiempo de prohibición.

Si deseas configurar alertas de correo electrónico, agrega o elimina el comentario del elemento action del archivo jail.local y cambia su valor de action_action_mw. Si deseas que el correo electrónico incluya las líneas de registro relevantes, puedes cambiarlo a action_mwl. Asegúrate de tener configuradas las opciones de correo apropiadas si eliges usar alertas de correo.

Configuración Jail individual

Finalmente, llegamos a la parte del archivo de configuración que se ocupa de los servicios individuales. Estos están especificados por los encabezados de sección, como [ssh].

Cada una de estas secciones se puede habilitar al descomentar el encabezado jail.local y cambiar la línea enabled a “true”:

De forma predeterminada, el servicio SSH está habilitado y todos los demás están deshabilitados.

Estas secciones funcionan utilizando los valores establecidos en la sección [DEFAULT] como base y modificándolos según sea necesario. Si deseas anular cualquier valor, puedes hacerlo agregando la sección del servicio correspondiente jail.local y modificando sus valores.

Algunas otras opciones que se configuran aquí son las que filter se utilizarán para decidir si una línea en un registro indica una autenticación fallida y logpath que le indica a fail2ban dónde se encuentran los registros de ese servicio en particular.

El valor 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 las expresiones regulares que determinan si una línea en el registro es un intento de autenticación fallido. No cubriremos estos archivos en profundidad en esta guía, ya que son bastante complejos y las configuraciones predefinidas coinciden bien con las líneas apropiadas.

Sin embargo, puedes ver qué tipo de filtros están disponibles echando un vistazo en ese directorio:

Servicios

Si ves un archivo que parece estar 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, al menos, deberías saber qué tipo de condición fue diseñada para proteger contra el script.

La mayoría de estos filtros tienen secciones apropiadas (deshabilitadas) en el archivo jail.conf que podemos habilitar en el archivo jail.local si lo deseas.

Por ejemplo, simula que estamos mostrando un sitio web con Nginx y comprendes que una parte de nuestro sitio protegida con contraseña se está cerrando de golpe con los intentos de inicio de sesión. Podemos decirle 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 nuestro archivo /etc/fail2ban/jail.conf. Solo deberíamos descomentar el comentario en la sección del archivo jail.local y cambiar el parámetro enabled para proteger nuestro servicio:

Si habilitas esto, querrás reiniciar tu servicio fail2ban para asegurarte de que tus reglas están construidas correctamente.

Uniendo todo

Ahora que comprendes la idea básica detrás de fail2ban, hagamos una configuración básica.

Vamos a configurar una política de prohibición automática de SSH y Nginx, tal como lo describimos anteriormente. Queremos que fail2ban nos envíe un correo electrónico cuando una IP esté prohibida.

Primero, instalemos todo el software relevante.

Si aún no lo tienes, necesitarás nginx, ya que vamos a estar monitoreando sus registros, y necesitarás sendmail para enviarnos notificaciones. También lo haremos necesitamos iptables-persistent para permitir que el servidor configure automáticamente nuestras reglas de firewall en el arranque. Estos pueden ser adquiridos desde los repositorios predeterminados de Ubuntu:

Detén el servicio fail2ban por un momento para que podamos establecer un firewall base sin las reglas y agrega:

Establecer un firewall base

Cuando esto termine, deberíamos implementar un firewall predeterminado. Puedes aprender cómo configurar un firewall de iptables aquí. Vamos a crear un firewall básico para esta guía.

Le diremos que permita las conexiones establecidas, el tráfico generado por el propio servidor, el tráfico destinado a nuestros puertos SSH y servidores web. Dejaremos todo el resto del tráfico. Podemos configurar este firewall básico escribiendo:

Reglas

Estos comandos implementarán la política anterior. Podemos ver nuestras reglas actuales de firewall escribiendo:

Puedes guardar los firewalls para que sobrevivan a un reinicio escribiendo:

Después, puedes reiniciar fail2ban para implementar las reglas de ajuste:

Podemos ver nuestras reglas actuales del firewall escribiendo:

Tenemos nuestra política predeterminada para cada una de nuestras cadenas, y luego las cinco reglas básicas que establecimos.

También tenemos la estructura predeterminada configurada por fail2ban que ya implementa las políticas de prohibición de SSH de forma predeterminada. Estos pueden aparecer o no al principio, ya que a veces fail2ban no se agrega la estructura hasta que se implementa la primera prohibición.

Ajustando la configuración de Fail2ban

Ahora, necesitamos configurar fail2ban usando la configuración que nos gustaría. Abre el archivo jail.local:

Podemos establecer un tiempo de prohibición más severo aquí. Encuentra y descomenta el encabezado [DEFAULT]. Bajo el encabezado predeterminado, cambia la configuración bantime para que nuestro servicio prohíba a los clientes durante media hora:

También necesitamos configurar nuestra información de alerta por correo electrónico. Primero, encuentra el parámetro destemail, que también debe estar bajo el encabezado [DEFAULT]. Introduce la dirección de correo electrónico que deseas utilizar para recopilar estos mensajes:

Puedes configurar sendername a otra cosa si lo deseas. Sin embargo, es útil tener un valor que se pueda filtrar fácilmente con tu servicio de correo, o de lo contrario, tu bandeja de entrada habitual puede verse inundada de alertas si se producen muchas interrupciones en los intentos de varios lugares.

Moviéndonos hacia abajo, necesitamos ajustar el parámetro action a una de las acciones que nos envía un correo electrónico. Las opciones son entre action_mw qué instituye la prohibición y luego nos envía un informe “whois” en el host ofensivo, o action_mwl que hace lo anterior, pero también envía por correo electrónico las líneas de registro relevantes.

Vamos a elegir action_mwl porque las líneas de registro nos ayudarán a solucionar problemas y recopilar más información si hay problemas:

SSH

Pasando a nuestra sección de SSH, si queremos ajustar la cantidad de intentos fallidos que deberían permitirse antes de que se establezca una prohibición, puedes editar la entrada maxretry. Si estás utilizando un puerto que no sea “22”, querrás ajustar el parámetro port adecuadamente. Como dijimos anteriormente, este servicio ya está habilitado, por lo que no necesitamos modificarlo.

A continuación, busca la sección nginx-http-auth. Descomenta el encabezado y cambia el parámetro enabled para que se lea “true”.

Esto debería ser todo lo que tienes que hacer en esta sección a menos que tu servidor web esté operando en puertos no estándar o si moviste la ruta de registro de errores predeterminada.

Reiniciando el servicio Fail2ban

Cuando hayas terminado, guarda y cierra el archivo.

Ahora, inicia o reinicia tu servicio fail2ban. A veces, es mejor cerrar completamente el servicio y luego volver a iniciarlo:

Ahora podemos reiniciarlo escribiendo:

Es posible que se demore algunos minutos en rellenar todas las reglas del firewall. A veces, las reglas no se agregan hasta que se establece la primera prohibición de ese tipo. Sin embargo, después de un tiempo, puedes verificar las nuevas reglas escribiendo:

Las líneas en rojo son las que han creado nuestras políticas fail2ban. En este momento, solo están dirigiendo el tráfico a cadenas nuevas, casi vacías, y luego están permitiendo que el tráfico vuelva a ingresar a la cadena de ENTRADA.

Sin embargo, estas nuevas cadenas son donde se agregarán las reglas de prohibición.

Probando las políticas de prohibición

Desde otro servidor, uno que no necesita iniciar sesión en tu servidor fail2ban, podemos probar las reglas haciendo que nuestro segundo servidor sea prohibido.

Después de iniciar sesión en tu segundo servidor, prueba SSH en el servidor fail2ban. Puedes intentar conectarte utilizando un nombre que no existe, por ejemplo:

Introduce caracteres aleatorios en la solicitud de contraseña. Repite esto unas cuantas veces. En algún momento, el servidor fail2ban dejará de responder con el mensaje Permission denied. Esto indica que tu segundo servidor ha sido excluido del servidor fail2ban.

En tu servidor fail2ban, puedes ver la nueva regla al revisar iptables nuevamente:

Como puedes ver en la línea resaltada, tenemos una nueva regla en nuestra configuración que rechaza el tráfico al puerto SSH que proviene de la dirección IP de nuestro segundo servidor. También deberías haber recibido un correo electrónico sobre la prohibición en la cuenta que configuraste.

Conclusión

Ahora deberías poder configurar algunas políticas de prohibición básicas para tus servicios. Fail2ban es muy fácil de configurar y es una excelente manera de proteger cualquier tipo de servicio que use autenticación.