La activación de puertos es un método de apertura dinámica de puertos de red al "golpear" (es decir, conectar) en una secuencia predefinida de puertos. Esto es especialmente útil para ocultar un puerto de red abierto del escaneo de puertos, ya que el puerto en cuestión se cerrará a menos que se ejecute la secuencia de activación de puertos. Una secuencia de activación de puertos lo suficientemente larga es prácticamente imposible para la fuerza bruta:por ejemplo, para adivinar con éxito (mediante la fuerza bruta) una combinación de 3 puertos TCP, un atacante tendría que intentar tocar cada una de las 281 billones de combinaciones posibles y buscar abra los puertos después de cada secuencia de golpeteo de puertos. Como probablemente puedas imaginar, esto llevaría mucho, mucho tiempo.
Esta guía lo ayudará con la instalación de knockd, un daemon flexible para golpear puertos, en Debian 10. Para fines de demostración, lo configuraremos para ocultar el puerto SSH, aunque cualquier otro puerto/servicio puede protegerse con este enfoque.
Requisitos
- Un servidor que ejecuta Debian 10.
- Acceso raíz a su servidor.
- Debe establecerse la variable de entorno $EDITOR.
- Un segundo sistema para realizar pruebas.
NOTA:Si tiene la intención de usar el bloqueo de puertos para ocultar el puerto SSH, asegúrese de tener un método de acceso alternativo (a través de la consola, por ejemplo), que será útil si se bloquea accidentalmente.
Antes de instalar knockd, verifique el nombre de la interfaz de red pública de su sistema con el siguiente comando:
ip link show | grep -v lo
2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
Tome nota del nombre de la interfaz (ens18 en este caso). Será necesario más adelante.
Paso 1:Instalación de Knockd
knockd es un demonio que golpea puertos que escucha las conexiones y abre los puertos en consecuencia. Usaremos knockd con reglas de iptables para implementar la activación de puertos. Instale los paquetes necesarios de la siguiente manera:
apt update apt install knockd iptables-persistent
Paso 2:Configuración de Knockd
Knockd emplea un único archivo de configuración, /etc/knockd.conf, para definir secuencias de golpeteo y otros parámetros. Hay dos modos prácticos de funcionamiento. El primero requiere una sola secuencia de golpeteo para abrir y cerrar el puerto predefinido, mientras que el otro usa secuencias de apertura y cierre separadas. Usaremos el primero ya que requiere menos interacción del usuario.
Primero, haga una copia de seguridad del archivo de configuración existente:
mv /etc/knockd.conf /etc/knockd.conf.bak
Segundo, abra el archivo de configuración en su editor de texto:
$EDITOR /etc/knockd.conf
E ingrese la configuración que se muestra a continuación:
(reemplace ens18 con el nombre de su interfaz de red).
[options] UseSyslog Interface = ens18 [SSH] sequence = 1000,2000,3000 seq_timeout = 15 tcpflags = syn start_command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT stop_command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT cmd_timeout = 20
Esto le indicará a knockd que habilite el tráfico al puerto 22 después de recibir la secuencia de toque correcta (1000, 2000, 3000 en este caso), luego vuelva a deshabilitar el tráfico después de una demora de 20 segundos. Por lo tanto, las conexiones SSH solo se aceptarán durante esta ventana de 20 segundos.
A continuación, habilite knockd editando el archivo /etc/default/knockd:
$EDITOR /etc/default/knockd
Y establezca START_KNOCKD en 1:
START_KNOCKD=1
Guarda el archivo y cierra. También modificaremos la unidad systemd para knockd. Para hacerlo, cree un nuevo archivo de unidad para anular el predeterminado:
$EDITOR /etc/systemd/system/knockd.service
Y pega lo siguiente:
[Unit] Description=Port-Knock Daemon After=network.target Requires=network.target Documentation=man:knockd(1) [Service] EnvironmentFile=-/etc/default/knockd ExecStartPre=/usr/bin/sleep 1 ExecStart=/usr/sbin/knockd $KNOCKD_OPTS ExecReload=/bin/kill -HUP $MAINPID KillMode=mixed Restart=always SuccessExitStatus=0 2 15 ProtectSystem=full CapabilityBoundingSet=CAP_NET_RAW CAP_NET_ADMIN [Install] WantedBy=multi-user.target
Luego use el siguiente comando para cargar y habilitar la nueva unidad:
systemctl daemon-reload systemctl enable --now knockd.service
Paso 3:Reglas de cortafuegos
En este punto, Knockd está listo, pero todo el tráfico está habilitado a través del firewall de manera predeterminada. Crearemos reglas de firewall para denegar el acceso al puerto 22/tcp.
Los siguientes comandos aseguran que las conexiones existentes no se interrumpan.
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Las siguientes son reglas para desconectar conexiones al puerto 22/tcp:
iptables -A INPUT -p tcp --destination-port 22 -j DROP ip6tables -A INPUT -p tcp --destination-port 22 -j DROP
Luego, guarde las cadenas de reglas actuales para la persistencia en los reinicios:
iptables-save > /etc/iptables/rules.v4 ip6tables-save > /etc/iptables/rules.v6
Paso 4:Prueba
Desde un sistema diferente, intente iniciar una nueva sesión SSH en su servidor. No deberías poder conectarte. Para realizar la secuencia de toques, se pueden usar diferentes herramientas, aunque haremos una demostración con knock, el cliente de toques incluido con Knockd. Instale el paquete knockd como se muestra en el Paso 1 en un sistema diferente, luego ejecute los comandos:
knock server_ip_address 1000 2000 3000 ssh [email protected]_ip_address
La conexión SSH ahora debería tener éxito.
Configuración alternativa
Knockd se puede configurar alternativamente para requerir dos secuencias distintas para abrir y cerrar puertos de red. Esto es útil si desea mantener los puertos abiertos durante largos períodos de tiempo. Para configurar Knockd de la manera, abra su archivo de configuración:
$EDITOR /etc/knockd.conf
Y reemplace la configuración existente con lo siguiente:
[options] UseSyslog Interface = your_interface [openSSH] sequence = 1000,2000,3000 seq_timeout = 15 tcpflags = syn start_command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT [closeSSH] sequence = 3000,2000,1000 seq_timeout = 15 tcpflags = syn start_command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
Luego reinicie el servicio para cargar la nueva configuración:
systemctl restart knockd.service
Conclusión
Knockd puede ser una solución efectiva para los ataques de fuerza bruta, que son muy comunes en SSH y otros servicios. Aunque systemd reiniciará Knockd si falla, siempre debe tener un método de copia de seguridad para acceder a su servidor si utiliza la activación de puertos para ocultar el puerto SSH.