La técnica del Port-Knocking trabaja a través de puertos cerrados, confía en todos los clientes e interactúa con los Knocks (en adelante “golpes”) que estos envían antes que se lleve a cabo la autentificación, por lo que no hay discriminación de clientes que intentan conectarse. Una vez que la técnica del Port-Knocking ha aprobado la secuencia de golpes de un cliente, lo dirige hacia las aplicaciones de seguridad que se encargaran de la autentificación del cliente, esto proporciona un equilibrio entre la protección y la flexibilidad.
1. TOC TOC, TOCANDO A LA PUERTA DEL SERVIDOR
Port Knocking – Securización de servidores
By: Ronnie A. Q. (ronixp@gmail.com)
INTRODUCCIÓN
En la actualidad podemos notar un aumento en el uso de nuevas tecnologías, cada vez
más, las empresas apuestan por el uso de computadoras para la administración de sus datos,
recursos y dispositivos, por el uso de redes cableadas o inalámbricas para interconectar los
datos y centralizando así la información en servidores de uso general y de propósito múltiple.
En este tipo de escenarios, muy comúnmente surge la necesidad de acceder
remotamente a los servidores (no necesariamente de oficina a oficina, sino hablamos de
estaciones de trabajo distanciadas de una ciudad a otro), para realizar tareas de
administración o de mantenimiento.
Es aquí donde el tema de seguridad en el acceso a los servidores sugiere una mayor
preocupación. Por tal motivo en el resto de este documento se hablara de una técnica no muy
conocida y que aparentemente puede resultar muy sencilla pero su eficacia esta comprobada,
la técnica de seguridad denominada PORT-KNOCKING.
CONTENIDO
Los administradores de sistemas, se enfrentan al reto de Cliente puede ser tanto
equilibrar la flexibilidad y la seguridad a la hora de diseñar las una persona como una
reglas para permitir el acceso de usuarios (en adelante clientes) máquina que requiere
autorizados que requieren conectarse al servidor remoto. La acceder a recursos y
servicios brindados por
seguridad del servidor debe ofrecer protección contra clientes
otro llamado servidor.
atacantes, y al mismo tiempo dar confianza para conectarse a
los clientes legítimos.
Actualmente para permitir la conexión de un cliente legitimo al servidor, se realiza un
filtrado mediante las direcciones IP, o mediante el puerto al que esta acogida la conexión del
cliente. Lamentablemente, este tipo de filtrados no distingue a clientes atacantes que pueden
venir de direcciones IP de confianza. La flexibilidad es limitada por el echo de que ninguna IP
de las direcciones bloqueadas pueden conectarse, independientemente de la confianza o el
estatus que esta posea. Al mismo tiempo la protección se ve debilitada por el hecho de que
cualquiera de los rangos de IP bloqueados físicamente puede viajar y conectarse desde un
cliente que posea una IP sin filtrar.
El uso de sistemas de detección de intrusos y mantenimiento de aplicaciones que hay
hasta la fecha, pueden ir a un largo camino hacia la prestación de la protección que ofrecen,
pero lo hacen solo en contra los ataques conocidos, derivados o previstos.
Tener los puertos abiertos sigue siendo una vulnerabilidad necesaria, para que se
realice la conexión entre el cliente y el servidor, pero también puede convertirse en abrir las
puertas para el ataque. Al final siempre que los puertos permanezcan abiertos, las
aplicaciones de red son susceptibles a tener clientes atacantes.
2. Aquí es donde entra el Port-Knocking
Para eliminar el riesgo asociado de tener los puertos
Los knocks o golpes
abiertos, la técnica del Port-Knocking trabaja a través de puertos
son equivalentes a
cerrados, confía en todos los clientes e interactúa con los
intentos de conexión
Knocks (en adelante “golpes”) que estos envían antes que se
que son enviados por
lleve a cabo la autentificación, por lo que no hay discriminación
algún cliente.
de clientes que intentan conectarse. Una vez que la técnica del
Port-Knocking ha aprobado la secuencia de golpes de un cliente, lo dirige hacia las
aplicaciones de seguridad que se encargaran de la autentificación del cliente, esto proporciona
un equilibrio entre la protección y la flexibilidad.
Describamos como funciona esta técnica
Para entender el concepto del Port-Knocking, recordemos las películas en donde un
sujeto golpea con una cierta secuencia de golpecillos la puerta de una taberna, y si la
secuencia era correcta, el tabernero abría una rendija para solicitarle una clave verbal y en el
caso de que la secuencia de golpes no era correcta, el tabernero no hacia nada, por lo que el
cliente pensaba que la taberna estaba cerrada. El concepto del Port-Knocking es exactamente
análogo.
Al igual que en ejemplo, esta técnica se basa en aparentar que todo esta cerrado. El
cliente o KnockCliente es el responsable de generar la secuencia de golpes y tabernero o el
KnockDaemon es el responsable de escuchar los puertos del servidor, tener un registro de
golpes y de manipular los acciones.
KnockCliente
El KnockCliente es el responsable de enviar los golpes al servidor remoto donde un
Knockdaemon esta escuchando. Su implementación puede ser tan simple como NETCAT o un
programa modificado de PING o tan complicada como un generador de HASH CIFRADO. El
KnockCliente codifica la información antes de enviarla. La secuencia de golpes sin codificar
está compuesta generalmente de octetos: los primero cuatro octetos son de propiedad
intelectual, es decir valores basados en la IP del cliente que envía el paquete en cuestión,
seguidamente se encuentran octetos basados en el puerto, un FLAG o bandera, el tiempo de
comprobación, y por ultimo factores basados en HASH CIFRADO.
KnockDaemon
- En primer lugar, el Knockdaemon crea un archivo de registro para controlar los golpes que
reciben los puertos del servidor remoto.
- En segundo lugar, el Knockdaemon requiere un método para extraer las secuencias de
golpes a los puertos, ya sea desde del archivo registro o por la captura de paquetes y traducir
su carga útil en información utilizable.
- En este paso el Knockdaemon debe ser capaz de:
detectar cuándo una secuencia de golpes comienza y termina,
detectar correctamente la presencia de falsos golpes que no son parte de una
secuencia.
realizar un seguimiento de múltiples secuencias que llegan al mismo tiempo desde
diferentes direcciones IP remotas.
- Por ultimo, cuando un formato de secuencia correcto sea recibido, el contenido de la
información de la secuencia debe ser vinculada a una acción. La acción por lo general puede
ser ejecutar algún comando específico o un grupo de comandos.
El formato de la secuencia
El formato de la secuencia correcta puede consistir en cualquier número de TCP, UDP, o
incluso a veces ICMP y otros paquetes de protocolo, que estén dentro del rango de numeración
de puertos de la máquina destino. La complejidad de la secuencia de golpes puede ser
cualquier cosa como una simple lista ordenada (por ejemplo, el puerto TCP 1000, el puerto TCP
2000, el puerto UDP 3000).
3. Consideremos el siguiente ejemplo aplicando el Port-Knocking
El servidor con IP: 192.168.1.2, tiene seguridad Port-Knocking por consiguiente los
puertos están configurados para rechazar cualquier conexión TCP, y sin enviar paquetes
ICMP de error al cliente. El comando IPTABLES (IPCHAINS en versiones inferiores a Linux
2.4) procede a cerrar los puertos 1-1024 de la siguiente forma:
iptables –A INPUT –s 0.0.0.0/0 -p tcp –i eth1 –-dport 1:1024 -j DROP
El cliente de IP: 192.168.1.5. En el primer caso, intentara conectarse sin saber de la
existencia del Port-Knocking por lo que su intento será fallido. En el Segundo caso,
conociendo de la existencia de esta técnica, intentara conectarse al servidor con la siguiente
secuencia de puertos TCP: 100-200-300 (Paso 1 en la figura Nº 1). Desde el punto de vista
del cliente, los intentos no producen ninguna respuesta y son en silencio:
TCP_SYN al puerto 100
TCP_SYN al puerto 200
TCP_SYN al puerto 300
Sin embargo, en el servidor se registran todos los intentos de conexión; los datos del cliente y
los puertos utilizados en cada intento de conexión de la siguiente forma:
May 15 20:13:26 ... input DROP ... 192.168.1.5:10002 port:100
May 15 20:13:27 ... input DROP ... 192.168.1.5:10003 port:200
May 15 20:13:27 ... input DROP ... 192.168.1.5:10004 port:300
El KnockDaemon que supervisa el archivo de registro puede detectar estos intentos de
conexión a los puertos 100, 200, 300 desde la misma dirección IP: 192.168.1.5. Esta
secuencia en particular podría hacer que el KnockDaemon abriera el puerto SSH (TCP/22)
para la IP: 192.168.1.5 y ejecutaría el siguiente comando: (Paso 2 en la figura Nº 1)
iptables -i eth1 -I INPUT -s 192.168.1.5 -p tcp --dport 22 -j ACCEPT
Una vez abierto el puerto SSH (TCP/22), el cliente puede establecer conexión con el servidor
a través de dicho puerto. (Paso 3 en la figura Nº 1). Otra secuencia se puede utilizar para
cerrar el puerto. Por ejemplo, 300, 200, 100 podría ser usado para activar la supresión de la
regla que fue creada para permitir dinámicamente a la IP: 192.168.1.5 conectarse.
4. Hablemos de los Beneficios del Port-Knocking
Una de las ventajas principales de esta técnica de seguridad es que la información
fluye en forma de intentos de conexión en lugar de los típicos paquetes de datos de carga útil.
Un atacante que ignore la existencia de esta técnica nunca podrá conectarse, o causar algún
daño al servidor. Incluso si supiera de la existencia de esta técnica, requeriría de un gran
esfuerzo de fuerza bruta para descubrir la secuencia, la mas simple secuencia de tres golpes
de tipo TCP (por ejemplo los puertos 700, 800, 900) requeriría que el atacante tenga que
probar con todas las combinaciones de tres puertos en el rango de 1-65535, y además de eso
escanear en cada una de las combinaciones si uno de los puertos por el que quiere entrar se
ah abierto. El puerto no se abrirá hasta que la secuencia correcta de golpes en los puertos
correctos sea recibida en orden por el KnockDaemon. Para minimizar el riesgo de una
interceptación de las partes de una secuencia funcional que se esta enviando, el contenido de
la información que contiene la IP remota en la secuencia puede ser encriptada.
Otra ventaja importante es que el sistema es completamente personalizable, por lo que
no se limita a la apertura de un puerto especifico, sino que una secuencia de golpes esta
vinculada con una acción particular, como por ejemplo ejecutar un script shell, por lo que
cuando una secuencia especifica de golpes es detectada por el KnockDaemon, este
ejecutara el script.
Provee de dinamismo a las tareas de administración, un cliente autorizado situado en
cualquier parte del mundo sería capaz de abrir el puerto en el que esta interesado por un
determinado periodo de tiempo sin necesidad de ayuda del administrador del servidor.
También podrá quot;cerrarquot; el puerto una vez que hayan terminado, con otra secuencia de golpes
y nunca mas abrirla para la misma IP remota.
Una Importante aplicación de este sistema se expone en el uso del puerto SSH, puede
impedir ataques de fuerza bruta sobre la contraseña de acceso. El demonio del SSH ni
siquiera seria despertado con cualquier intento que se haga, hasta después que se haya
detectado una secuencia correcta de golpes.
Otro punto a favor de esta técnica, es que el software necesario, ya sea en el servidor
o cliente final, es mínimo y, de hecho, puede aplicarse como un simple Script de shell para el
servidor o un archivo por lotes y una utilidad de línea de comandos de Windows para el cliente.
En términos de uso de tráfico, CPU y el consumo de memoria, el Port-Knocking utiliza un
mínimo absoluto. La implementación de KnockDaemon también tiende a ser tan simple que
cualquier tipo de vulnerabilidad seria evidente y el código es muy fácil de controlar.
Cuando bebe ser utilizado el Port-Knocking
Es recomendable usarlo en servicios de red que están destinados a ser utilizados por
unos pocos usuarios autorizados. Por ejemplo; Consolas de administración, Administración
basada en interfaces Web, SSH, bases de datos, etc.
También para proteger servicios que se sabe tienen vulnerabilidades graves, pero por
alguna razón no se pueden desactivar,
Cualquiera que quiera añadir otra capa de seguridad a los servicios críticos como SSH.
Esta técnica no es recomendable utilizarla para servidores que serán utilizados por el
público en general, Por ejemplo; no seria una buena idea proteger un servidor Web público
con esta técnica. Por que todos los usuarios que querrían acceder a una página web tendrían
que usar un KnockCliente para establecer la conexión con el servidor web.
5. DISCUSIÓN
Aunque parezca una medida un tanto paranoica, es recomendable utilizarla debido a
que la mayoría de aplicaciones tiene vulnerabilidades, los administradores de sistemas no
pueden basarse simplemente en la seguridad proporcionada por los fabricantes, los sistemas
críticos necesitan capas adicionales de seguridad, y merece la pena, aunque sea sólo para
ahorrarte los intentos de intrusión SSH con ataques por fuerza bruta.
En temas de seguridad, no existen técnicas que garanticen realmente en un 100% la
protección que se ofrece. Tengamos en cuenta la Tercera Ley de Newton aplicada a la
seguridad: “Por cada Sistema o Protocolo de Seguridad, existe en su contraparte un truco
contrario”. Es por ello que se debe seguir investigando y dar propuestas para mejorar las
técnicas de seguridad utilizadas. Por ejemplo para esta técnica, seria conveniente el uso
adicional de datos basura dentro del paquete TCP, o incluso variar el TTL de cada paquete
puede ser usado para transmitir algún tipo simple de combinación de números.
Por ultimo, mencionar que esta técnica de seguridad trabaja en el nivel de la capa de
enlace, siguiendo el modelo OSI. Se recomienda investigar más acerca de técnicas de
seguridad basados en la capa de aplicación.
BIBLIOGRAFÍA
http://www.portknocking.org/
http://www.portknocking.org/view/resources
http://www.portknocking.org/view/implementations
http://www.zeroflux.org/cgi-bin/cvstrac.cgi/knock/wiki
http://es.wikipedia.org
RECURSOS
¿Port-Knocking... ofuscación o capa de seguridad?
http://www.hispasec.com/unaaldia/3382/
Cómo instalar y configurar knockd a modo de receta
http://crysol.inf-cr.uclm.es/es/node/618
Iptables:
http://es.wikipedia.org/wiki/Iptables
Lista de Números de Puertos
http://es.wikipedia.org/wiki/Lista_de_números_de_puerto
Recomendaciones de Seguridad
www.fi.upm.es/docs/servicios/seguridad_informatica/371_recomendaciones.pdf