Cargando



Instalar Fail2ban y asociarlo con SSH y Nginx

Hablaremos de fail2ban sus archivos de configuracion y como asociarlo para que bloquee usuarios por medio de un firewall y hasta que envie un correo de alerta por cada usuario baneado.


sep 24 2015 19:35
Profesional
Total de Apartados : 7
nov 04 2016 19:58

failban.jpg

 

Cuando hemos montado un servidor con Linux y queremos manejarlo desde internet mediante control remoto SSH puede pasar que comencemos a recibir ataques con el objetivo de entrar al sistema y poder controlarlo para sus fines. Estos ataques suelen ser realizado por programas informáticos (bots) que durante mucho tiempo intentan acceder al sistema mediante la fuerza bruta.

 

En entradas anteriores he hablado de cómo configurar el servicio SSH pero algunos bots avanzados no entran al servicio pero pueden llegar a tumbar el servicio SSH en el servidor inhabilitando el acceso remoto.

 

 

Podemos evitarlo usando la herramienta fail2ban, es muy práctica y ofrece un gran margen de seguridad. Para explicar un poco su funcionamiento. Es capaz de crear iptables ante cualquier intento de login fallido por más de 5 veces seguidas rechazando cualquier tipo de conexión una vez esté baneado.

 


Instalar Fail2ban


La instalación la podemos realizar desde apt directamente. Primero actualizamos el sistema y luego instalamos Fail2ban.
apt-get update && apt-get -y upgrade
apt-get install fail2ban
Esto no sólo instala el programa también lo deja ejecutando e iniciando con el sistema.

 


Configurando Fail2ban


El servicio de Fail2ban tiene sus configuraciones en el directorio /etc/fail2ban. Tienes algunas opciones preconfiguradas en jail.conf, lo mejor en este caso es copiar el archivo y no hacer las modificaciones directamente en el, al momento de actualizar fail2ban se sobrescriben estos archivos y puedes perder todos los cambios hechos anteriormente.

 

En este caso copiamos el archivo y le colocamos el nombre jail.local para que pueda encontrarlo.

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Una vez copiado, podemos abrirlo y ver cómo funciona.
vim /etc/fail2ban/jail.local
Dentro del archivo, tenemos varios parámetros que podemos ajustar. Todo parámetro que esté bajo la etiqueta [DEFAULT] será aplicado a todos los servicios habilitados por Fail2ban como por ejemplo SSH, NGINX, APACHE, esto lo llamaremos global,luego tendremos secciones específicas para cada servicio.

 

Empezaremos añadiendo parámetros a la sección global.

ignoreip = 127.0.0.1
Añadimos nuestro localhost de esta forma ignorara todo tráfico local, podemos añadir direcciones adicionales separándolas por un espacio.
bantime = 600
El bantime es el lapso de tiempo que estará baneado el cliente luego de ser bloqueado. La unidad es en segundo 600 segundos serían 10 minutos es el valor por defecto.
findtime = 600
maxretry = 3
Luego tenemos findtime y maxretry. Se encargan de establecer las condiciones para que un cliente sea baneado por defecto se puede leer que cualquier usuario con más de 3 intentos fallidos en menos de 10 minutos quedará baneado.
destemail = root@localhost
sendername = Fail2Ban
mta = sendmail
Si queremos crear alertas por los usuarios baneados estos 3 parámetros son necesarios, definiremos el destino a quien enviar el correo de alerta, quien se encargará de enviarlo, y por último el mta para definir qué servicio de correo usaremos.
action = $(action_)s
Aca definiremos qué acción tomar cuando se requiera de un baneo. El valor action_ está la accion por defecto se basa en rechazar cualquier tráfico del cliente hasta que el tiempo de baneo concluya.

 

Si queremos enviar una alerta por correo debemos de cambiar el valor a action_mw, pero si además queremos que adjunte líneas del log en el cuerpo del correo usaremos action_mwl. Debemos de estar seguro que las configuraciones del correo está correcta antes de cambiar este valor.

 


Configuraciones por Servicio


Una vez concluidas las configuraciones globales añadiremos los parámetros que serán aplicados de manera excluyente al

 

Servicio SSH, nos cercioramos de añadir las opciones bajo la etiqueta [SSH].

enabled = true
Por defecto el servicio SSH viene habilitado, pero podemos modificarlo de ser necesario en esta opción.

 

Toda esta sección podría funcionar con los valores que detallaré más adelante pero pueden modificar para adaptarlo a sus necesidades o dejarlos todos por defecto.

 

Otra de las configuraciones son los filtros que indican si el login fue correcto o no y puede añadirse para otros servicios por ejemplo tenemos un servidor con nginx y una porción de la página está protegida con contraseña, pero un cliente está atacando con fuerza bruta, podemos detener esto añadiendo lo siguiente bajo la etiqueta [nginx-http-auth].

