Port Knocking: La mejor seguridad que puedes tener en tu ordenador o servidor (ImplementaciĆ³n + ConfiguraciĆ³n)

Golpeo 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

Como podrĆ”n ver en ese archivo ya viene una configuraciĆ³n por defecto:

Ā 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.

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

Y listo, ya estĆ” configurado y funcionando.

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.

Saludos šŸ˜€


Deja tu comentario

Tu direcciĆ³n de correo electrĆ³nico no serĆ” publicada. Los campos obligatorios estĆ”n marcados con *

*

*

  1. Responsable de los datos: Miguel Ɓngel GatĆ³n
  2. Finalidad de los datos: Controlar el SPAM, gestiĆ³n de comentarios.
  3. LegitimaciĆ³n: Tu consentimiento
  4. ComunicaciĆ³n de los datos: No se comunicarĆ”n los datos a terceros salvo por obligaciĆ³n legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu informaciĆ³n.

  1.   ErunamoJAZZ dijo

    Excelente artĆ­culo, estĆ” bastante interesante y no sabĆ­a que existĆ­a… serĆ­a genial que sigas sacando artĆ­culos para sysadmin novatos y eso šŸ˜€

    Saludos y gracias ^_^

    1.    KZKG^Gaara dijo

      Gracias a tĆ­ por comentar.
      SĆ­… es que con los artĆ­culos sobre DNS de fico, no me quiero quedar atrĆ”s LOL!!!

      Nada en serio. Hace varios meses escuchĆ© algo sobre Port Knocking y me llamĆ³ inmediatamente la atenciĆ³n, pero como pensĆ© que iba a ser muy complejo en ese momento no decidĆ­ adentrarme, justo ayer revisando unos paquetes del repo descubrĆ­ knockd y decidĆ­ intentarlo, y aquĆ­ estĆ” el tutorial.

      A mĆ­ siempre me ha gustado poner artĆ­culos tĆ©cnicos, algunos tal vez no sean suficientemente interesantes pero… espero que otros sĆ­ šŸ˜‰

      Saludos

    2.    Mario dijo

      Hola, se que este articulo ya tiene algo de tiempo pero lanzo mi consulta a ver si alguien me la resuelve.
      El caso es que he implementado el port knocking a mi raspberry para intentar mejorar la seguridad cuando me conecto a ella desde fuera de la red local. Para que esto funcione he tenido que abrir el rango de puertos en el router 7000-9990 direccionando hacia la maquina. ĀæEs seguro abrir esos puertos en el router o por el contrario al intentar tener mas seguridad estoy haciendo lo contrario?

      Un saludo y gracias.

  2.   eVeR dijo

    Genial, soy sysadmin hace aƱos y no lo conocƭa.
    Una pregunta… ĀæcĆ³mo hacĆ©s los Ā«knocksĀ»?
    ĀæEjecutĆ”s telnet contra esos puertos? ĀæQue te responde el telnet? ĀæO hay algĆŗn comando onda Ā«knockĀ»?
    Genial genial es artĆ­culo. Espectacular. Muchas gracias

    1.    KZKG^Gaara dijo

      Hice la prueba con telnet y funcionĆ³ de maravillas todo… pero, curiosamente sĆ­ hay un comando ‘knock’, haz un man knock para que veas šŸ˜‰

      El telnet no me responde en realidad nada, iptables con la polĆ­tica DROP hace que no responda nada y el telnet se quede ahĆ­ esperando por alguna respuesta (que nunca llegarĆ”), pero el daemon knockd sĆ­ reconocerĆ” el knock aunque nadie lo responda šŸ˜€

      Muchas gracias a tĆ­ por tu comentario, es un placer saber que aĆŗn mis artĆ­culos gustan ^_^

  3.   st0rmt4il dijo

    Agregado a Favoritos! :D!

    Gracias!

    1.    KZKG^Gaara dijo

      Thanks šŸ˜€

  4.   dhunter dijo

    Ahh seguridad, esa sensaciĆ³n agradable de cuando aseguramos la pc a plomo, y entonces dĆ­as/semanas mĆ”s tarde tratando de conectarnos desde algĆŗn lugar remoto no podemos acceder porque el firewall estĆ” en modo Ā«no hay pa nadieĀ», a esto se le llama quedarse fuera del castillo en tĆ©rminos de sysadmins. šŸ˜‰

    Por eso este post es tan Ćŗtil, con el knockd puedes acceder desde cualquier lugar que pueda enviar un paquete a tu red local, y los atacantes pierden el interĆ©s al ver que el puerto ssh estĆ” cerrado, no creo que se lancen a hacer knock a fuerza bruta para abrir el puerto.

  5.   Manuel dijo

    Oye, estĆ” genial el artĆ­culo.

    Una cosa: ĀæSirve para conectar desde fuera de la red local?

    Lo digo porque tengo el router con los puertos cerrados menos el que corresponde al ssh que estĆ” redirigido hacia el servidor.

    Imagino que para que funcione desde fuera de la red local habrĆ” que abrir los puertos del router correspondientes al Port Knocking y hacer que estos se redirigan tambien al server.

    Mmm…

    No sƩ hasta que punto es seguro hacer esto.

    ĀæQuĆ© opinan?

    1.    KZKG^Gaara dijo

      No estoy muy seguro, no he hecho la prueba pero creo que sĆ­, que deberĆ­as abrir puertos en el router pues de lo contrario no podrĆ­as llegar a hacer los knocks en el servidor.

      Haz la prueba sin abrir puertos en el router, si no te funciona es una pena, pues estoy de acuerdo contigo, no es aconsejable abrir estos puertos en el router.

      1.    Manuel dijo

        Efectivamente, hay que abrir los puertos y redireccionarlos hacia al equipo al que estamos llamando.

        LƔstima.

  6.   Rabba08 dijo

    Buenisimo muchas gracias! recien empiezo a estudiar la carrera de redes y estos tutos me vienen de maravilla! gracias por tomarse el tiempo de compartir el conocimiento

    1.    KZKG^Gaara dijo

      Yo he aprendido muchĆ­simo a lo largo de los aƱos con la comunidad de Linux global… desde hace unos aƱos he querido aportar yo tambiĆ©n, precisamente por eso escribo šŸ˜€

  7.   janus981 dijo

    Muchisimas gracias, no sabes como me ayuda, estoy por montar un servidor y esto me va de lujo.

    Saludos

    1.    KZKG^Gaara dijo

      Para eso estamos, para ayudar šŸ˜‰

  8.   Jean Ventura dijo

    Excelente articulo! No tenia conocimiento de esto y me sirve bastante (Estoy utilizando RackSpace que usa KVM, por lo que me cae como anillo al dedo!). Adicionado a favorito.

    1.    KZKG^Gaara dijo

      Gracias por comentar šŸ™‚

  9.   Algabe dijo

    Como siempre DesdeLinux nos trae excelentes post con tutoriales que son realmente utiles para poner en acciĆ³n, gracias por compartir!! šŸ™‚

    1.    KZKG^Gaara dijo

      Gracias por tu comentario šŸ™‚
      SĆ­, siempre intentamos satisfacer esa sed de conocimiento que tienen nuestros lectores šŸ˜€

  10.   Timbleck dijo

    InteresantĆ­simo, no conocĆ­a la opciĆ³n.
    Pasa directamente a engordar mi biblioteca de chuletas.
    Gracias!

    1.    KZKG^Gaara dijo

      Un gusto para mĆ­ šŸ˜€
      Saludos

  11.   Federico. A. ValdĆ©s Toujague dijo

    Saludos KZKG^Gaara!!! Apretaste. Tremendo artƭculo para asegurar servidores. Ni @%*&^ idea de que existe algo asƭ. Ya lo probarƩ. Gracias

  12.   White^collar dijo

    esto esta genial…. ^-^

  13.   AprendeLinux dijo

    Hola, podrĆ­as explicarme como instalarlo en CentOS 5.x??

    Yo he descargado el rpm:
    http://pkgs.repoforge.org/knock/knock-0.5-3.el5.rf.x86_64.rpm

    Instalado:
    rpm -i knock-0.5-3.el5.rf.x86_64.rpm

    Configure el archivo de configuracion con 15 segundos de tiempo y el puerto que uso para conectar por ssh a mi vps

    Comenze el demonio:
    /usr/sbin/knockd &

    Hago el telnet y nada el puerto no se cierra, por defecto el puerto esta abierto, pero no se cierra.

    Algo estoy haciendo mal?

  14.   hola dijo

    Mmmm, las peticiones de telnet a esos puertos podrian ser aprendidas por el admin de nuestra red local, o po rnuestro proveedor de servicios no?, igual bloquearia a gente externa pero a ellos no, osea si ellos quieres activar nuestro puerto lo podrian hacer porque ven las peticiones que hacemos, mmm digamos que protege pero no al 100%

    1.    Roberto dijo

      PodrĆ­a ser, pero no creo que se vallan a imaginar que determinados telnet ejecutan X acciĆ³n. A no ser que vean que se siguen los mismos patrones en los telnet.

  15.   Pablo Andres Diaz Aramburo dijo

    Interesante el artĆ­culo, me surge una duda. Creo que existe un error en la imagen del archivo de configuraciĆ³n, pues si analisas bien, en ambas lineas del command estĆ”s usando ACCEPT en Iptables. Pienso que uno debe ser ACCEPT y otro debe ser REJECT.

    Por lo demƔs, excelente iniciativa. Muchas gracias por tomarte tu tiempo en explicar a otros tus conocimientos.

    Saludos