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: [@MORE@]

# 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.
  • Es una cosa que tengo pendiente... valorar qué tal va usar solo PF para defenderme de los ataques a SSH. Me apunto esta anotación para cuando tenga un rato. La verdad es que el sistema de scripts que uso funciona, pero ya comprobé que los bloqueos no son realmente útiles porque vuelven un tanto por cien muy bajo de atacantes, así que igual es más interesante bloquear temporalmente en el momento que se detecta el ataque que llevar bloqueos de forma más permanente. Ahora mismo tengo 558 IPs bloqueadas en blackshell O_o
  • Hola nenes... Pero sólo funciona con ssh? A mi me interesa para mi ftp tambien. Sin haberme parado a mirarlo demasido debería funcionar, no?
blog comments powered by Disqus