[nginx-http-auth]
enabled = true
filter  = nginx-http-auth
port    = http,https
logpath = /var/log/nginx/error.log
Ahora si un usuario tiene más de 3 intentos fallidos de login se refleja en los logs y fail2ban actuará y bloqueará todo el tráfico del usuario.

 


Ambiente de Prueba


Luego de haber entendido lo básico haremos un pequeño ambiente de pruebas donde protegeremos SSH y Nginx por medio de Fail2ban creando una política de baneo que nos notificara la ip que ha sido baneada.

 

Primero instalaremos Nginx en caso de no estar instalado

apt-get install nginx
instalaremos un servicio de correo para las notificaciones puede ser sendmail
apt-get install sendmail
por últimos queremos que nuestras iptable sean persistentes luego de un boot podemos o crear un script rc.0 o instalar el paquete iptables-persistent.
apt-get install iptables-persistent
Estará instalado.

 


Estableciendo nuestro Firewall


Después de instalar lo anterior, debemos implementar un cortafuegos para que pueda bloquear el tráfico. Crearé un cortafuegos básico en entradas posteriores hablaré más a fondo de las iptables.

 

Permitiremos conexiones establecidas, tráfico del servidor como actualizaciones, y el tráfico destinados a los puertos de SSH y Nginx. Todo el tráfico restante será denegado.

sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -j DROP
Podemos ver los cambios con:
iptables -S
Debería de arrojar resultado similar.
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N fail2ban-ssh
-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -j DROP
-A fail2ban-ssh -j RETURN

Ajustando la Configuración de Fail2ban


Ahora deberemos configurar el archivo jail.local a nuestra conveniencia.
vi /etc/fail2ban/jail.local
Podemos extender el tiempo en que un usuario queda baneado por al menos 30 minutos, recuerden colocar el valor en segundos.
bantime=1800
Debemos configurar un correo que reciba todas las alertas de baneo de fail2ban, busquemos el valor destemail en el archivo y coloquemos el correo.
destemail = admin@solvetic.com
Podemos cambiar el remitente que enviará la alerta acostumbro a colocar con el nombre fail2ban para podemos filtrar mejor entre todos los logs.

 

Después debemos cambiar el valor de action tenemos 2 opciones:

  • action_mw: envía una alerta con un reporte similar al comando whois del cliente baneado.
  • action_mwl: envía una alerta mucho más detallada incluyendo un log en el cuerpo del mensaje.

 

En este usaremos la segunda opción:

action = %(action_mwl)s
Luego iremos a la seccion [SSH] y podemos editar el número máximo de intentos antes del ban lo dejaremos en 5:
maxretry = 5
Si tenemos el servicio de SSH en un puerto diferente al 22 lo cual es muy recomendable debemos mencionar su puerto.
port = 45024
Luego buscaremos la etiqueta [nginx-http-auth], la dejaremos tal cual.
[nginx-http-auth]
enabled = true
Hemos terminado y podemos guardar y cerrar el archivo.

 


Reiniciando el servicio Fail2ban


Para que todos los cambios sean aplicados recomiendo detener el servicio.
service fail2ban stop
Luego podemos iniciarlos nuevamente
service fail2ban start
Esto tardara un poco, después de unos 5 minutos podemos ver nuestras reglas nuevamente con
iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N fail2ban-nginx-http-auth
-N fail2ban-ssh
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-http-auth
-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -j DROP
-A fail2ban-nginx-http-auth -j RETURN
-A fail2ban-ssh -j RETURN
Vemos como fail2ban ha añadido nuevas políticas puede variar dependiendo la configuración que hayas definido en /etc/fail2ban/jail.local.

 

Conclusiones
Hemos instalado fail2ban y configurado para funcionar con SSH y NGINX en caso de APACHE debemos de cambiar las etiquetas y el directorio de los logs pero es muy similar a nginx. Solo hemos configurado lo básico puedes puedes crear filtros y reglas muchos más avanzadas recomiendo leer un poco su man page, los archivos de configuración están bien comentados recomiendo ir poco a poco para ir descubriendo todas sus funciones.


¿Te ayudó este Tutorial?


4 Comentarios


Teo Robles
sep 25 2015 23:50

Para no votarte 5 estrellas. Muy bueno. Fail2ban con SSH, para el control remoto está muy bien y es seguro.

Me ha servido mucho. thx!


Carlos Sanz
sep 28 2015 22:08

Me conecto solo para darte las gracias.


Juan Carlos
sep 29 2015 13:45

Yo estoy con el lio de montar Fail2ban. Me ha venido de ayuda Jonathan. gracias.

No esperes más y entra en Solvetic
Deja tus comentarios y aprovecha las ventajas de la cuenta de usuario ¡Únete!

Hola! Si no encuentras algún tutorial en el buscador de Solvetic, Solicítalo Aquí

X