¿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.
- #!/bin/bash
- ##SCRIPT DE PORT KNOCKING##
- #VARIABLES
- PUERTO1=10000
- PUERTO2=15000
- PUERTO3=20000
- PUERTOSSH=22
- SEGUNDOS=30000
- #Reglas de PortKnocking basado en tres puertos (10000, 15000, 20000)
- # Puerto 22 por defecto esta establecido a DROP
- iptables -A INPUT -p tcp --dport 22 -j DROP
- # Creación del segundo Knock
- iptables -N IN-KNOCK2
- iptables -A IN-KNOCK2 -m recent --name KNOCK1 --remove
- iptables -A IN-KNOCK2 -m recent --name KNOCK2 --set
- # Creación del tercer knock
- iptables -N IN-KNOCK3
- iptables -A IN-KNOCK3 -m recent --name KNOCK2 --remove
- iptables -A IN-KNOCK3 -m recent --name KNOCK3 --set
- # El mas sencillo, el primer KNOCK
- iptables -A INPUT -m recent --update --name KNOCK1
- # Que hacer en caso de cada knock
- iptables -A INPUT -p tcp --dport ${PUERTO1} -m recent --set --name KNOCK1
- iptables -A INPUT -p tcp --dport ${PUERTO2} -m recent --rcheck --name KNOCK1 -j IN-KNOCK2
- iptables -A INPUT -p tcp --dport ${PUERTO3} -m recent --rcheck --name KNOCK2 -j IN-KNOCK3
- # Finalmente abrimos el puerto para quien haya realizado la secuencia correcta
- 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