Configurando Port Knocking en tu servidor

En los años 20 y 30 cuando en Estados Unidos se impuso la Ley Seca, donde se prohibía el consumo, venta, transporte y fabricación de bebidas alcohólicas, durante estos años proliferaron los bares clandestinos con doble razón social donde solicitaban una contraseña al entrar y dependiendo de la respuesta podrías disfrutar del anhelado licor o entrar a la mejor tienda de mascotas de la ciudad 😉 .

En el 2003 Martin Krzywinski, publicó un articulo en la revista SysAdmin titulado "Port Knocking: Network Authentication Across Closed Ports.", en el que mostraba en detalle como migrar estos mecanismos de autenticación usados durante la época de la "prohibición" a los sistemas de información actuales, bautizando esta técnica como Port Knocking.

El Port Knocking (algo así como "toque de puertos") básicamente consiste en realizar varios intentos de conexión seguidas a ciertos puertos con X protocolo (previamente establecidos) para «avisar» al sistema de que somos nosotros y nos deje entrar o ejecute algo que nosotros queramos, un Port Knocking se divide en 2 partes esenciales:

  • Servidor: quien queda a la espera de alguna conexión a los puertos que especificamos.
  • Cliente: que nos permite "tocar" los puertos en la secuencia establecida, para poder ingresar al sistema.

Si configuramos adecuadamente nuestro sistema de Port Knocking, podremos configurar nuestro firewall (puedes ver algunas reglas abajo) para que bloquee todo el trafico (menos el estrictamente necesario) y con nuestro sistema de Port Knocking abrir los puertos de los servicios que necesitemos, solo cuando haga falta y sin temor a perder el control del mismo.

#EJEMPLO REGLAS ITABLES QUE PUEDES USAR
#bloqueamos el trafico
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
#permitimos ping y loockback
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -p ICMP --icmp-type 8 -m limit --limit 1/s -j ACCEPT
iptables -A OUTPUT -p ICMP --icmp-type 0 -m limit --limit 1/s -j ACCEPT
#permitimos acceso al apache (si lo tenemos) o algun servicio critico
iptables -A INPUT -p TCP --dport 80 -d IPSERVIDOR -m state --state NEW -j ACCEPT

Para empezar a instalar y configurar nuestro Port Knocking, debemos hacer lo siguiente:

Instalar el demonio knockd, que contiene tanto el cliente, como el servidor de port knocking, para distribuciones basadas en debian, basta con un apt-get install knockd, en otras distribuciones también se encuentra empaquetado, aunque puedes compilar tu mismo el programa si no lo encuentras.

Después de instalar el knockd, debemos editar el archivo /etc/default/knockd habilitando el knockd (cambia el 0 por un 1) y configurando la interface de red por la cual escucharemos los "toques".

Una vez echo esto, vamos a configurar nuestras reglas de Port Knocking editando el archivo /etc/knockd.conf, es bastante simple de configurar, solo debemos cambiar la secuencia de puertos (predecibles para el articulo, pero deberías escoger puertos por encima del 5000 que no estén muy cerca el uno del otro y un timeout mas alto), el tiempo entre la conexión de cada uno, la bandera que utilizaran y el comando a ejecutar si todas las anteriores reglas se cumplen.

En la imagen de ejemplo podrás apreciar que (en este caso particular) deseo tener una combinación de puertos para abrir el servicio y otro para cerrarlo, si no deseas esto puedes simplemente poner un timeout a el comando y cuando este deje de estar activo, pasara a ejecutar el comando que especifiques.

[abrircerrarSSH]
sequence = 7000,8000,9000
seq_timeout = 5
tcpflags = syn,ack
start_command = iptables -A INPUT -p TCP --dport 22 -s %IP% -m state --state NEW -j ACCEPT
cmd_timeout = 25
stop_command = iptables -D INPUT -p TCP --dport 22 -s %IP% -m state --state NEW -j ACCEPT

También puedes cambiar los comandos a ejecutar para que realicen las tareas que tu quieras, en este caso lo que se quiere es abrir un puerto con el iptables.

Grabamos y cerramos los archivos de configuración, reiniciamos el knockd (/etc/init.d/knockd restart).

Ahora solo tenemos que ejecutar la secuencia de puertos desde nuestro cliente (existen clientes para Windows, GNU/Linux, Mac OS X) y se abrirá el puerto o se ejecutará el comando que configuramos con esa secuencia; también existe un cliente Knock para el iPhone, por lo que no tendrás problemas en acceder a tu servidor desde cualquier parte (me imagino que para otras plataformas, deben existir clientes parecidos).

Espero que les sea de utilidad, cualquier duda o sugerencia pueden hacerla llegar atreves de los comentarios.

Actualizado:
Acabo de encontrar un cliente de Port Knocking para iPhone mucho mejor, gratuito y sin publicidad llamado KnockOnD, click aquí para mas info.

Para mas Información:
Pagina Oficial del Port Knocking

Subir