Cómo usar Port Knocking en Linux (y por qué no debería)

Contenidos

Mano llamando a una puerta cerrada.

La desactivación de puertos es una forma de proteger un servidor cerrando los puertos del firewall, inclusive aquellos que sabe que se utilizarán. Esos puertos se abren a pedido si, y solo si, la solicitud de conexión proporciona el golpe secreto.

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 bar clandestino, tenías que conocer el golpe secreto y tocarlo correctamente para entrar.

El golpe de babor es un semejante moderno. Si desea que las personas tengan acceso a los servicios en su computadora, pero no desea abrir su firewall a Internet, puede utilizar la llamada de puertos. Le posibilita cerrar los puertos de su firewall que posibilitan 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 un golpe secreto. Otro golpe secreto cierra el puerto.

El golpe de puerto es una novedad, pero es esencial saber que es un ejemplo de seguridad a través de la oscuridad, y ese concepto es fundamentalmente defectuoso. El secreto de cómo entrar a un sistema es seguro debido a que solo los que pertenecen a un grupo específico lo conocen. Pero una vez que se descubre ese secreto, ya sea debido a que se revela, observa, adivina o resuelve, su seguridad se anula. Es mejor proteger 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 múltiples capas, por lo que tal vez la llamada de puertos debería ser una de esas capas. Cuantas más capas, mejor, ¿verdad? A pesar de esto, se podría argumentar que la activación de puertos no agrega mucho (si es que agrega algo) a un sistema seguro y debidamente reforzado.

La ciberseguridad es un tema vasto y complicado, pero no debes utilizar la llamada de puertos como tu única forma de defensa.

RELACIONADO: Cómo crear e instalar claves SSH desde el Shell de Linux

Instalación de knockd

Para demostrar el golpe de puerto, lo usaremos para controlar el puerto 22, que es el puerto SSH. Usaremos una herramienta llamada knockd. Utilizar 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.

Escriba lo siguiente:

sudo apt-get install knockd

Probablemente ya tengas el cortafuegos de iptables instalado en su sistema, pero es factible que deba instalar el iptables-persistent paquete. Maneja la carga automática de guardados iptable normas.

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 para aceptar la opción "Sí" en la pantalla IPV4 persistente de iptables.

Presione la barra espaciadora nuevamente en la pantalla de configuración de IPv6 para aceptar la opción «Sí» y continuar.

Presione la barra espaciadora para aceptar la opción "Sí" en la pantalla de configuración de IPv6.

El siguiente comando dice iptables para permitir 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 ESTABLISHED,RELATED -j ACCEPT

Este comando agrega una regla al firewall, que dice:

  • -A: Agrega la regla a la tabla de reglas del firewall. Dicho de otra forma, agréguelo al final.
  • APORTE: 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. los -m causas de los parámetros iptables para utilizar módulos de coincidencia de paquetes adicionales, en esta circunstancia, el llamado conntrack trabaja con las capacidades de seguimiento de la conexión de red del kernel.
  • –Cstate ESTABLECIDO, RELACIONADO: Especifica el tipo de conexión a la que se aplicará la regla, dicho de otra forma, conexiones ESTABLECIDAS y RELACIONADAS. Una conexión establecida es aquella que ya está en curso. Una conexión relacionada es aquella que se hace debido a una acción de una conexión establecida. Tal vez 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 destino ACEPTAR en el firewall. Dicho de otra forma, se acepta el tráfico y se le posibilita 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, dicho de otra forma, agréguela al final.
  • APORTE: 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 tiene como destino el puerto 22 (el puerto SSH).
  • -j RECHAZAR: Si el tráfico coincide con la regla, salte al destino REJECT en el firewall. Entonces, si se rechaza el tráfico, no se posibilita a través del firewall.

Debemos comenzar el netfilter-persistent demonio. Podemos hacerlo con este comando:

sudo systemctl start netfilter-persistent

Queremos netfilter-persistent pasar por un ciclo de guardar y recargar, por lo que carga y controla el iptable normas.

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.

Configurando knockd

Hay dos archivos que edita para configurar knockd. El primero es el siguiente knockd archivo de configuración:

sudo gedit /etc/knockd.conf

los gedit el editor se abre con el knockd archivo de configuración cargado.

El archivo de configuración knockd en el editor gedit.

Editaremos este archivo para satisfacer 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 que alguien debe entrar 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 entrar a los puertos para activar su apertura o cierre.
  • mando: 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 eliminan (para cerrar el puerto).
  • tcpflags: El tipo de paquete que debe recibir cada puerto en la secuencia secreta. Un paquete SYN (sincronizar) es el primero de un TCP solicitud de conexión, llamada 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 un plazo de 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 un plazo de 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 se componen:

  • -A: Agregue la regla al final de la lista de reglas de firewall (para el comando openSSH).
  • -D: Elimina el comando de la lista de reglas del cortafuegos (para el comando closeSSH).
  • APORTE: Esta regla se refiere al tráfico de red entrante.
  • -sorbo%: La dirección IP del dispositivo que solicita una conexión.
  • -pag: Protocolo de red; en esta circunstancia, es TCP.
  • –Dport: El puerto de destino; en nuestro ejemplo, es el puerto 22.
  • -j ACEPTAR: Salte al destino de aceptación dentro del firewall. Dicho de otra forma, deje que el paquete pase por el resto de las reglas sin actuar en consecuencia.

