Este es uno de los capítulos del tutorial Servidor virtual. Encontrarás los enlaces a todos los de capítulos, al final de este artículo.
En un artículo anterior, viste como proteger tu servidor o Raspberry Pi a base de cerrar puertos. Impedir que alguien entre en tu servidor no es sencillo, lo mismo que sucede con alguien que quiera entrar en tu casa. Ahora bien, una cosa es impedir que un amante de lo ajeno entre en tu casa, y otra es dejar las puertas abiertas de par en par. La cuestión, es poner los medios que estén a nuestro alcance para poner las cosas lo mas difícil posible. Si en el artículo anterior vimos como cerrar puertas, en este vamos a ver como bloquear intentos de abrir puertas. Es decir vamos a poner los mecanismos para bloquear accesos indeseables a tu servidor o Raspberry Pi.
Imagínate que pudieras controlar quien intenta acceder a tu casa. En este caso, si alguien intenta abrir la puerta, y después de tres intentos no lo consigue, se bloquea el acceso solo para él. No está nada mal. Creo que es una forma muy sencilla y potente de controlar los accesos. Precisamente esto es lo que hace fail2ban, vigilar quien intenta entrar y si se equivoca se impedir su acceso, es decir, que lo que hace no es mas que bloquear accesos indeseables.
Bloquear accesos indeseables a tu servidor o aplicación con Fail2ban
Fail2ban es una software orientado a la prevención de accesos no autorizados, accesos de intrusos.
¿Como funciona Fail2ban?
El funcionamiento de esta herramienta es tan sencillo como ingenioso. Lo que hace es monitorizar los archivos de registro, log files, en busca de actividad sospechosa. Básicamente busca direcciones IP con repetidos intentos de acceso. También busca otras acciones no deseadas y que se hayan dado de forma repetida o no, durante un intervalo de tiempo determinado. En el caso de localizar estos intentos, lo que hace es bloquear accesos indeseables.
Un servidor accesible desde cualquier parte del mundo es susceptible de sufrir ataques de fuerza bruta. Estos, con una buena política de contraseñas se podrían soslayar. Sin embargo, esto no deja de ser un problema, puesto que estos ataques representan tanto un consumo de ancho de banda, como un aumento de los archivos de registro (de acceso), y por supuesto consumen CPU. Todo esto se puede evitar baneando, estas direcciones IP.
Al trabajar directamente sobre los archivos de registro, evidentemente no solo controla quien entra, sino que también puede controlar quien sale. De esta manera, una salida incontrolada o no deseada, se puede bloquear de igual manera.
¿Que acciones puede realizar Fail2ban?
Ante un determinado problema de los que te he comentado anteriormente, Fail2ban, puede realizar diferentes acciones,
- Notificar por correo electrónico el suceso
- Denegar el acceso a la dirección IP
- Bloquear una dirección IP en un puerto determinado
- Transcurrido un tiempo determinado puede levantar un bloqueo
Las acciones que Fail2ban puede realizar son configurables mediante scripts implementados en Python.
Igualmente, los filtros que determinan las actividades sospechosas, son expresiones regulares, también en Python.
Protegiendo nuestros servicios
Ahora que ya sabes lo que es Fail2ban, y conoces su funcionamiento, veamos como proteger nuestros servicios. Vamos a ver varios servicios y que soluciones podemos adoptar para evitar intrusos. Ves con cuidado, puedes llegar a bloquearte tu acceso al servidor.
Instalar y configurar Fail2ban
Para instalar Fail2ban en un servidor Debian o derivado, solo tienes que ejecutar este comando,
sudo apt install fail2ban
Una vez instalado, vamos a configurarlo. Para ello haremos una copia del archivo /etc/fail2ban/jail.conf
en /etc/fail2ban/jail.local
. Y editamos este último archivo. En este archivo tenemos que modificar los siguientes parámetros,
ignoreip = 127.0.0.1/8
bantime = 600
findtime = 600
maxretry = 3
ignoreip
establece la dirección o rango de direcciones que serán ignoradas por fail2ban.bantime
este es el tiempo durante el que un usuario es baneado en el caso de que falle con al autentificación, en segundos.maxretry
establece el número de reintentos permitidos durante un período de tiempofindtime
en segundos.
Esta es la configuración general. Ahora es necesario aplicar configuraciones particulares para cada uno de los diferentes servicios que estemos utilizando, de forma que podamos bloquear accesos indeseables.
A partir de aquí tenemos que configurar cada uno de los servicios de forma particularizada. Bueno, realmente, mas que de los servicios, se trata de configurar los registros que queremos monitorizar.
Cada uno de los servicios está definido en una sección del archivo de configuración. Toman los valores definidos en la sección [DEFAULT]
como base. Si necesitamos podemos modificar cualquier parámetro para adaptarlo a nuestras necesidades. Eso lo haremos en la sección correspondiente. Si no existe la sección siempre podemos crear una que sea acomode a nuestras necesidades como veremos mas adelante.
Dentro de la configuración de cada una de las sección para los servicios, tenemos el filtro. El filtro es la parte de este automatismo que permite decidir si una línea del registro indica un fallo de autentificación. También tenemos el parámetro logpath
con el que indicaremos a fail2ban donde se encuentra el registro del servicio en particular.
Los filtros se encuentran en el directorio /etc/fail2ban/filter.d/
. Allí encontraremos filtros para muchos servicios. En la mayoría de los casos no es necesario añadir filtros adicionales.
Por defecto, el servicio SSH está configurado por defecto, mientras que el resto de servicios está deshabilitado.
Por otro lado, ten en cuenta que una vez hayas hecho las modificaciones que necesites en el archivo de configuración necesitarás reiniciar el servicio. Si no conoces systemctl
te recomiendo que le des un vistazo al artículo Gestionar servicios en Systemd. Este artículo forma parte de un tutorial completo sobre Systemd que te recomiendo encarecidamente.
De cualquier forma para conocer el estado del servicio, tan solo tienes que ejecutar la orden,
systemctl status fail2ban
Mientras que para reiniciar el servicio, la orden a ejecutar será,
sudo systemctl restart fail2ban
Sin embargo, ten cuidado con lo que haces. Es importante te asegures que las políticas que aplicas son las correctas. De otra forma te puedes encontrar que no puedes acceder a alguno de tus servicios. O lo que es peor, que directamente no puedes acceder a la máquina.
SSH
En este caso poco hay que hacer. Tan solo modificar el puerto en el caso de que estés utilizando uno distinto del 22
.
Apache
Para tener funcionando nuestra protección en Apache, tendremos que habilitarlo. Para ello, añadiremos el parámetro enabled = true
en la sección `
Nginx
En este caso tendremdecidiros que habilitarlo. Para ello, tenemos que añadir enabled = true
en la sección [nginx-http-auth]
.
WordPress
No exite un filtro predefinido para WordPress para bloquear accesos indeseables. Así que tienes que definirlo tu mismo. Para ello tienes que crear el archivo /etc/fail2ban/filter.d/wordpress.conf
y añadir el siguiente contenido,
failregex = <HOST>.*POST.*(wp-login\.php|xmlrpc\.php).* 200
Esta expresión regular busca en el archivo de registro por una POST
a wp-login.php
o xmlrpc.php
que devuelva un 200
. La razón es que una en el caso de que se produzca un registro positivo se hace una redirección, pero en otro caso devuelve un 200
.
Por otro lado, en el archivo /etc/fail2ban/jail.local
tendremos que añadir la siguiente sección, [apache-auth]
. Indicarte que hay mas configuraciones para el servidor Apache. Así que te recomiendo que le des un vistazo a la configuración de fail2ban, para que apliques las políticas que te resulten mas útiles y atractivas en tu caso.
[wordpress]
enabled = true
port = http,https
filter = wordpress
logpath = /var/log/nginx/access.log
Antes de nada comprobaremos que la sintaxis que hemos utilizado es la correcta para evitarnos problemas. Para ello, ejecutaremos la siguiente orden,
fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/wordpress.conf
Mumble
Mumble es otro de esos servicios que no tienen configuración por defecto en fail2ban, para bloquear accesos indeseables. Sin embargo, podemos crear nuestra propia configuración en un par de pasos, de forma sencilla.
El primer paso es crear el archivo /etc/fail2ban/filter.d/mumble-server.conf
con el siguiente contenido,
[Definition]
failregex = ^\<W\>.*Rejected connection from <HOST>:\d+: Invalid server password$
Igual que en el caso de WordPress, ahora también procederemos de la misma forma. Primero comprobaremos que la sintaxis que hemos utilizado es la correcta. Y como antes, ejecutaremos la siguiente orden,
fail2ban-regex /var/log/mumble-server/mumble-server.log /etc/fail2ban/filter.d/mumble-server.conf
El siguiente paso es añadir la siguiente sección en el archivo /etc/fail2ban/jail.local
,
[mumble-server]
enabled = true
port = 64738
filter = mumble-server
logpath = /var/log/mumble-server/mumble-server.log
maxretry = 2
MariaDB y MySQL
En este caso, para evitar accesos indeseables, existe una configuración por defecto para fail2ban, con lo que solo tienes que añadir el parámetro enabled=true
en la sección [mysqld-auth]
El cliente de fail2ban
Fail2ban tiene un interesante cliente que nos permitirá configurar su comportamiento. Este nos permite realizar diferentes operaciones como las que vemos a continuación,
start
inicia el servicioreload
recarga la configuraciónreload <JAIL>
recarga la configuración para un serviciostop
detiene el serviciostatus
nos muestra el estado del servicioping
informa de si fail2ban está activo
Conclusión
Como ves el potencial de fail2ban, para bloquear accesos indeseables, es simplemente abrumador. Sin embargo, tal y como te he comentado a lo largo del presente artículo, te recomiendo encarecidamente que tengas mucho cuidado. Una configuración incorrecta te puede llevar a no poder utilizar un servicio o incluso a no poder acceder a la máquina.
Lo suyo es tener una configuración testeada, y esas políticas aplicarlas a todas tus máquinas. Pero bueno, como siempre, lo mejor es tocar y romper para aprender.
Más información,