Abre o cierra la muralla...

Publicado por Pedro C. el 07-02-2013

Como decía la canción... ¿Quién es? —La paloma y el laurel... —¡Abre la muralla! —¡Tun, tun! —¿Quién es? —El gusano y el ciempiés... —¡Cierra la muralla!

Nos encontramos muchas veces con la necesidad de tener "puertos abiertos al exterior" sobretodo para la administración de nuestros servidores, routers, appliances, etc... con todos los riesgos que nos pueden originar como ya hemos comentado muchas veces. Por ejemplo, con el servicio de SSH de una máquina no es que estemos conectados continuamente, pero seguro que si un día lo cerramos, llega Murphy y seguro que tenemos que entrar a la máquina para hacer alguna tarea urgente. Si estamos cerca, no hay problema, pero si estamos de vacaciones en "La Recueja", la máquina está en Albacete y sólo tenemos nosotros el acceso físico a la máquina y está debidamente configurada, nadie podrá ayudarnos para "levantar" el servicio o "abrir" el puerto en un momento dado para administrarla y luego "cerrarlo". Precisamente en ésta entrada, vamos a ver cómo configurar la apertura de un puerto "bajo demanda" cuando a nosotros nos interese, reduciendo la exposición pública del mismo.

Bajo un Sistema Operativo como Debian, tenemos un demonio incluido "de serie" en sus paquetes que va a realizar la labor por nosotros "en nuestra ausencia". Se trata del proyecto knockd o conocido por ser un Port-knocking Server (toque de puertos) fácilmente configurable.

Manos a la obra

Lo primero será actualizar los paquetes y descargar el paquete correcto:

#apt-get update
#apt-get install knockd
				

Nos vamos al directorio de configuración y editamos el fichero knockd

#cd /etc/default
#vi knockd				
				

Le indicamos que arranque automáticamente al inicio con un 1 y le decimos la interface de red donde escuchará las "llamadas"

...
START_KNOCKD=1
KNOCKD_OPTS="-i eth0"
...				
				

Ahora, vamos a configurar que el puerto TCP/22 del servicio como SSH se abra con una secuencia de "toques" concreta a puertos. Admite TCP, UDP, flags, etc... Si consultais la documentación, vereis múltiples ejemplos. En nuestro caso, vamos a usar la forma más sencilla que es "tocar" los puertos 4777, 9778 y 15779 con 5 segundos de cadencia (no pongais puertos seguidos u os arriesgais a que un escaneo estándar pueda abrir servicios "secretos") y con el flag "syn" en los paquetes para abrir el puerto del servicio SSH. Emplearemos al misma secuencia al revés para cerrar el puerto del servicio. Editaremos el fichero /etc/knockd.conf

#cd /etc
#vi knockd.conf

...				
[options]
        logfile = /var/log/muralla.log

[abre_muralla_SSH]
        sequence    = 4777,9778,15779
        seq_timeout = 5
        tcpflags    = syn
        command     = /usr/sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT

[cierra_muralla_SSH]
        sequence    = 15779,9778,4777
        seq_timeout = 5
        tcpflags    = syn
        command     = /usr/sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
...		
				

Bastará con reiniciar el demonio con /etc/init.d/knockd restart para que pueda abrir o cerrar el puerto bajo demanda.

El cliente

El propio paquete incluye un cliente nativo knock para GNU/Linux para enviar las secuencias necesarias.

#knock sistema.remoto.com 4777 9778 15779
				

Bastará con ver en la máquina remota las acciones en el fichero de registro que hemos configurado:

#tail -f /var/log/muralla.log
				

Desde la propia página del proyecto, teneis clientes para GNU/Linux, Microsoft© Windows, MacOS, iPhone, iPad/iPod y Android. Con el port-knocking ya no teneis excusa para seguir exponiendo vuestros puertos a todo el mundo. Sólo quien conozca la "secuencia secreta" podrá realizar la acción que tengais definida. Y por supuesto, usar otros puertos diferentes de los ejemplos, que luego pasa lo que pasa...

Recordaros que en los Cursos especializados de Seguridad Informática y Administración de Sistemas que ofrecemos en Academia MADESYP realizamos y establecemos las contramedidas con todo esto y mucho más...

Ser buenos y no hagáis maldades!