Bloqueando ssh bruteforce con PF

Al hilo de la anterior entrada y buscando alternativas para bloquear todos esos ataques por fuerza bruta (bruteforce) al servicio de administración remota SSH he encontrado la solución ideal -o lo que más se le aproxima-, sin descartar las anteriores.

La regla mágica hace uso de una nueva característica de Packet Filter (desde OpenBSD-3.7) llamada max-src-conn-rate. Lo que venimos a decirle a nuestro firewall es que permita todas las conexiones ssh con la salvedad de que no se sobrepasen 3 intentos en menos de 30 segundos, en dicho caso se agregará la IP del atacante a una lista llamada ssh-bruteforce, en pf.conf:

# SSH Bruteforce
pass in on $ext_if proto tcp from any to ($ext_if) port ssh \\
	flags S/SA keep state \\
	(max-src-conn-rate 3/30, overload <ssh-bruteforce> flush global)

Si el entorno lo permite se pueden cambiar los valores de intentos y tiempo intentando ser más permisivos (6/60...), pero todavía falta la segunda parte, donde bloqueamos cualquier tipo de conexión de los ssh-bruteforce a nuestro equipo, también en pf.conf:

# Bloqueo de ssh-bruteforce
block drop in quick on $ext_if from <ssh-bruteforce>

Aún así y siguiendo con nuestra buena fé y permisividad podemos instalar una herramienta llamada expiretable para limpiar la tabla ssh-bruteforce cada cierto tiempo suponiendo que se traten de IP's dinámicas o cualquier otro tipo de malentendido (en FreeBSD):

# portinstall -prfv /usr/ports/security/expiretable
# crontab -l
*/5   *   *   *   *   /usr/local/sbin/expiretable -t 3600 ssh-bruteforce

Donde 3600 son los segundos que durará el baneo. Una solución óptima y dinámica para un problema de los más frecuentes en máquinas productivas. PF nunca dejará de sorprenderme :)

openbsd sysadmin freebsd

About the author

Óscar
has doubledaddy super powers, father of Hugo and Nico, husband of Marta, *nix user, Djangonaut and open source passionate.