portKnocking

En esta entrada del blog vamos a explicar cómo configurar port knocking en nuestro servidor Linux para aumentar la seguridad en alguno de los servicios que tengamos publicado en el mismo. Antes de nada vamos a explicar qué es Port Knocking:

Port Knocking o Golpeo de puertos es un mecanismo utilizado para abrir puertos en el firewall, de tal forma que si el firewall recibe ciertos intentos de conexión a ciertos puertos concretos y en un orden concreto, automáticamente abrirá el puerto específico para que el cliente se conecte. Por otra parte, tras recibir ciertos intentos de conexión a los mismos puertos (en distinto orden) o incluso a otros puertos diferentes, el firewall volverá a cerrar el puerto que abrió previamente.

Seguidamente, vamos a realizar una prueba de concepto (PoC) para que el lector aprenda cómo activar port knocking en su servidor Linux. En esta prueba vamos a utilizar port knocking en el puerto 22 donde tenemos levantado un servidor de SSH. A continuación se muestra cómo iniciar el servicio de SSH y cómo hacerlo permanente para que se mantenga aunque el servidor sea reiniciado:

  • Para levantar el servicio SSH se puede utilizar el siguiente comando:

01.- Iniciar SSH - port knocking

  • Para hacer que el servicio SSH sea permanente al reinicio de la máquina se debe utilizar el comando:

02.- Hacer permanente SSH - port knocking

A continuación, vamos a configurar unas reglas básicas de firewall. En caso de tener el firewall ya configurado en nuestro servidor será necesario eliminar la regla que permite el acceso al servidor de SSH (tened cuidado porque si la única forma que tenéis de acceder a vuestro servidor es mediante SSH, es posible que os quedéis sin acceso. Si estáis accediendo al servidor mediante SSH dejad la eliminación de la regla para el final). Mediante los siguientes comandos insertaremos unas reglas de firewall básicas para realizar la prueba de concepto:

03.- Reglas firewall - port knocking

Como veis en la anterior imagen las reglas insertadas son muy simples: Con la primera regla se aceptan todas las conexiones que vengan de la interfaz de loopback. Con la segunda regla se permiten todas las conexiones que ya se hayan establecido con anterioridad. Por último, se deniegan todo el resto de conexiones.

Si ejecutamos el comando sudo iptables –S podemos ver todas las reglas configuradas:

04.- Ver reglas firewall configuradas - port knocking

Además, al igual que hemos hecho con el servicio de SSH vamos a configurar el firewall iptables para que sea persistente a reinicios mediante el siguiente comando:

05.- iptables persistente - port knocking

En este punto, si utilizamos la herramienta nmap desde otro host diferente (por ejemplo, una máquina Windows), podemos ver que el puerto 22 está cerrado, ya que no hemos incluido ninguna regla que nos abra este puerto:

06.- puerto bloqueado - port knocking

 

Posteriormente, será necesario instalar el paquete knockd, el cual nos dará la posibilidad de realizar port knocking y habilitar o deshabilitar puertos dependiendo de los intentos de conexión recibidos.

07.- instalar knockd - port knocking

Además, el siguiente fichero de configuración nos servirá para definir la configuración del port knocking, donde hemos modificado ligeramente el fichero que se crea por defecto tras la instalación:

08.- configurar knockd - port knocking

En la primera línea de opciones se especifica el fichero de logs donde se insertarán los logs relacionados con este servicio. En nuestro caso hemos usado SysLog, pero se puede utilizar cualquier otro log modificando la línea UseSyslog por:

  • LogFile = /ruta_abusluta/fichero_log.log

Además, dentro del grupo de parámtros OpenSSH se configurará todo lo necesario para que se añada automáticamente una regla que permita abrir el puerto de SSH. El parámetro sequence se utiliza para especificar los puertos que deben ser golpeados (a los que nos debemos intentar conectar) y en el orden especificado. El parámetro seq_timeout especifica el tiempo en el cual se debe completar los intentos de conexión a los puertos de la secuencia anterior (en el ejemplo anterior 5 segundos). Además, el parámetro tcpflags especifica los flags de TCP que tiene que recibir un puerto concreto para que se considere que ha sido golpeado. Por último, también se especifica el comando que se ejecutará y que deberá servir para abrir el puerto especificado. En el ejemplo anterior el comando es:

Este comando está en una única línea y se utiliza para insertar una regla que abre el puerto 22 únicamente para la IP que realizó el port knocking correctamente. Inserta la regla en la posición 3, es decir, justo antes de la última regla con el DROP. La sentencia condicional if se utiliza para que no se duplique la regla, en caso de que algún cliente duplique la secuencia de comandos.
Además el último grupo de parámetros es closeSSH y se utilizará para configurar todo lo necesario para que se elimine la regla del firewall y que, por tanto, el puerto del servicio ssh deje de estar abierto para la IP concreta que lo abrió previamente. El significado de los parámetros es el mismo, pero en este caso el golpeo de puertos debe ser en el orden inverso (aunque se podrían haber utilizado otros puertos diferentes). El otro parámetro que cambia es el comando para eliminar la regla del firewall que permitía el acceso ssh.

