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 fail2banEsto 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.localUna vez copiado, podemos abrirlo y ver cómo funciona.
vim /etc/fail2ban/jail.localDentro 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.1Añadimos nuestro localhost de esta forma ignorara todo tráfico local, podemos añadir direcciones adicionales separándolas por un espacio.
bantime = 600El 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 = 3Luego 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 = sendmailSi 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_)sAca 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 = truePor 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.logAhora 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 nginxinstalaremos un servicio de correo para las notificaciones puede ser sendmail
apt-get install sendmailpor ú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-persistentEstará 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 DROPPodemos ver los cambios con:
iptables -SDeberí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.localPodemos extender el tiempo en que un usuario queda baneado por al menos 30 minutos, recuerden colocar el valor en segundos.
bantime=1800Debemos 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.comPodemos 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)sLuego iremos a la seccion [SSH] y podemos editar el número máximo de intentos antes del ban lo dejaremos en 5:
maxretry = 5Si tenemos el servicio de SSH en un puerto diferente al 22 lo cual es muy recomendable debemos mencionar su puerto.
port = 45024Luego buscaremos la etiqueta [nginx-http-auth], la dejaremos tal cual.
[nginx-http-auth] enabled = trueHemos 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 stopLuego podemos iniciarlos nuevamente
service fail2ban startEsto 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 RETURNVemos como fail2ban ha añadido nuevas políticas puede variar dependiendo la configuración que hayas definido en /etc/fail2ban/jail.local.
Para no votarte 5 estrellas. Muy bueno. Fail2ban con SSH, para el control remoto está muy bien y es seguro.