Golpeteo de puertos (en inglés port knocking)
es sin lugar a dudas una práctica que bien todos los que administramos
servidores deberíamos conocer, aquí les explico detalladamente qué es
esto y cómo implementar y configurar esto
Ahora mismo los que administramos algún servidor tenemos acceso SSH a ese servidor, algunos cambiamos el puerto por defecto de SSH
y ya no usa el puerto 22 y otros simplemente lo dejan así (algo no
recomendado), no obstante el servidor tiene habilitado el acceso por SSH
mediante algún puerto y esto ya es una ‘vulnerabilidad’.
Con Port Knocking podemos lograr lo siguiente:
1.
El acceso SSH no está habilitado por ningún puerto. Si tenemos SSH
configurado por el puerto 9191 (por ejemplo) ese puerto (9191) estará
cerrado para todos.
2. Si alguien desea acceder por SSH al servidor no
podrá obviamente, pues el puerto 9191 está cerrado… pero, si usamos una
combinación ‘mágica’ o secreta se nos abrirá ese puerto, por ejemplo:
1. Hago un telnet al puerto 7000 del servidor
2. Hago otro telnet al puerto 8000 del servidor
3. Hago otro telnet al puerto 9000 del servidor
4. El servidor detecta que alguien ha efectuado la
combinación secreta (tocar los puertos 7000, 8000 y 9000 en ese orden) y
abrirá el puerto 9191 para que se solicite el login por SSH (lo abrirá
solo para la IP desde la cual se hizo la combinación de puertos
satisfactoria).
5. Ahora para cerrar SSH simplemente hago un telnet al puerto 3500
6. Haré otro telnet al puerto 4500
7. Y finalmente otro telnet al puerto 5500
8. Al efectuar esta otra combinación secreta que el servidor detecta, se cerrará el puerto 9191 de nuevo.
O sea, explicando de forma aún más simple esto…
Con Port Knocking el servidor nuestro podrá tener determinados puertos cerrados, pero cuando el server detecte que desde X IP se efectuó la combinación de puertos correcta (configuración previamente definida en un archivo de configuración) ejecutará determinado comando en él mismo obviamente (comando también definido en el archivo de configuración).
¿Se entiende no? ¿Cómo instalar un daemon para Port Knocking?
Yo lo hago con el paquete kockd, que nos permitirá de forma muy pero muy simple y rápida poder implementar y configurar Port Knocking.
Instalen el paquete: knockd
¿Cómo configurar Port Knocking con knockd?
Una vez instalado pasamos a configurarlo, para ello editamos (como root) el archivo /etc/knockd.conf:nano /etc/knockd.conf
Explicar la configuración por defecto es realmente simple.
- Primero, UseSyslog significa que para registrar actividad (log) se usará /var/log/syslog.
- Segundo, en la sección [openSSH] es donde obviamente irán las instrucciones para abrir SSH, primeramente tenemos la secuencia de puertos (la combinación secreta) que está configurada por defecto (puerto 7000, puerto 8000 y finalmente puerto 9000). Obviamente los puertos se pueden cambiar (de hecho lo recomiendo) así como no tienen que ser 3 obligatoriamente, pueden ser más o menos, depende de ustedes.
- Tercero, seq_timeout = 5 significa el tiempo que se esperará para que se efectúe la combinación secreta de puertos. Por defecto está puesto 5 segundos, esto significa que una vez empecemos a efectuar el port knocking (o sea, que cuando hagamos un telnet al puerto 7000) tenemos máximo 5 segundos para terminar la secuencia correcta, si pasan 5 segundos y no hemos culminado el port knocking entonces simplemente será como si la secuencia no hubiese sido válida.
- Cuarto, command no necesita de mucha explicación. Este será simplemente el comando que el servidor ejecutará cuando detecte la combinación antes definida. El comando que está puesto por defecto lo que hace es abrir el puerto 22 (cambien este puerto por el de su SSH) solo a la IP que efectuó la combinación correcta de puertos.
- Quinto, tcpflags = syn con esta línea especificamos el tipo de paquetes que reconocerá el servidor como válidos para el port knocking.
- Segundo, en la sección [openSSH] es donde obviamente irán las instrucciones para abrir SSH, primeramente tenemos la secuencia de puertos (la combinación secreta) que está configurada por defecto (puerto 7000, puerto 8000 y finalmente puerto 9000). Obviamente los puertos se pueden cambiar (de hecho lo recomiendo) así como no tienen que ser 3 obligatoriamente, pueden ser más o menos, depende de ustedes.
- Tercero, seq_timeout = 5 significa el tiempo que se esperará para que se efectúe la combinación secreta de puertos. Por defecto está puesto 5 segundos, esto significa que una vez empecemos a efectuar el port knocking (o sea, que cuando hagamos un telnet al puerto 7000) tenemos máximo 5 segundos para terminar la secuencia correcta, si pasan 5 segundos y no hemos culminado el port knocking entonces simplemente será como si la secuencia no hubiese sido válida.
- Cuarto, command no necesita de mucha explicación. Este será simplemente el comando que el servidor ejecutará cuando detecte la combinación antes definida. El comando que está puesto por defecto lo que hace es abrir el puerto 22 (cambien este puerto por el de su SSH) solo a la IP que efectuó la combinación correcta de puertos.
- Quinto, tcpflags = syn con esta línea especificamos el tipo de paquetes que reconocerá el servidor como válidos para el port knocking.
Luego está la
sección para cerrar el SSH, que la configuración por defecto no es más
que la misma secuencia de puertos anterior pero en orden contrario.
Aquí les dejo una configuración con algunas modificaciones:¿Cómo iniciar el daemon knockd?
Para iniciarlo primero debemos modificar (como root) el archivo /etc/default/knockd:nano /etc/default/knockd
Ahí cambiamos la línea número 12 que dice: “START_KNOCKD=0” y cambiar ese 0 por un 1, nos quedaría: “START_KNOCKD=1“
Una vez hecho esto ahora simplemente lo iniciamos:service knockd start
Port Knocking con knockd en funcionamiento!
Como pueden ver en la configuración
anterior, si se hace un port knock al puerto 1000, luego al 2000 y
finalmente al 3000 entonces se abrirá el puerto 2222 (mi SSH), pues bien
aquí otro ordenador ejecutando el port knock:
Una vez presione [Enter] en el Knock No.1, en el No.2 y finalmente en el No.3 se abrirá el puerto, aquí les dejo el log:
Como pueden ver al hacer el knock al
puerto 1000 se registró el stage (paso) 1, luego al 2000 será el stage 2
y finalmente al 3 con el 3000, al hacer esto se ejecuta el comando que
le declaré en el .conf y listo.
Luego para cerrar el puerto solo sería hacer un knock al 9000, 8000 y finalmente al 7000, aquí les dejo el log:
Y bueno aquí termina la explicación de uso
Como pueden ver, el Port Knocking es
verdaderamente interesante y útil, pues si bien no queremos simplemente
abrir un puerto luego de determinada combinación de puertos, el comando u
orden que el servidor ejecutará puede variar, o sea… en vez de abrir un
puerto podemos declarar que mate un proceso, detenga un servicio como
apache o mysql, etc … el límite es su imaginación.
El
Port Knocking solo funciona cuando se tiene un servidor físico o cuando
el servidor virtual es tecnología KVM. Si tu VPS (servidor virtual) es
OpenVZ entonces el Port Knocking no creo que te funcione pues no puedes
manipular directamente iptables
Bueno y hasta aquí el artículo… no soy
ni de lejos un experto en esta materia pero quería compartir con ustedes
este tan interesante proceso.
Enlace