Capítulo 1: Fail2ban y el primer café con mi vecina

La primera mañana en el piso, con la vecina durmiendo a pierna suelta en mi lado de la cama (el izquierdo, más cerca del router), yo ya estaba sentado frente al portátil con un Chateau Garrulón 2009 rc1 en la taza del café. Un vino tinto con retronasal a lúpulo digital, delicioso a las ocho menos cuarto de la mañana. La pantalla, en cambio, era menos delicada:

# journalctl -u ssh --since "-12h" | grep "Failed password" | wc -l
47238

Cuarenta y siete mil doscientos treinta y ocho intentos de brute-force contra mi ssh en media noche. Alguien estaba muy enamorado de mi puerto 22. Me dolía el estómago y no era el vino.

  • ¿Pasa algo? – me preguntó la vecina desde la cama, con el pelo estilo kernel panic.
  • Nada, cosas del mantenimiento – dije, y a las tres palabras ya estaba con el apt abierto. Porque GNU/Linux, para ser más exactos, no se mantiene solo. Bueno, casi.
# apt-get update && apt-get install fail2ban -y

Fail2ban es, para entendernos, el portero de discoteca de tu servidor: un script que lee los logs, ve quién está dando guerra en la cola y, sin preguntar, le parte la cara con iptables. Poético.

Edité la jail:

# nano /etc/fail2ban/jail.local

[sshd]
enabled   = true
port      = ssh
filter    = sshd
logpath   = /var/log/auth.log
maxretry  = 3
findtime  = 10m
bantime   = 24h

Y ya de paso, porque uno no vive en un solo capítulo, capé lo obvio en sshd_config:

# nano /etc/ssh/sshd_config

PermitRootLogin        no
PasswordAuthentication no
MaxAuthTries           3
LoginGraceTime         20

# systemctl restart ssh fail2ban

Con autenticación por clave pública, el 99% de los scriptkiddies se van a molestar al vecino. Los miré en vivo:

# fail2ban-client status sshd
Status for the jail: sshd
|- Filter
|  |- Currently failed: 2
|  |- Total failed:     47240
|  `- File list:        /var/log/auth.log
`- Actions
   |- Currently banned: 14
   |- Total banned:     14
   `- Banned IP list:   185.220.x.x 193.29.x.x ...

Catorce IPs cayendo en cuatro minutos. Las copié y tiré un whois rápido: tres eran de nodos Tor públicos (lo cual era sospechosamente cutre) pero la mayoría apuntaban al mismo AS en Letonia. Peor todavía: cada vez que yo baneaba una IP, otra nueva del mismo rango aparecía en cuestión de segundos. Alguien estaba escuchando mis bans. Alguien sabía cuándo caía el martillo.

  • Oye, ¿hay café o solo vino? – Bostezó la vecina asomándose al salón.
  • Hay las dos cosas, pero tú ponte Linux ya, mujer. – Le señalé el portátil. – Ese Guindous tuyo es un agujero con ruedas.
  • Ay, pero es que es lo que tenía.
  • «Lo que tenía» también lo tenía mi abuelo con las verrugas, y se las quitó. Venga, hoy te instalo Debian.

Mientras ella buscaba el cargador, el log de fail2ban soltó una línea que me heló el Garrulón:

NOTICE  [sshd] Ban 91.192.x.x
NOTICE  [sshd] Ban 91.192.x.y   ...20 segundos después
NOTICE  [sshd] Ban 91.192.x.z   ...20 segundos después
NOTICE  [sshd] Ban 91.192.x.aa  ...20 segundos después

Veinte segundos exactos entre cada intento. Humanamente imposible. Aquello era un bot, sí, pero no un bot cualquiera: era el mismo bot, reencarnándose en IPs nuevas, sincronizado con mi reloj. Los Blue Pantallaz volvían a llamar a mi puerta. Y esta vez sabían la dirección.

El Comandante Vargas seguía suelto. Y su mujer, la estafadora, probablemente también, porque al día siguiente el diario vespertino, con la desenvoltura con que dan las malas noticias, decía que una tal «señora de V.» se había fugado del furgón policial en el kilómetro 47 de la A-3. Cuarenta y siete otra vez. Los sietes del destino bailaban.

Le eché el último trago al Garrulón. Tenía un final amargo.