A continuación, se deberá acceder al fichero /etc/default/knockd, y establecer el parámetro START_KNOCKD a 1. Además, si la interfaz por defecto no es la eth0 también será necesario quitar el carácter ‘#’ a la línea “# KNOCKD_OPTS=’-I eth1” y establecer la interfaz correcta (eth1, eth2, eth3, wlan0, wlan1, etc.).

09.- habilitar knockd - port knocking

Además, será necesario iniciar el servicio knockd utilizando el siguiente comando:

10.- iniciar servicio knockd - port knocking

En este momento vamos a comprobar cómo funciona port knocking con un cliente Windows. Existen varias aplicaciones de terceros para realizar port knocking, pero como preferimos no instalar ni ejecutar aplicaciones de terceros que no conocemos vamos a realizar port knocking desde Windows utilizando el cliente Telnet.

Es posible que el cliente Telnet no esté instalado en vuestro Windows 10, pero en panel de control en Programas y Características debemos pinchar en Activar o desactivar las características de Windows:

11.- Activar o desactivar características de Windows - port knocking

Seguidamente será necesario marcar la siguiente opción en color rojo y pinchar en ‘Aceptar’:

12.- Cliente Telnet Windows - port knocking

Posteriormente, para realizar port knocking y abrir el puerto 22 para poder conectarnos por ssh, vamos a iniciar una conexión de Telnet a los puertos 7000, 8000 y 9000 (en ese orden y en menos de 5 segundos, por tanto, sin esperar que aparezca el error de conexión lanzamos todos los comandos telnet seguidos. Si los lanzamos en diferentes intérpretes de comandos en Windows conseguiremos más velocidad).

13.- port knocking puerto 7000

14.- port knocking puerto 8000

15.- port knocking puerto 9000

Tras ejecutar estos comando seguidos podemos probar a lanzar un comando nmap al puerto 22 del servidor y podremos ver que la máquina tiene el puerto 22 abierto (solamente para la IP que ha realizado port knocking)

16.- puerto abierto nmap

Además si volvemos a revisar las reglas configuradas en el firewall, se puede ver que se ha añadido una regla más para permitir el acceso a la IP que realizó port knocking:

17.- regla abierta SSH - port knocking

Por último, para cerrar el puerto abierto previamente también podemos utilizar el cliente telnet de Windows iniciando una conexión a los puertos 9000, 8000 y 7000 (en ese orden y en menos de 5 segundos. Al igual que en el caso anterior, si los lanzamos en diferentes intérpretes de comandos en Windows conseguiremos más velocidad).

15.- port knocking puerto 9000

14.- port knocking puerto 8000

13.- port knocking puerto 7000

Entonces, tras lanzar el comando nmap podremos comprobar que el puerto ahora está cerrado:

06.- puerto bloqueado - port knocking

Además, si consultamos las reglas definidas en el firewall, vemos que se ha eliminado la regla creada previamente:

04.- Ver reglas firewall configuradas - port knocking

Como podéis ver la regla “–A INPUT –s 192.168.1.12/32 –p tcp –m tcp –dport 22 –j ACCEPT” ha sido eliminada correctamente.

Por supuesto, hay soluciones más elegantes para realizar port knocking y abrir o cerrar el puerto deseado, por ejemplo, programando nuestro propio script de python, C o Java que lancen un paquete TCP o UDP con el flag deseado al puerto correcto, pero esta era una forma muy simple de probarlo utilizando el cliente de Telnet de Windows sin tener que programar nada ni utilizar software de terceros.

Para finalizar esta publicación me gustaría dejar una recomendación para estar protegidos de los bots que buscan por Internet puertos abiertos que sean vulnerables:

  1. No utilizar puertos estándar si no es necesario. Por ejemplo, para la publicación de un servicio Web será obligatorio que utilicéis los puertos 80 y 443, pero para la publicación del servicio SSH no es necesario que utilicéis el puerto 22.
  1. Utilizar Port Knoking en puertos que no tengan que estar abiertos permanentemente, por ejemplo, el puerto ssh, el cual, sólo se utilizará cuando nos queramos conectar a nuestro servidor por ssh para administrarlo. Este es un nivel de seguridad más al paso anterior, porque aunque haya bots recorriendo Internet buscando puertos abiertos, nunca podrán llegar a encontrarlo porque el puerto estará cerrado.