Asegurando puertos: Port Knocking

Improvisa :: Informática :: Asegurando puertos: Port KnockingEn este pequeño manual os enseñamos a asegurar vuestros puertos más débiles con el paquete de debian Knockd y la técnica conocida como Port Knocking.

Esta técnica es utilizada para aplicar una regla, en nuestro caso de iptables, siempre y cuando se llamen a una serie de puertos previamente. Es como utilizar la frase «Ábrete Sésamo» para abrir la puerta de la guarida……

El demonio knockd esperará una secuencia de «llamadas a puertos» en la interfaz que configuremos y si es correcta, ejecutará el comando que corresponda a esta secuencia.

Éste paquete nos ayudará a evitar procesos automatizados contra puertos más que conocidos, ssh, realvnc, terminal server, y un largo etcétera.

La escucha se realiza a un nivel mas bajo que el que realiza iptables (nivel de enlace gracias a libpcap 0.8), es decir que los puertos no deben estar abiertos. A los ojos de cualquiera los puertos de llamada como el puerto final estarán cerrados.

La teoría es simple así que manos a la obra:



Configuraremos nuestro servicio para que cuando «llamen» al puerto 1001 y luego al 1002 y luego al 1003 (todos tcp) abriremos por 15 segundos el puerto 22 tcp a la ip que hizo la llamada. En esos 15 segundos el usuario que hizo la llamada debe iniciar la conexión, ya que cuando estos segundos pasen se ejecutara la sentencia contraria (de cierre de puerto 22 tcp).

Comencemos:

debian:~# apt-get install knockd libpcap0.8

Una vez instalado, knockd nos da un aviso para que editemos el archivo /etc/default/knockd si queremos iniciarlo, pues a ello:

debian:~# vi /etc/default/knockd

En la línea que pone START_KNOCKD=0 debemos poner 1 si queremos que se inicie con el sistema, pongámosla a 1.

Y en la línea que pone KNOCKD_OPTS=»-i eth0″, pongamos la interfaz que debe estar a la escucha.

El fichero que configuraremos ahora será /etc/knockd.conf

debian:~# vi /etc/knockd.conf

Veréis que el archivo que nos deja por defecto tiene un ejemplo muy claro para abrir con una secuencia de puertos y cerrarlo con otra. Este ejemplo nos valdría, pero existe un problema y es que olvidemos cerrar el puerto 22 una vez hayamos terminado nuestra sesión de ssh.

Existe otra configuración que para mí es la aconsejable, pasados los segundos que le digamos se cerrara automáticamente. Si nuestro iptables tiene permitidos los paquetes establecidos no tendremos ningún problema…..

[opencloseSSHlinux]      
sequence=1001,1002,1003      
seq_timeout=5
start_command=iptables -A INPUT -s %IP% -p tcp –dport 22 -j ACCEPT && echo «Funcionando» && iptables -L > /tmp/loquetengo      
cmd_timeout=15
stop_command=iptables -D INPUT -s %IP% -p tcp –dport 22 -j ACCEPT

Os explico que hace esta configuración, si en 5 segundos (seq_timeout) recibo llamadas a los puertos 1001,1002,1003 y en este orden (sequence) se me ejecutara la cadena start_command, en esta hago tres cosas ejecutar el comando iptables que quiero, sacar por pantalla la cadena «Funcionando» y escribir la configuración del iptables para comprobar que lo hace bien. En 15 segundos (cmd_timeout) se ejecutara la cadena stop_command, hayan entrado al puerto 22 o no, si nuestro firewall permite paquetes establecidos ya no serán rechazados.

Recordad que también podemos mirar en /var/log/knockd.log si todo va bien.

Para hacer las pruebas el mismo paquete knockd nos trae un paquete llamado knock, este se utiliza para realizar la llamada a los puertos que queramos:

OTRAMAQUINA:~# knock ip_interfaz_configurada 1001 1002 1003

debian:~# vi /var/log/knockd.log

[2007-01-16 12:36] 88.22.1.2 (2.Red-88-22-1.staticIP.rima-tde.net): opencloseSSHlinux: Stage 1
[2007-01-16 12:36] 88.22.1.2 (2.Red-88-22-1.staticIP.rima-tde.net): opencloseSSHlinux: Stage 2
[2007-01-16 12:36] 88.22.1.2 (2.Red-88-22-1.staticIP.rima-tde.net): opencloseSSHlinux: Stage 3
[2007-01-16 12:36] 88.22.1.2 (2.Red-88-22-1.staticIP.rima-tde.net): opencloseSSHlinux: OPEN SESAME
[2007-01-16 12:36] opencloseSSHlinux: running command: iptables -A INPUT -s %IP% -p tcp –dport 22 -j ACCEPT && echo «Funcionando» && iptables -L > /tmp/loquetengo
[2007-01-16 12:36] opencloseSSHlinux: command returned non-zero status code (1)
[2007-01-16 12:36] 88.22.1.2 (2.Red-88-22-1.staticIP.rima-tde.net): opencloseSSHlinux: command timeout
[2007-01-16 12:36] opencloseSSHlinux: running command: iptables -D INPUT -s %IP% -p tcp –dport 22 -j ACCEPT

Existe también una pequeña aplicación para hacer las llamadas a los puertos desde Windows, esta se llama Knock.exe, lo dejo en la sección de descargas, ya que no tengo muy claro de donde lo saqué.

Bueno espero que este pequeño review o howto os venga bien.

Fuentes: http://www.zeroflux.org/cgi-bin/cvstrac.cgi/knock/wiki