port knocking

Golpeteo de Puertos o Port Knocking en Linux

Este tema del Port Knocking me recuerda esa película, llamada León The Proffesional, cuando Mathilda Lando, la amiga de León (Natalie Portman) por medio de un ‘santo y seña‘ (un código al golpear la puerta), le advierte que hay peligro (pues habían logrado capturarla). Bueno, algo parecido se trata este asunto del Port Knocking en Linux.

En Seguridad Informática el Port Knocking es una técnica de doble vía que también busca la legítima correspondencia entre cliente y servidor. El Port Knocking establece un ‘santo y seña‘ entre el cliente y el servidor, para que éste último habilite uno o varios puertos TCP que el cliente necesita usar. Con el demonio Knockd implementamos esta capa de seguridad extra.

Su funcionamiento es así:

  1. Se establece un serie de puertos y en una secuencia que el cliente debe envíar al servidor.
  2. El servidor valida los puertos y la secuencia.
  3. Si el paso 2 es confirmado, se abre el puerto por el que el usuario necesita trabajar. Generalmente este puerto es el de SSH (El puerto es habilitado para la dirección IP del cliente).

Modelo

Cuando el usuario termine de usar el servicio, deberá enviar de nuevo un ‘santo y seña‘ para que el servidor vuelva a bloquear el puerto para su dirección IP.

Instalación de Knockd


Lo primero, instalamos a Knockd en ambos extremos:

sudo apt install knockd

Luego, debemos modificar dos archivos de configuración:

/etc/default/knockd
/etc/knockd.conf

En el primero cambiamos el valor de START_KNOCKD a 1, para que inicie al prender la máquina. Luego en KNOCKD_OPTS definimos el puerto de red por donde trabajara el ‘santo y seña‘.

Antes de entrar a modificar sus archivos de configuración, debemos cerrar el puerto SSH para todos (el mio está en el puerto 12521. Si nuestro servicio SSH está en un puerto diferente al 22, debemos especificarlo en las reglas IPTABLES de /etc/knockd.conf). Entonces esta será nuestra regla inicial, y asegurémonos que se cargue al prender el sistema:

sudo iptables -I INPUT -i eth0 -p tcp --dport 12521 -j DROP

Como ya sabemos, la opción -I sin argumentos ubica las reglas en la primera posición de la cadena, a diferencia de la opción -A que la ubica al final de la cadena. Lo hacemos así para garantizar que Knockd ubique las reglas de los clientes siempre por encima de la regla inicial.

En el archivo /etc/knockd.conf ajustamos el funcionamiento de los puertos y su secuencia, y también la regla IPTABLES que habilita y cierra el puerto. Este es su aspecto:

[options]
#UseSyslog
logfile = /var/log/knockd.log

[openSSH]
sequence = 7000,8000,9000
seq_timeout = 5
command = /sbin/iptables -I INPUT -i eth0 -s %IP% -p tcp --dport 44244 -j ACCEPT
tcpflags = syn

[closeSSH]
sequence = 9000,8000,7000
seq_timeout = 5
command = /sbin/iptables -D INPUT -i eth0 -s %IP% -p tcp --dport 44244 -j ACCEPT
tcpflags = syn

A veces la regla que abre el puerto viene por defecto así:

iptables -A INPUT ...

En las nuevas versiones debemos cambiarlo así:

iptables -I INPUT ...

Por supuesto que también podemos cambiar los valores y la secuencia del ‘santo y seña‘ a nuestras consideraciones. Podemos poner más de tres puertos para la secuencia de apertura, y dejar tres para secuencia de cierre (entre más secuencias, mejor).

La etiqueta seq_timeout define el tiempo en segundos, que el cliente tiene para completar la secuencia.

El bloque [openSSH] es el ‘santo y seña‘ para abrir el puerto SSH, y el bloque [closeSSH] para cerrarlo. Este mecanismo de seguridad informática también puede emplearse para asegurar otros puertos, como el del RDP del Escritorio Remoto de Windows.

Antes de poner en marcha a Knockd, debemos asegurarnos que no exista una regla IPTABLES habilitando el puerto de SSH. Con el comando IPTABLES -L INPUT podemos verificarlo. Es más, debemos tener el puerto de SSH cerrado para todos, así garantizamos que Knockd abrá el puerto para quien tenga el ‘santo y seña‘ correcto.

Puesta en marcha del Port Knocking en Linux


Ya bloqueado el puerto SSH y aplicados los ajustes necesarios para nuestro Knockd, comenzamos a ponerlo en funcionamiento desde el cliente:

Enviamos el santo y seña para que nos abrá el puerto SSH

knock -v ip_del_servidor 7000 8000 9000

Luego entramos:

ssh -p 12521 -l usuario ip_del_servidor

Terminamos y volvemos a enviar el santo y seña para cerrar el puerto:

knock -v ip_del_servidor 9000 8000 7000

También podemos definir un retraso entre knocks (por ejemplo 500 milisegundos) con el parámetro -d. Esto es útil cuando la conexión entre el cliente y el servidor es inestable (a veces he tenido que poner un retraso de 1000 milisegundos):

knock -v ip_del_servidor 7000 8000 9000 -d 500

¿Cuándo usar Port Knocking?


Lo mejor es incorporarlo permanentemente en nuestra estrategia de seguridad informática, más cuando tenemos sistemas usando servicios con vulnerabilidades insalvables, como en algunos servidores Linux donde no contamos con actualizaciones efectivas.

Por ejemplo, tenemos una versión vieja de OpenSSH Server en un servidor Linux, la 8.9 (que le han identificado 6 vulnerabilidades hasta la fecha, la CVE-2023-38408, CVE-2024-6387…), y la versión de sus repositorios también llega hasta ahí. Instalar una versión nueva de OpenSSH Server desde un paquete independiente no funciona porque, esos paquetes nuevos e independientes, depende también de nuevas versiones de Libc en el sistema (o sea, requiere una actualización general de la distribución Linux). Con ayuda de Port Knocking minimizamos el tiempo de exposición de este servicio en Internet.

Si te gustó este artículo puedes revisar más aquí sobre Seguridad Informática.

Seguridad Informática en las Empresas

También puedes ver más opciones de operación y su equivalente en Windows de Port Knocking, en su página de GitHub.


Valora este artículo:

Port Knocking o Golpeteo de Puertos en Linux
5,0 rating based on 12.345 ratings
Overall rating: 5 out of 5 based on 1 reviews.
Nombres
Email
Titulo
Calificanos
Contenido

Elegante

★★★★★
“ Sus recomendaciones tan elegante como siempre”
- Alirio Nuñez
Comparte esto en
Publicado en Seguridad Informática.