Bloquear ataques SSH con Fail2ban e Iptables

Vamos a ver cómo protegernos y bloquear ataques de fuerza bruta por SSH en Linux, usando fail2ban e Iptables.

 

En ocasiones nos encontraremos con infinidad de accesos por ssh desde multitud de IP´s desconocidas que se encargan de intentar acceder a nuestros sistemas, normalmente con los usuarios por defecto conocidos para SSH; habitualmente en este tipo de ataques de fuerza bruta por ssh se usa mucho el usuario “root“, “admin“, “oracle“, y en el caso de la Raspberry Pi se usa el usuario “pi“.
 


Estos ataques pueden tener consecuencias como las de un ataque DDoS (ataque de denegación de servicio / Denial of Service), provocando que ciertos servicios dejen de funcionar por saturación, además de que se tratan de intentos de acceso no autorizados y debemos hacer algo por pararlos…
 

En este artículo:

 

 

 

 

¿Cómo podemos darnos cuenta de que estamos siendo el objetivo de un ataque SSH?

 

 

Aquí vemos el mensaje “Pledge Network” al acceder en modo debug ssh al servidor al que no podemos conectar por ssh:

ssh pledge network
 

Esta info la sacamos de la conexión ssh, usando el modo debug, ya que en un principio, la conexion ssh iniciaba e intentaba terminar, pero ahí se queda la terminal, sin acabar de acceder ..

solo cuando conectamos por ssh usando el modo de depuración, podremos ver el mensaje anterior.

 

  • Por casualidad, o como consecuencia de lo anterior, revisas el fichero “/var/log/auth.log” o “/var/log/secure” en el caso de CentOS y RedHat y compruebas una cantidad enorme de accesos que han fallado la password, y además de IP´s desconocidas .. el  mensaje en estos casos es:
    Failed password for root from ----------(IP)  port 52410 ssh2

 

Entonces es cuando nos vamos a revisar el fichero de registro “/var/log/auth.log” y es donde vemos intentos de acceso por ssh denegados dónde podemos comprobar que utilizan por defecto el usuario root se trata del típico archivo el típico ataque por fuerza bruta y que a la vez consiste o puede conllevar pues lo mismo que un ataque de denegación de servicio ya que por tantas solicitudes de acceso repetidas el servidor acaba saturandose.
 

registro de accesos ssh - /fichero auth.log
 

 

¿Cómo bloquear ataques ssh?

 

Lo dicho, entonces estábamos revisando los accesos en el fichero “/var/log/auth.log” y nos damos cuenta de que estamos siendo víctimas de un ataque de fuerza bruta por SSH, así que la solución es instalar fail2ban que se encargará de banear los accesos desde las IP´s que no paran de intentarlo a nuestro servidor (como se trata de botnets, tendremos cientos, miles de accesos a cada minuto).

 

El Comando “last, nos muestra los ultimos accesos, por ssh. Vemos los usuarios utilizados por estos ataques y la IP desde la que se intenta acceder:

comando last - ultimos accesos
 

 

 
lastb -a | more
 

¿Qué es fail2ban?

 
fail2ban es un software de Linux que permite bloquear ataques e intentos de acceso a diversos puertos y servicios conocidos; se puede modificar y adecuar para casos de puertos y servicios concretos. Uno de los mayores usos de fail2ban es en el bloqueo de ataques por SSH.
 

 

Fail2ban SSH | Instalar y configurar fail2ban para proteger SSH

 

  • Instalamos fail2ban:

–> En Debian/Ubuntu:

apt-get install fail2ban

 

–> En CentOS:

yum install epel-release
yum install fail2ban fail2ban-systemd

 

 

Copia del archivo de configuración original |  jail.conf –> jail.local

 

  • Ahora vamos a configurar fail2ban para activar una “jaula” de protección para el servicio SSH:

Lo primero, la configuración inicial de fail2ban se encuentra en el fichero /etc/fail2ban/jail.conf

Hemos de hacer una copia del fichero y la llamaremos jail.local:

cp -p /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

 

El fichero de configuración que usaremos será jail.local.
 

 

Habilitar la jaula para proteger SSH en fail2ban / definir el filtro

 

Comenzamos a configurar la jaula para ssh en fail2ban. Comenzamos a editar el fichero /etc/fail2ban/jail.local y encontramos estas líneas acerca de SSH:

#
# SSH servers
#
 
[sshd]
 
port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s

 

Por ahora la jaula para SSH no está funcionando. Hemos de modificar la directiva y añadir estas líneas:

enabled = true
filter = sshd

 

De esta forma hemos habilitado la jaula ssh, y creado el filtro sshd, que le dice a fail2ban que ha de usar el fichero “/etc/fail2ban/filter.d/sshd.conf” para filtrar las conexiones al puerto ssh.
 
Vemos que este fichero contempla varios tipos de mensajes sospechosos que podemos encontrar cuando ssh está siendo comprometido:

/fail2ban/filter.d

 

También podemos ver que en el directorio “/etc/fail2ban/filter.d/” podemos encontrar una gran multitud de filtros que nos servirán para proteger otros servicios:

filtros fail2ban
 

 

Definir la acción “banaction

 

Hemos de definir la acción que fail2ban realizará cuando se active para protegernos de una conexión SSH.

La acción que definiremos será:

iptables-multiport
 

La añadimos a la directiva así:

