Información blog

Linux, tutoriales, noticias, sistemas, redes y seguridad informática, entre otras cosas.

viernes, 6 de marzo de 2015

Port knocking Linux

¿Alguna vez habéis pensado dificultar un poco el acceso al puerto SSH del servidor? ¿Algo cómo por ejemplo que se tengan que cumplir una serie de condiciones para abrir la "puerta" de acceso SSH? El port knocking puede ayudaros a cumplir dicho objetivo. Port knocking se basa en "tocar" algunos puertos (que obviamente están cerrados) en el orden correcto para abrir el paso por un puerto que antes estaba cerrado. Algo así cómo tocar la puerta en una secuencia determinada para que te abran ésta. 


Obviamente la puerta no quedaría abierta indefinidamente ya que en caso contrario con acertar una vez dicho puerto quedaría abierto para siempre. A continuación he puesto un script de ejemplo que explica el funcionamiento de dicho concepto. Dicho script es plenamente funcional y no habría problema alguno si se usase tal y cómo está (a menos que se quieran cambiar los puertos claro está). En este caso he hecho que se necesite una combinación de 3 "toques" para lograr tener acceso al puerto SSH.

Dicho método de protección no es perfecto y no debe de ser la base de la seguridad de un servidor, sino que debe de consistir una capa de protección extra a las medidas de seguridad ya implantadas; aún así, si que es recomendable implantarlo cómo medida de seguridad adicional para evitar los ataques aleatorios a servidores SSH que tanto se realizan hoy en día.


  1. #!/bin/bash
  2. ##SCRIPT DE PORT KNOCKING##
  3. #VARIABLES
  4. PUERTO1=10000
  5. PUERTO2=15000
  6. PUERTO3=20000
  7. PUERTOSSH=22
  8. SEGUNDOS=30000
  9. #Reglas de PortKnocking basado en tres puertos (10000, 15000, 20000)
  10. # Puerto 22 por defecto esta establecido a DROP
  11. iptables -A INPUT -p tcp --dport 22 -j DROP
  12. # Creación del segundo Knock
  13. iptables -N IN-KNOCK2
  14. iptables -A IN-KNOCK2 -m recent --name KNOCK1 --remove
  15. iptables -A IN-KNOCK2 -m recent --name KNOCK2 --set
  16. # Creación del tercer knock
  17. iptables -N IN-KNOCK3
  18. iptables -A IN-KNOCK3 -m recent --name KNOCK2 --remove
  19. iptables -A IN-KNOCK3 -m recent --name KNOCK3 --set
  20. # El mas sencillo, el primer KNOCK
  21. iptables -A INPUT -m recent --update --name KNOCK1
  22. # Que hacer en caso de cada knock
  23. iptables -A INPUT -p tcp --dport ${PUERTO1} -m recent --set --name KNOCK1
  24. iptables -A INPUT -p tcp --dport ${PUERTO2} -m recent --rcheck --name KNOCK1 -j IN-KNOCK2
  25. iptables -A INPUT -p tcp --dport ${PUERTO3} -m recent --rcheck --name KNOCK2 -j IN-KNOCK3
  26. # Finalmente abrimos el puerto para quien haya realizado la secuencia correcta
  27. iptables -A INPUT -p tcp --dport ${PUERTOSSH} -m recent --rcheck --seconds ${SEGUNDOS} --name KNOCK3-j ACCEPT

En este caso, para lograr acceder al puerto 22 habría que "tocar" primero el puerto 10000, a continuación el 15000, y por último el 20000; Dichos toques habría que hacerlos en el orden correcto y sin equivocarse en la secuencia; Con lo que por ejemplo se tocase el 10000, luego el 12000 y luego se tocasen correctamente los dos siguientes puertos, no se conseguiría tener acceso. En este caso en concreto el acceso estaría abierto durante 30000 segundos, pero es un valor perfectamente modificable.

Espero que os sea útil y que le podáis sacar partido a dicho concepto.

Saludos cordiales.

No hay comentarios :

Publicar un comentario