El golpeo de puertos es una forma de proteger un servidor cerrando los puertos del firewall, incluso aquellos que sabe que se utilizarán. Esos puertos se abren bajo demanda si, y solo si, la solicitud de conexión proporciona el golpe secreto.
¿De qué vamos a hablar?
Port Knocking es un “golpe secreto”
En la década de 1920, cuando prohibición estaba en pleno apogeo, si querías entrar en un taberna clandestina tenías que conocer el golpe secreto y tocarlo correctamente para entrar.
El golpeo de puertos es un equivalente moderno. Si desea que las personas tengan acceso a los servicios de su computadora pero no desea abrir su firewall a Internet, puede usar el golpe de puertos. Le permite cerrar los puertos en su firewall que permiten las conexiones entrantes y abrirlos 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.
El golpeo de puerto 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 aquellos en un grupo específico lo saben. Pero una vez que ese secreto está fuera, ya sea porque se revela, se observa, se adivina o se resuelve, su seguridad es nula. Es mejor que proteja su servidor de otras maneras más sólidas, como requerir inicios de sesión basados en claves para un servidor SSH.
Los enfoques más robustos para la ciberseguridad son de múltiples capas, por lo que, tal vez, el golpeo de puertos debería ser una de esas capas. Cuantas más capas, mejor, ¿verdad? Sin embargo, se podría argumentar que el golpeteo de puertos no agrega mucho (si es que agrega algo) a un sistema adecuadamente endurecido y seguro.
La ciberseguridad es un tema vasto y complicado, pero no debe usar el golpeteo de puertos como su única forma de defensa.
Instalación knockd
Para demostrar el golpeo de puertos, lo usaremos para controlar el puerto 22, que es el puerto SSH. Usaremos una herramienta llamada knockd. Uso apt-get
para instalar este paquete en su sistema si utiliza 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, en su lugar.
Escriba lo siguiente:
sudo apt-get install knockd
Probablemente ya tengas el Firewall iptables instalado en el sistema, pero es posible que deba instalar el iptables-persistent
paquete. Maneja la carga automática de guardados iptable
reglas.
Escriba lo siguiente para instalarlo:
sudo apt-get install iptables-persistent
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 indica iptables
para permitir que continúen las conexiones establecidas y continuas. 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 ESTABLISHED,RELATED -j ACCEPT
Este comando agrega una regla al firewall, que dice:
- -A: Anexe la regla a la tabla de reglas del firewall. Es decir, agréguelo a la parte inferior.
- ENTRADA: 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
-m
causas de parámetrosiptables
para utilizar 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: 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 progreso. Una conexión relacionada es aquella que se realiza debido a una acción de una conexión establecida. Tal vez alguien que está conectado quiere 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, vaya al destino ACCEPT en el firewall. En otras palabras, el tráfico es aceptado y se le permite pasar a través del firewall.
Ahora podemos emitir el comando para cerrar el puerto:
sudo iptables -A INPUT -p tcp --dport 22 -j REJECT
Este comando agrega una regla al firewall, que dice:
- -A: Agregue la regla a la tabla de reglas del firewall, es decir, agréguela a la parte inferior.
- ENTRADA: Esta regla se trata de enconexiones venideros.
- -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, vaya al destino RECHAZAR en el firewall. Por lo tanto, si el tráfico es rechazado, no está permitido a través del firewall.
Debemos iniciar el netfilter-persistent
demonio. Podemos hacerlo con este comando:
sudo systemctl start netfilter-persistent
Queremos netfilter-persistent
para pasar por un ciclo de guardado y recarga, por lo que carga y controla el iptable
reglas.
Escriba los siguientes comandos:
sudo netfilter-persistent save
sudo netfilter-persistent reload
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.
Configuración de knockd
Hay dos archivos que se editan para configurar knockd
. El primero es el siguiente knockd
archivo de configuración:
sudo gedit /etc/knockd.conf
El gedit
El editor se abre con el knockd
archivo de configuración cargado.
Editaremos este archivo para que se adapte a nuestras necesidades. Las secciones que nos interesan son “openSSH” y “closeSSH”. Las siguientes cuatro entradas se encuentran 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 activarlo para abrirlo o cerrarlo.
- mandar: El comando enviado al
iptables
firewall cuando se activa la acción de abrir o cerrar. Estos comandos agregan una regla al firewall (para abrir el puerto) o la sacan (para cerrar el puerto). - tcpflags: El tipo de paquete que cada puerto debe recibir en la secuencia secreta. Un paquete SYN (sincronizar) es el primero de un TCP solicitud de conexión, denominada apretón de manos 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 en 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 en 5 segundos, para que el comando cierre 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 se componen:
- -A: anexe la regla a la parte inferior de la lista de reglas del 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 ACEPTAR: Vaya al destino de aceptación dentro del firewall. En otras palabras, deje que el paquete caiga a través del resto de las reglas sin actuar sobre él.
El archivo de configuración eliminado Edita
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 está disparando manualmente en las solicitudes de conexión, es posible que necesite tanto tiempo.
En la sección “openSSH”, cambiamos el -A
(anexar) en el comando a -I
(insertar). Este comando inserta una nueva regla de firewall en el Arriba de la lista de reglas del cortafuegos. Si dejas el -A
opción, él Anexa la lista de reglas del servidor de seguridad y la coloca en el fondo.
El tráfico entrante se prueba con cada regla de firewall de la lista de arriba hacia abajo. Ya tenemos una regla que cierra el puerto 22. Por lo tanto, si el tráfico entrante se prueba contra esa regla antes de ver 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 close quita la regla agregada por openSSH de las reglas de firewall. El tráfico SSH es manejado una vez más por la regla preexistente de “el puerto 22 está cerrado”.
Después de realizar estas ediciones, guarde el archivo de configuración.
Ediciones del archivo de control golpeado
El knockd
el archivo de control es completamente 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:
ip addr
La conexión que utiliza esta máquina para investigar este artículo se llama enp0s3
. Anote el nombre de su conexión.
El siguiente comando edita el knockd
archivo de control:
sudo gedit /etc/default/knockd
Aquí está el knockd
archivo 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 #
desde el principio de la entrada “KNOCKD_OPTS=”, y reemplazó “eth1” con el nombre de nuestra conexión de red, enp0s3
. Por supuesto, si su conexión de red es eth1
, no lo cambiarás.
La prueba está en el pudín
Es hora de ver si esto funciona. Comenzaremos el knockd
demonio con este comando:
sudo systemctrl start knockd
Ahora, saltaremos a otra máquina e intentaremos conectarnos. Instalamos el knockd
herramienta en esa computadora, también, no porque queramos configurar el golpeo de puertos, sino porque el knockd
El paquete proporciona otra herramienta denominada knock
. Usaremos esta máquina para disparar en nuestra secuencia secreta y hacer el golpe por nosotros.
Utilice el siguiente comando para enviar la secuencia secreta de solicitudes de conexión a los puertos del equipo host que llama al puerto con la dirección IP 192.168.4.24:
knock 192.168.4.24 7000 8000 9000 -d 500
Esto indica knock
para dirigir el equipo a la dirección IP 192.168.4.24 y activar una solicitud de conexión a los puertos 7000, 8000 y 9000, a su vez, con un -d
(retraso) de 500 milisegundos entre ellos.
Un usuario llamado “dave” luego realiza una solicitud SSH a 192.168.4.24:
ssh dave@192.168.4.24
Se acepta su conexión, ingresa su contraseña y comienza su sesión remota. Su símbolo del sistema cambia de dave@nostromo
Para dave@howtogeek
. Para cerrar la sesión del equipo remoto, escribe:
exit
Su símbolo del sistema vuelve a su equipo 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.
knock 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 golpes de 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 knocking de puertos utiliza el siguiente comando para ver las nuevas entradas que llegan al registro del sistema:
tail -f /var/log/syslog
- Verá tres entradas openSSH. Estos se elevan a medida que cada puerto es el objetivo de la utilidad de golpe remoto.
- Cuando se cumplen las tres etapas de la secuencia de activación, una entrada que dice “SÉSAMO ABIERTO,” está registrado
- El comando para insertar la regla en el
iptables
Se envía la lista de reglas. 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 golpe secreto correcto (192.168.4.23). - El usuario “dave” se conecta solo durante unos segundos y luego se desconecta.
- Verá tres entradas closeSSH. Estos se elevan a medida que cada puerto es el objetivo de la utilidad de golpeo remoto: le dice al host de golpeo de 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 firewall para eliminar la regla. (¿Por qué no “CERRAR SÉSAMO” cuando está cerrando el puerto? ¿Quién sabe?)
Ahora la única regla en el iptables
La lista de reglas con respecto al puerto 22 es la que escribimos al principio para cerrar ese puerto. Por lo tanto, el puerto 22 ahora está cerrado nuevamente.
Golpearlo en la cabeza
Ese es el truco de salón de port knocking. Trátalo como una diversión y no lo hagas en el mundo real. O, si es necesario, no confíe en él como su única forma de seguridad.