Las ediciones del archivo de configuración knockd

Las ediciones que haremos en el archivo están resaltadas en rojo a continuación:

El archivo de configuración knockd en el editor gedit con las ediciones resaltadas.

Extendemos el «seq_timeout» a 15 segundos. Esto es generoso, pero si alguien dispara manualmente en solicitudes de conexión, es factible que necesite tanto tiempo.

En la sección «openSSH», cambiamos el -A (añadir) opción en el comando para -I (insertar). Este comando inserta una nueva regla de firewall en el cima de la lista de reglas de firewall. Si dejas el -A opción, es anexa la lista de reglas de firewall y la coloca en el fondo.

El tráfico entrante se prueba con cada regla de firewall en el listado de arriba hacia abajo. Ya tenemos una regla que cierra el puerto 22. Por eso, si el tráfico entrante se prueba con esa regla antes de que vea la regla que posibilita el tráfico, la conexión se rechaza; si ve esta nueva regla primero, se posibilita la conexión.

El comando cerrar elimina la regla agregada por openSSH de las reglas del firewall. El tráfico SSH se maneja una vez más a través de la regla preexistente de «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

los knockd El archivo de control es mucho más sencillo. A pesar de esto, 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 post 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í esta la knockd presentar en gedit.

El archivo de control knockd en gedit.

Las pocas ediciones que necesitamos hacer están resaltadas en rojo:

El archivo de control knockd en gedit con las ediciones resaltadas.

Cambiamos la entrada «START_KNOCKD =» de 0 a 1.

Además quitamos el hash # desde el inicio de la entrada «KNOCKD_OPTS =», y reemplazó «eth1» con el nombre de nuestra conexión de red, enp0s3. Desde luego, si su conexión de red es eth1, no lo cambiarás.

La prueba está en el pudín

Es hora de ver si 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, además, no debido a que queramos configurar la llamada de puertos, sino debido a que el knockd paquete proporciona otra herramienta llamada knock. Usaremos esta máquina para disparar en nuestra secuencia secreta y llamar por nosotros.

Utilice 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:

knock 192.168.4.24 7000 8000 9000 -d 500

Esto dice knock para apuntar a la computadora en la dirección IP 192.168.4.24 y disparar 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» posteriormente realiza una solicitud SSH a 192.168.4.24:

ssh [email protected]

Su conexión es aceptada, ingresa su contraseña y comienza su sesión remota. Su símbolo del sistema cambia de dave@nostromo para dave@systempeaker. Para cerrar sesión en la computadora remota, escribe:

exit

Su símbolo del sistema vuelve a su computadora local. Él 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 concretamente 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 esto desde el otro lado? El administrador del sistema en el host de golpe de puerto 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 generan a medida que la utilidad de golpe remoto apunta a cada puerto.
  • Cuando se cumplen las tres etapas de la secuencia de activación, una entrada que dice «ÁBRETE SÉSAMO,«Está registrado
  • El comando para insertar la regla en el iptables Se envía la lista de reglas. Posibilita 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 posteriormente se desconecta.
  • Verá tres entradas closeSSH. Estos se generan a medida que la utilidad de activación remota apunta a cada puerto; le indica al host de activación del puerto que cierre el puerto 22.
  • Después de que se activen las tres etapas, recibimos el mensaje «ABRIR SÉSAMO» nuevamente. El comando se envía al firewall para borrar 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. Entonces, el puerto 22 ahora está cerrado nuevamente.

Golpéalo en la cabeza

Ese es el truco de salón de los golpes de puerto. Trátelo como una distracción y no lo haga en el mundo real. O, si debe hacerlo, no confíe en él como su única forma de seguridad.

setTimeout(function(){
!function(f,b,e,v,n,t,s)
{if(f.fbq)return;n=f.fbq=function(){n.callMethod?
n.callMethod.apply(n,arguments):n.queue.push(arguments)};
if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version=’2.0′;
n.queue=[];t=b.createElement(e);t.async=!0;
t.src=v;s=b.getElementsByTagName(e)[0];
s.parentNode.insertBefore(t,s) } (window, document,’script’,
‘https://connect.facebook.net/en_US/fbevents.js’);
fbq(‘init’, ‘335401813750447’);
fbq(‘track’, ‘PageView’);
},3000);

Suscribite a nuestro Newsletter

No te enviaremos correo SPAM. Lo odiamos tanto como tú.