Cómo usar Port Knocking en Linux (y por qué no debería hacerlo)
Publicado: 2022-01-29La activación de puertos es una forma de proteger un servidor cerrando los puertos del cortafuegos, incluso aquellos que sabe que se utilizarán. Esos puertos se abren a pedido si, y solo si, la solicitud de conexión proporciona el toque secreto.
Tocar el puerto es un "toque secreto"
En la década de 1920, cuando la prohibición estaba en pleno apogeo, si querías entrar en un bar clandestino, tenías que conocer el golpe secreto y golpearlo correctamente para entrar.
El golpe de puerto es un equivalente moderno. Si desea que las personas tengan acceso a los servicios en su computadora pero no desea abrir su firewall a Internet, puede usar la activación de puertos. Le permite cerrar los puertos en su firewall que permiten conexiones entrantes y hacer que se abran automáticamente cuando se realiza un patrón preestablecido de intentos de conexión. La secuencia de intentos de conexión actúa como el golpe secreto. Otro golpe secreto cierra el puerto.
Tocar puertos es una novedad, pero es importante saber que es un ejemplo de seguridad a través de la oscuridad, y ese concepto es fundamentalmente defectuoso. El secreto de cómo acceder a un sistema es seguro porque solo lo conocen los miembros de un grupo específico. Pero una vez que se revela ese secreto, ya sea porque se reveló, se observó, se adivinó o se resolvió, su seguridad queda anulada. Es mejor que asegure su servidor de otras formas más sólidas, como requerir inicios de sesión basados en claves para un servidor SSH.
Los enfoques más sólidos de la ciberseguridad son de varias capas, por lo que quizás la activación de puertos debería ser una de esas capas. Cuantas más capas, mejor, ¿verdad? Sin embargo, se podría argumentar que la activación de puertos no agrega mucho (si es que agrega algo) a un sistema seguro y reforzado correctamente.
La seguridad cibernética es un tema amplio y complicado, pero no debe usar la activación de puertos como su única forma de defensa.
RELACIONADO: Cómo crear e instalar claves SSH desde el shell de Linux
Instalando knockd
Para demostrar la activación de puertos, la usaremos para controlar el puerto 22, que es el puerto SSH. Usaremos una herramienta llamada knockd. Use apt-get
para instalar este paquete en su sistema si usa Ubuntu u otra distribución basada en Debian. En otras distribuciones de Linux, utilice la herramienta de administración de paquetes de su distribución de Linux.
Escribe lo siguiente:
sudo apt-get install knockd
Probablemente ya tenga instalado el firewall de iptables en su sistema, pero es posible que necesite instalar el paquete iptables-persistent
. Maneja la carga automática de reglas iptable
guardadas.
Escriba lo siguiente para instalarlo:
sudo apt-get install iptables-persistente
Cuando aparezca la pantalla de configuración de IPV4, presione la barra espaciadora para aceptar la opción "Sí".
Presione la barra espaciadora nuevamente en la pantalla de configuración de IPv6 para aceptar la opción "Sí" y continuar.
El siguiente comando le dice a iptables
que permita que continúen las conexiones establecidas y en curso. Ahora emitiremos otro comando para cerrar el puerto SSH.
Si alguien está conectado por SSH cuando emitimos este comando, no queremos que se corte:
sudo iptables -A INPUT -m conntrack --ctstate ESTABLECIDO, RELACIONADO -j ACEPTAR
Este comando agrega una regla al firewall, que dice:
- -A : agregue la regla a la tabla de reglas de firewall. Es decir, añádelo al fondo.
- INPUT : Esta es una regla sobre las conexiones entrantes.
- -m conntrack : las reglas de firewall actúan sobre el tráfico de red (paquetes) que coinciden con los criterios de la regla. El parámetro
-m
hace queiptables
use módulos adicionales de coincidencia de paquetes; en este caso, el llamadoconntrack
funciona con las capacidades de seguimiento de conexión de red del kernel. - –cstate ESTABLECIDO, RELACIONADO : Esto especifica el tipo de conexión a la que se aplicará la regla, es decir, conexiones ESTABLECIDAS y RELACIONADAS. Una conexión establecida es aquella que ya está en curso. Una conexión relacionada es aquella que se realiza debido a una acción de una conexión establecida. Quizás alguien que esté conectado quiera descargar un archivo; eso podría suceder a través de una nueva conexión iniciada por el host.
- -j ACEPTAR : si el tráfico coincide con la regla, salte al objetivo ACEPTAR en el firewall. En otras palabras, el tráfico se acepta y se le permite pasar a través del firewall.
Ahora podemos emitir el comando para cerrar el puerto:
sudo iptables -A ENTRADA -p tcp --dport 22 -j RECHAZAR
Este comando agrega una regla al firewall, que dice:
- -A : agregue la regla a la tabla de reglas de firewall, es decir, agréguela al final.
- INPUT : esta regla se refiere a las conexiones entrantes.
- -p tcp : esta regla se aplica al tráfico que utiliza el Protocolo de control de transmisión.
- –dport 22 : esta regla se aplica específicamente al tráfico TCP que se dirige al puerto 22 (el puerto SSH).
- -j RECHAZAR : si el tráfico coincide con la regla, salte al objetivo RECHAZAR en el firewall. Por lo tanto, si se rechaza el tráfico, no se permite a través del firewall.
Debemos iniciar el demonio netfilter-persistent
. Podemos hacerlo con este comando:
sudo systemctl start netfilter-persistente
Queremos que netfilter-persistent
pase por un ciclo de guardar y recargar, para que cargue y controle las reglas de iptable
.
Escriba los siguientes comandos:
sudo netfilter-persistent guardar
sudo netfilter-recarga persistente
Ahora ha instalado las utilidades y el puerto SSH está cerrado (con suerte, sin terminar la conexión de nadie). Ahora, es el momento de configurar el golpe secreto.
Configurando knockd
Hay dos archivos que editas para configurar knockd
. El primero es el siguiente archivo de configuración de knockd
:
sudo gedit /etc/knockd.conf
El editor de gedit
se abre con el archivo de configuración de knockd
cargado.
Editaremos este archivo para adaptarlo a nuestras necesidades. Las secciones que nos interesan son "openSSH" y "closeSSH". Las siguientes cuatro entradas están en cada sección:
- secuencia : la secuencia de puertos a los que alguien debe acceder para abrir o cerrar el puerto 22. Los puertos predeterminados son 7000, 8000 y 9000 para abrirlo, y 9000, 8000 y 7000 para cerrarlo. Puede cambiarlos o agregar más puertos a la lista. Para nuestros propósitos, nos quedaremos con los valores predeterminados.
- seq_timeout : el período de tiempo dentro del cual alguien tiene que acceder a los puertos para activar su apertura o cierre.
- comando : el comando enviado al firewall de
iptables
cuando se activa la acción de abrir o cerrar. Estos comandos agregan una regla al firewall (para abrir el puerto) o la eliminan (para cerrar el puerto). - tcpflags : el tipo de paquete que cada puerto debe recibir en la secuencia secreta. Un paquete SYN (sincronización) es el primero en una solicitud de conexión TCP, denominada protocolo de enlace de tres vías.
La sección "openSSH" se puede leer como "se debe realizar una solicitud de conexión TCP a los puertos 7000, 8000 y 9000, en ese orden y dentro de los 5 segundos, para que el comando para abrir el puerto 22 se envíe al firewall".
La sección "closeSSH" se puede leer como "se debe realizar una solicitud de conexión TCP a los puertos 9000, 8000 y 7000, en ese orden y dentro de los 5 segundos, para que el comando para cerrar el puerto 22 se envíe al firewall".
Las reglas del cortafuegos
Las entradas de "comando" en las secciones openSSH y closeSSH siguen siendo las mismas, excepto por un parámetro. Así es como están compuestos:
- -A : agregue la regla al final de la lista de reglas de firewall (para el comando openSSH).
- -D : elimine el comando de la lista de reglas del firewall (para el comando closeSSH).
- ENTRADA : esta regla se refiere al tráfico de red entrante.
- -s %IP% : La dirección IP del dispositivo que solicita una conexión.
- -p : Protocolo de red; en este caso, es TCP.
- –dport : El puerto de destino; en nuestro ejemplo, es el puerto 22.
- -j ACCEPT : salta al objetivo de aceptación dentro del firewall. En otras palabras, deje que el paquete pase por el resto de las reglas sin actuar en consecuencia.
Las ediciones del archivo de configuración de knockd
Las ediciones que haremos en el archivo están resaltadas en rojo a continuación:
Extendemos el “seq_timeout” a 15 segundos. Esto es generoso, pero si alguien activa manualmente las solicitudes de conexión, es posible que necesite tanto tiempo.
En la sección "openSSH", cambiamos la opción -A
(agregar) en el comando a -I
(insertar). Este comando inserta una nueva regla de firewall en la parte superior de la lista de reglas de firewall. Si deja la opción -A
, agrega la lista de reglas de firewall y la coloca en la parte inferior .
El tráfico entrante se prueba con cada regla de firewall en la lista de arriba hacia abajo. Ya tenemos una regla que cierra el puerto 22. Entonces, si el tráfico entrante se prueba contra esa regla antes de que vea la regla que permite el tráfico, se rechaza la conexión; si ve esta nueva regla primero, se permite la conexión.
El comando de cierre elimina la regla agregada por openSSH de las reglas del firewall. Una vez más, el tráfico SSH se maneja mediante la regla preexistente "el puerto 22 está cerrado".
Después de realizar estas ediciones, guarde el archivo de configuración.
RELACIONADO: Cómo editar archivos de texto gráficamente en Linux con gedit
Las ediciones del archivo de control knockd
El archivo de control de knockd
es mucho más simple. Sin embargo, antes de sumergirnos y editar eso, necesitamos saber el nombre interno de nuestra conexión de red; para encontrarlo, escriba este comando:
dirección IP
La conexión que utiliza esta máquina para investigar este artículo se llama enp0s3
. Tome nota del nombre de su conexión.
El siguiente comando edita el archivo de control knockd
:
sudo gedit /etc/default/knockd
Aquí está el archivo knockd
en gedit
.
Las pocas ediciones que necesitamos hacer están resaltadas en rojo:
Cambiamos la entrada “START_KNOCKD=” de 0 a 1.
También eliminamos el #
hash del inicio de la entrada “KNOCKD_OPTS=” y reemplazamos “eth1” con el nombre de nuestra conexión de red, enp0s3
. Por supuesto, si su conexión de red es eth1
, no la cambiará.
La prueba está en el pudín
Es hora de ver si esto funciona. Iniciaremos el demonio knockd
con este comando:
sudo systemctrl iniciar knockd
Ahora, saltaremos a otra máquina e intentaremos conectarnos. También instalamos la herramienta knockd
en esa computadora, no porque queramos configurar la eliminación de puertos, sino porque el paquete knockd
proporciona otra herramienta llamada knock
. Usaremos esta máquina para disparar en nuestra secuencia secreta y llamar a la puerta por nosotros.
Use el siguiente comando para enviar su secuencia secreta de solicitudes de conexión a los puertos en la computadora host que golpea el puerto con la dirección IP 192.168.4.24:
llamar 192.168.4.24 7000 8000 9000 -d 500
Esto le dice a knock
que apunte a la computadora en la dirección IP 192.168.4.24 y envíe una solicitud de conexión a los puertos 7000, 8000 y 9000, a su vez, con una -d
(retraso) de 500 milisegundos entre ellos.
Un usuario llamado “dave” realiza una solicitud SSH al 192.168.4.24:
ssh [email protected]
Se acepta su conexión, ingresa su contraseña y comienza su sesión remota. Su símbolo del sistema cambia de dave@nostromo
a dave@howtogeek
. Para cerrar sesión en la computadora remota, escribe:
Salida
Su símbolo del sistema regresa a su computadora local. Utiliza knock
una vez más, y esta vez apunta a los puertos en orden inverso para cerrar el puerto SSH en la computadora remota.
llamar 192.168.4.24 9000 8000 7000 -d 500
Es cierto que esta no fue una sesión remota particularmente fructífera, pero demuestra la apertura y el cierre del puerto a través de la activación del puerto y cabe en una sola captura de pantalla.
Entonces, ¿cómo se veía esto desde el otro lado? El administrador del sistema en el host de activación de puertos utiliza el siguiente comando para ver las nuevas entradas que llegan al registro del sistema:
cola -f /var/log/syslog
- Verá tres entradas openSSH. Estos se generan a medida que cada puerto es el objetivo de la utilidad de llamada remota.
- Cuando se cumplen las tres etapas de la secuencia de activación, se registra una entrada que dice "SÉSAMO ABIERTO".
- Se envía el comando para insertar la regla en la lista de reglas de
iptables
. Permite el acceso a través de SSH en el puerto 22 desde la dirección IP específica de la PC que dio el toque secreto correcto (192.168.4.23). - El usuario “dave” se conecta solo por unos segundos y luego se desconecta.
- Verá tres entradas closeSSH. Estos se generan a medida que cada puerto es el objetivo de la utilidad de llamada remota: le dice al host que golpea el puerto que cierre el puerto 22.
- Después de que se activan las tres etapas, recibimos el mensaje "OPEN SESAME" nuevamente. El comando se envía al cortafuegos para eliminar la regla. (¿Por qué no “CLOSE SESAME” cuando está cerrando el puerto? ¿Quién sabe?)
Ahora, la única regla en la lista de reglas de iptables
con respecto al puerto 22 es la que escribimos al principio para cerrar ese puerto. Entonces, el puerto 22 ahora está cerrado nuevamente.
Golpéalo en la cabeza
Ese es el truco de salón del golpe de puerto. Trátalo como una distracción y no lo hagas en el mundo real. O, si es necesario, no confíe en él como su única forma de seguridad.