💾 Archived View for sl1200.dystopic.world › art › knockd.gmi captured on 2023-05-24 at 18:01:34. Gemini links have been rewritten to link to archived content
⬅️ Previous capture (2023-01-29)
-=-=-=-=-=-=-
2022-05-01
#knocking #knock #knockd #ssh #seguridad #vps #linux
Con Port Knocking ,(golpeteo de puertos), podremos ocultar cual es nuestro puerto ssh frente a un atacante que escanee los puertos de tu servidor. El software más empleado que he visto en otros tutoriales es knockd. Teniendo el puerto ssh cerrado y el demonio de knockd escuchando en tu servidor, si desde tu pc ejecutas una secuencia preconfigurada de intentos de conexión a diferentes puertos de tu servidor, entonces knockd abrirá el puerto ssh, sólo para tu IP. Después podrás acceder a tu servidor y si quieres, desde otro terminal, cerrar de nuevo el puerto ssh. Tu sesión se mantendrá abierta hasta que salgas. Port knocking supone añadir una capa más de seguridad que imposibilite el acceso a tu servidor por ssh incluso si te han sustraido tu usuario y password o tu par de claves público/privada y también evita un ataque por fuerza bruta al ssh porque está cerrado.
Toda la instalación y configuración la haremos como root
Instalar:
apt-get install knockd
Deberás instalarlo tanto en el servidor como en tu pc.
Deberemos modificar los archivos /etc/knockd.conf y /etc/default/knockd
[options] UseSyslog [openSSH] sequence = 7000,8000,9000 seq_timeout = 5 command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT tcpflags = syn [closeSSH] sequence = 9000,8000,7000 seq_timeout = 5 command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT tcpflags = syn
"UseSyslog" simplemente indica el archivo de logs, puedes poner la ruta que quieras, yo lo he dejado por defecto. Para ver en directo el proceso de golpeteo y apertura del puerto ssh puedes usar este comando desde otro terminal con el que ya estés en tu servidor, es gracioso porque salen los golpeteos y un mensaje final de "OPEN SESAME". 😀
tail -f /var/log/syslog
"sequence" indica la secuencia de puertos a los que knock intenta acceder y tras la cual el demonio knockd abrirá el puerto ssh, puedes poner tantos puertos como quieras y en el orden que desees.
"seq_timeout" es la ventana temporal que tendrás para realizar la secuencia de "golpeteos" a los puertos que has configurado. Vale la pena ampliarla, si la conexión es mala y configuras muchos puertos puede que 5 segundos se queden cortos. Yo he puesto 15 segundos.
"command" es el comando de iptables que se ejecutará para abrir o cerrar el puerto ssh. Aquí hay que ir con cuidado porque las iptables son secuenciales, si pones el comando por defecto, añadirá al final de las iptables una nueva regla. En mi caso tengo una serie de reglas para abrir los puertos que necesito y una último regla que indica que todo lo demás quede cerrado. Si knockd añade una regla para abrir el puerto ssh, el puerto no se abrirá porque la regla precedente ha indicado que se cierre. Así que en lugar de añadir deberemos insertar. En mi caso inserto la regla de apertura del ssh en primer lugar. La línea "command" dentro de [openSSH] queda asi:
command = /sbin/iptables -I INPUT 1 -s %IP% -p tcp --dport 22 -j ACCEPT
Recuerda sustituir el 22 por el número de tu puerto ssh en las dos líneas en que aparece.
"tcpflags" aquí no he tocado nada
# control if we start knockd at init or not # 1 = start # anything else = don't start # PLEASE EDIT /etc/knockd.conf BEFORE ENABLING START_KNOCKD=1 # command line options KNOCKD_OPTS="-i eth0"
eth0 es la interfaz de red, para comprobar el nombre de la tuya usa el comando "ip addr", te dará un pequeño listado, mira en el punto 2 si indica eth0, eth1 o lo que sea y ponlo en el archivo /etc/default/knockd
En mi caso, para evitar que mi configuración de iptables, fail2ban y knockd acaben por error bloqueándome el acceso a mi propio servidor, he prescindido de que iptables y knock arranquen en el inicio, así que no he instalado iptables-persistent y no he habilitado knock en el inicio. Cada vez que reinicio el servidor simplemente inicio manualmente knockd y activo mis iptables que tengo como un alias en el archivo .bashrc. Si por algún error con la password fail2ban me ha bloqueado a mi mismo o knock no me deja abrir el puerto ssh, simplemente al reiniciar el servidor habrá desaparecido el problema.
En este punto yo tendría dos terminalea abiertos y con sesión iniciada en tu servidor, por si acaso.
Iniciamos knockd:
systemctl start knockd
Comprobamos que está funcionando
systemctl status knockd
Y ya podemos salir del servidor desde ese terminal.
Ahora que el demonio knockd está escuchando y preparado para añadir reglas iptables para abrir o cerrar el puerto ssh, puedes probar a cerrarlo con este comando:
knock -v IPdetuservidor 9000 8000 7000 -d 500
y para abrirlo:
knock -v IPdetuservidor 7000 8000 9000 -d 500
En lugar de la IP puedes poner tu dominio, en mi caso dystopic.world
-v es para visualizar cada "golpeteo"
-d 500 es para introducir un delay de 500 ms entre cada "golpe". He observado que si no introduces este delay en ocasiones falla, si lo pones funcionará sin problemas.
Para comprobar si efectivamente knock ha abierto o cerrado el puerto puedes usar nmap:
nmap -p puertossh IPservidor
Para facilitar las cosas en muchos comandos que resultan largos vale la pena introducir un alias editando .bashrc, en este caso los míos son:
alias abrir='knock -v dystopic.world 7000 8000 9000 -d 500' alias cerrar='knock -v dystopic.world 9000 8000 7000 -d 500'
Se supone que knockd puede usarse con otros servicios además del ssh, yo no lo he probado.