domingo, 7 de junio de 2020

Protege tu Servidor con Fail2ban

¿Que es Fail2ban?

Es una herramienta escrita en Python que sirve para securizar un servidor monitoreando logs y bloqueando conexiones de intrusos en base a ciertos patrones predefinidos. Es decir, cuando por ejemplo detecta que en un log hay cierta cantidad de intentos fallidos de conexión, en base a la configuración que hayamos definido bloquea la IP del intruso a través de iptables para impedir que el mismo siga intentando conectarse. Este bloqueo/baneo de la IP puede ser permanente o temporal, dependiendo de como lo hayamos definido nosotros.

La ubicación que contiene la totalidad de filtros de fail2ban es /etc/fail2ban/filter.d:

Entre sus filtros mas destacables se encuentran:

sshd.conf: Para los intentos fallidos a SSH.
proftp.conf: Para los intentos fallidos hacia el FTP ProFTP del cual hice un post de instalación y configuración.
exim.conf: Para detectar autenticaciones al servidor de correo Exim.
squid.conf: Para los intentos de omitir este famoso proxy del cual tambien hice un post aca y aca.


Los filtros contienen principalmente expresiones regulares que se utilizan para detectar intentos de intrusión, fallas de contraseña, etc.
Una vez definida una expresión regular se irá comprobando que la misma no aparezca en ninguno de los logs que Fail2ban esta monitoreando. En el caso que la expresión regular aparezca en los logs se contabilizará un intento fallido de autenticación, el mismo se ira incrementando hasta llegar al numero que configuramos, una vez que llegue tomará una acción, que generalmente sera bloquear la IP.
Si vamos a usar los servicios estándares predeterminados (que son los que vemos mas arriba) no será necesario modificar ni crear ningún filtro, podemos utilizar los que vienen por defecto.

En cuanto a las acciones, las mismas se encuentran en la ruta /etc/fail2ban/action.d. Allí una serie de scripts definen las acciones a realizar al detectar los ataques definidos en las expresiones regulares de los filtros.
Como con los filtros, estas acciones que ya nos trae por defecto deberían ser suficientes, pero esta la posibilidad de crear acciones nuevas.

Archivo jail.conf:

jail.conf es el archivo de configuración más importante. En este archivo es donde indicamos que servicios debe proteger Fail2ban (por defecto vienen todos, o casi, activados), entre otras cosas podemos:

- Definir que servicios queremos que monitoree Fail2ban.
- Que filtro y acción aplicar.
- Definir el puerto del servicio, para casos como por ejemplo ssh donde se suele cambiar el puerto 22 que viene por defecto.
- Elegir que log del servicio vamos a monitorear.
- Definir la cantidad de intentos fallidos y el tiempo de bloqueo.

Algunos parámetros:

Sección [DEFAULT]
ignoreip: Acá van las IPs que no queres que se bloqueen, generalmente va la red o subredes internas.
maxretry: Número de intentos antes de banear la IP.
findtime: Definimos en cuanto tiempo el contador de intentos fallidos se va a resetear.
bantime: Duración (en segundos) para la prohibición de la IP. Usar número negativo para la prohibición "permanente".
ignorecommand: Acá podemos definir un comando que sera exceptuado cuando una determinada IP intente conectarse a nuestro servidor.
logtarget: Es para indicar en que ubicación se van a almacenar los logs de Fail2ban, por defecto  /var/log/fail2ban.log

En [ACTION]:
Podemos definir la dirección del mail a la que queremos que lleguen los avisos de bloqueo:
destemail = root@localhost

En [JAILS]:

enable: Activamos o desactivamos el monitoreo del servicio con true o false.
port: Definimos el puerto del servicio.
filter: Nombre del filtro que utilizará la "cárcel" para detectar coincidencias.
logpath: Definimos que log tiene que monitorear.

A modo de ejemplo:

[DEFAULT]
ignoreip = 127.0.0.1 (Ignora la propia ip)
bantime = 600 
findtime = 600
maxretry = 3
backend = auto

[sshd]
enabled = true
port = ssh
filter = sshd
logpath = %(sshd_log)s
#logpath = /var/log/secure
#logpath = /var/log/auth.log
maxretry = 3

Si modificamos parámetros para que los mismos se hagan efectivos tenemos que reiniciar el servicio de Fail2ban:

sudo service fail2ban restart

Ahora vamos a lo importante:

Instalar Fail2ban:

sudo apt-get install fail2ban


Hacer backup del archivo de configuración:

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.orig


Ver reglas de iptables cargadas:

sudo iptables -L -n

Como mencionamos mas arriba, Fail2ban no se limita a SSH. Contiene filtros acciones predeterminados para muchos demonios servicios. Se pueden modificar o crear otros nuevos. En este caso como la idea es mostrar el de SSH vamos a probar loguearnos fallidamente a la IP de nuestro servidor con Fail2ban para ver si nos banea:

Intentos fallidos hasta el bloqueo
Vemos que ya no nos deja seguir intentando, se queda ahí. Esto es porque tengo configurado 5 intentos fallidos. Si reviso el log de Fail2ban se ve con mas claridad:

sudo cat /var/log/fail2ban.log | more



Verificamos en iptables si nos baneó la IP y vemos que si:

sudo iptables -L -n


Remover la IP baneada:

 sudo iptables -D f2b-sshd -s 192.168.2.111 -j REJECT


Para desbanear una IP desde Fail2ban:

sudo fail2ban-client set sshd unbanip 192.168.2.111

Podemos ver las reglas de iptables indicando los números de linea:

sudo iptables -L -n --line-numbers

Para eliminar la linea 1 ejecutamos:

sudo iptables -D f2b-sshd 1



Para exceptuar nuestra red interna en iptables ejecutamos:

sudo iptables -I INPUT 1 -i eth1 -s 192.168.2.0/24 -m state --state NEW,ESTABLISHED -j ACCEPT


Si queremos ver en vivo y en directo el log de los intentos fallidos podemos ejecutar:

sudo tail -f /var/log/auth.log


Por último, tengamos en cuenta que Fail2ban es un analizador de registros, con lo cual no puede hacer nada antes de que algo se escriba en los archivos de logs. Esta aclaración es porque hay algunos demonios syslog que almacenan sus salidas en un búffer. Esto puede afectar a Fail2ban. Por lo tanto, hay que considerar deshabilitar el almacenamiento en búffer si es el caso del servicio que vamos a monitorear.

Esto ha sido todo!

COMPARTI!

See you!

No hay comentarios:

Publicar un comentario