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:
Aquí vemos el mensaje “Pledge Network” al acceder en modo debug ssh al servidor al que no podemos conectar por ssh:
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.
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.
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:
lastb -a | more
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.
–> En Debian/Ubuntu:
apt-get install fail2ban
–> En CentOS:
yum install epel-release
yum install fail2ban fail2ban-systemd
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.
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:
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:
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.
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
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.
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
Ya tenemos configurado fail2ban, ahora reiniciamos el servicio:
sudo service fail2ban restart
o
systemctl restart fail2ban.service
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.
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
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.
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-
iptables -A fail2ban- -j RETURN
iptables -I -p -m multiport --dports -j fail2ban-
Pondremos:
cat /etc/fail2ban/persistent.bans | awk '/^fail2ban-/ {print $2}' \
| while read IP; do iptables -I fail2ban- 1 -s $IP -j ; done
y al final,
debajo de “actionban“:
actionban = iptables -I fail2ban- 1 -s -j
pondremos:
echo "fail2ban- " >> /etc/fail2ban/persistent.bans
O sea que tenemos que dejar el fichero » /etc/fail2ban/action.d/iptables-multiport.conf » así:
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):
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: