Como bloquear masivamente IPs atacantes en Ubuntu con UFW

Partimos de una situación ideal en la que:

  • Tenemos un servidor Ubuntu 16.04 con servicios activos publicados en Apache
  • El SO y los paquetes están actualizados
  • Tenemos instalado y configurado el firewall con UFW (Uncomplicated FireWall)
  • Tenemos un sistema de detección de intrusiones que bloquea direcciones IP por N horas tras varios intentos fallidos con Fail2Ban
  • Tenemos instalado el módulo de Apache MOD_EVASIVE para evitar ataques de denegación en caso de que a la competencia no le guste nuestro servicio y decida contratar a alguien en la DeepWeb (protegidos en teoria, sin invertir en infraestructura al uso no me lo creo)
  • Tenemos instalado y configurado el módulo de Apache MOD_SECURITY para detectar ataques a nuestro servicio Web buscando si tenemos algún phpMayAdmin desactualizado (eso en otro post)

Aun así…

Alguna vez al día te conectas y ves todos los intentos de acceso. Correctamente bloqueados y desbloqueados por fail2ban. Además la mayoría vienen de paises donde sabes que nunca vas a tener nada mas que disgustos.

No hay nada que temer, pero allí están. Como una gota malaya:

Extracto de /var/log/auth.log

Y compruebas que fail2ban hace su trabajo desmotivando al respectivo bot:

Además desde que el CM empezó a dar publicidad a los servicios y la App publicada en Google Play atacar a tu backend pasas de tener 80 intentos al dia a tener 800.

Cómo extraer IPs atacantes

Cuando el volumen es bajo apuntaba en un bloc de notas las IPs atacantes y las estudiaba con calma. Cuando el volumen aumenta es mejor hacer un script que extraiga los intentos de acceso desde auth.log. Aquí un script en bash para extraer:

  1. Los intentos de acceso al usuario root. Por buenas prácticas damos por hecho que este usuario no lo utiliza nadie, sino solo se accede al sistema con usuarios dotados de sudo.
  2. Los intentos de acceso a usuarios inexistentes.
#!/bin/bash

# Declaramos el fichero
FILE=/tmp/banned-ips.sh

# Crear fichero de baneo de IPs
echo '#/bin/bash' > $FILE

# Dar permisos de ejecución
chmod 0755 $FILE

# Usuarios que han intentado root
cat /var/log/auth.log | grep "Failed password" | grep -v "repeated" | grep "root" | cut --delimiter=" " -f11 >> $FILE

# Usuarios que han intentado otro tipo de usuario
cat /var/log/auth.log | grep "Failed password" | grep -v "repeated" | | grep "invalid" | cut --delimiter=" " -f13 >> $FILE

# Ordenar el fichero teniendo en cuenta que son direcciones IP
sort -n -t . -k 1,1 -k 2,2 -k 3,3 -k 4,4 -u -o $FILE $FILE

Al ejecutarlo tendremos en /tmp/banned-ips.root una lista de las IPs que nos han intentado atacar en el último día o el inicio del fichero de log /var/log/auth.log.

Si nos apetece, podemos averiguar los países de origen con la utilidad iplocation.net

Lo que acostumbramos a hacer es es a localizar las IPs que vienen desde España para avisar al ISP correspondiente del ataque. En el caso de Telefónica hay que enviar un correo con los logs y la información a nemesys@telefonica.es. Para otras operadores es sencillo de encontrar googleando “abuse address OPERADOR”.

Algunos opinan que es tan poco útil como denunciar el robo de una bicicleta, pero a lo mejor le llega un escarmiento en forma de amable llamada a un script-kiddie o conseguimos que avisen a alguna persona infectada de que su PC forma parte del botnet de algún hacker ruso.

Crear lista de baneo

En nuestro caso utilizamos UFW, y la instrucción para añadir una IP su subred a la lista negra de nuestro firewall es:

sudo ufw deny from 2.139.199.51/24

Estamos de acuerdo de que con esto no solo estamos bloqueando a nuestros servicios a una IP sospechosa sino a 254 direcciones más, pero debemos estimar la probabilidad de bloquear a un usuario de nuestros servicios vs bloquear otro ataque de las misma subred.

Para añadir la regla a todas las IPs del fichero que tenemos, añadimos estas líneas a nuestro script:

# Añadir regla para UFW para
sed -i -e '2,$ s/^/ufw deny from /' $FILE

# Añadir subred a cada dirección IP
sed -e '2,$ s/$/\/24/' -i $FILE

De esta manera el contenido del fichero /tmp/banned-ips.sh es este, y podemos ejecutarlo para dejar a todos los subrangos baneados de nuestro sistema:

#/bin/bash
ufw deny 2.139.199.51/24
ufw deny 5.88.13.189/24
ufw deny 5.196.52.173/24
ufw deny 27.73.59.219/24
ufw deny 31.6.103.87/24
ufw deny 31.185.144.5/24
ufw deny 51.75.207.61/24
ufw deny 54.37.44.75/24
ufw deny 58.64.144.109/24
ufw deny 58.242.82.13/24
ufw deny 67.205.167.142/24

Ya podemos ejecutar el script y dejarle crear las reglas:

dani@h2745570:~/blaumark-deploy$ sudo /scripts/block-from-auth.sh
dani@h2745570:~/blaumark-deploy$ sudo /tmp/banned-ips.sh
WARN: Rule changed after normalization
Rule added
WARN: Rule changed after normalization
Rule added
WARN: Rule changed after normalization
Rule added
WARN: Rule changed after normalization
Rule added
Rule added
WARN: Rule changed after normalization
Skipping adding existing rule
WARN: Rule changed after normalization

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.