banaction = iptables-multiport

Al igual que con los filtros, en el directorio  /etc/fail2ban/action.d/ podemos encontrar muchas otras acciones que podemos configurar en fail2ban.
 

 

Definir el número de intentos y el tiempo de baneo

 

Por defecto nos encontraremos algo así:

bantime = 3600
maxretry = 5

 

Pero vamos a ir un poco más allá y vamos  a ser más restrictivos.

En lugar de permitir 5 intentos, permitiremos solamente 3 intentos.

Y en lugar de banear durante 3600 segundos, crearemos un baneo permanente:

maxretry = 3
bantime = -1

 

 

Resumen: Configuración de la jaula de baneo para SSH

 
En resumen, tras estas explicacciones, nuestra jaula para SSH debe quedar así:

[sshd]
enabled = true
port = ssh,44624
banaction = iptables-multiport
filter = sshd
logpath = %(sshd_log)s
backend = %(sshd_backend)s
maxretry = 3
bantime = -1

 
Importante: podemos ver que en la línea

port = ssh,44624

además de “port=ssh“, separado por una coma está el puerto que usamos para ssh.
Si cambiamos el puerto por defecto para nuestro servicio SSH (algo más que recomendable por cierto), hemos de configurarlo aquí, para que fail2ban actúe en los accesos a dicho puerto.

 

 

*EXCLUSIONES en fail2ban*

 

Muy importante que configuremos las exclusiones en fail2ban, para no bloquearnos a nosotros mismos.

lo haremos buscando la directiva “ignoreip“. Por defecto encontraremos localhost, pero también podemos añadir subredes enteras, o direcciones IP concretas. Separamos los valores con espacio o con una coma:

ignoreip = 127.0.0.1/8 192.168.0.0/24

 

 

Reiniciar el servicio

 
Ya tenemos configurado fail2ban, ahora reiniciamos el servicio:

sudo service fail2ban restart

o

systemctl restart fail2ban.service

 

 

IPTABLES

 

Iptables actúa como firewall, ya que se encarga de crear reglas de filtrado de paquetes.

Después de instalar fail2ban nos aseguramos de tener instalado y activado Iptables.
Instalamos IPTABLES :

–> en Debian/Ubuntu:

sudo apt install iptables

 

–> En CentOS:

yum install iptables-services

 

Lo bueno de la unión de fail2ban e iptables es que trabajarán juntos. Cuando fail2ban banee accesos por ssh, creará reglas en iptables que nos protegerán de esos accesos.
 

 

Comprobando que iptables está funcionando

 
Bueno, después de todo esto, hemos activado fail2ban e iptables,

y vamos a ver qué reglas está habilitando Iptables, según los accesos incorrectos que está detectando.
 
Listamos las reglas creadas por iptables:

iptables -L

iptables direcciones bloqueadas

 

Como podemos ver, en un momento se nos ha llenado la lista con un montón de reglas para rechazar el acceso desde ciertas IP´s, que están intentando compulsivamente hacer login ssh.
 

 

Extra: Configurar baneos permanentes de fail2ban con iptables

 

En este caso, como sabemos que somos el objetivo de un ataque ssh de fuerza bruta, vamos a configurar un bloqueo permanente de todas las IP´s atacantes con fail2ban, porque sino, a cada reinicio del servidor, perderemos las reglas de bloqueo creadas anteriormente. Lo que vamos a hacer es que se cree un fichero de baneos permanentes que llamaremos “persistent.bans”, y con cada baneo que fail2ban cree, se añadirá ahí la ip de forma permanente.
 

Lo lograremos añadiendo lo siguiente en el fichero de acciones de fail2ban:

en el fichero “/etc/fail2ban/action.d/iptables-multiport.conf”

debajo de

actionstart = iptables -N fail2ban-<name>
              iptables -A fail2ban-<name> -j RETURN
              iptables -I <chain> -p <protocol> -m multiport --dports <port> -j fail2ban-<name>

 

Pondremos:

 cat /etc/fail2ban/persistent.bans | awk '/^fail2ban-<name>/ {print $2}' \
          | while read IP; do iptables -I fail2ban-<name> 1 -s $IP -j <blocktype>; done

 

y al final,

debajo de “actionban“:

actionban = iptables -I fail2ban-<name> 1 -s <ip> -j <blocktype>

 

pondremos:

        echo "fail2ban-<name> <ip>" >> /etc/fail2ban/persistent.bans

 

O sea que tenemos que dejar el fichero » /etc/fail2ban/action.d/iptables-multiport.conf » así:

fail2ban iptables baneo permanente

Y reiniciamos el servicio fail2ban.

 

Ahora podemos revisar el fichero de baneos permanentes /etc/fail2ban/persistent.bans :
y veremos la cantidad de IP´s que se están añadiendo en dicho fichero (claramente no es casualidad, sino que estamos siendo objeto de un ataque ssh):

fail2ban baneos permanentes

 

 

Recuerda securizar SSH (Hardening SSH)

 

Otro aspecto bastante importante es el de securizar nuestro servidor SSH (Hardening SSH). Digamos que es el paso previo , y las configuraciones más básicas, que deberíamos revisar, son:

  • Cambiar el puerto por defecto
  • Cambiar el nombre del usuario por defecto del sistema
  • No permitir el acceso ssh al usuario root
  • Permitir el acceso ssh solo por clave pública