Información blog

Linux, tutoriales, noticias, sistemas, redes y seguridad informática, entre otras cosas.

domingo, 21 de junio de 2015

SPA, la evolución del port knocking

Recientemente me encontraba leyendo un par de artículos en referencia al port knocking; artículos que en un principio pensaba que no me iban a explicar nada demasiado nuevo ya que hace tiempo que estuve haciendo varias pruebas con él e incluso hablé de él en este blog. Para aquellos que no hayan leído dicho post, se podría explicar a modo de resumen que el port knocking se basa en "tocar" varios puertos en una secuencia correcta para abrir un puerto en concreto temporalmente; cosa muy útil para que el puerto ssh se sólo se pueda abrir bajo dicha secuencia. Dicha protección no es infalible, pues siempre se puede intentar adivinar la secuencia en cuestión (aunque después hayan otras protecciones) pero siempre viene bien añadir una capa extra de seguridad. Dicha protección a evolucionado a un nuevo nivel, en el cual el concepto ha cambiado radicalmente; se trata del SPA o Single Packet Authentication.


Este concepto se basa en un concepto completamente distinto al por knocking. En este caso se trata de enviar un único paquete cifrado con la intención de abrir un puerto en concreto. Esto tiene ventajas con respecto a la seguridad frente al método anterior; lamentablemente el uso de SPA requiere que los equipos cliente y servidor, tengan algunas configuraciones especificas, mientras que en el port knocking toda configuración depende única y exclusivamente del servidor; cosa que es importante tener en cuenta al a hora de escoger uno de los dos métodos de apertura de puertos. Un esquema que podría explicar con precisión el la infraestructura SPA sería éste:


Para usar el método SPA, es necesario contar con una herramienta, que se puede descargar en dos variantes distintas. Se trata de la herramienta fwknop, la cual dependiendo de si lo descargas en un servidor o un cliente, habría que descargar la herramienta fwknop-server o fwknop-client respectivamente. Comencemos con el lado del servidor, pues es el más importante y el más "delicado". Comencemos con la parte del servidor.

Configuración del servidor SPA

Para ello habría que empezar con lo más básico, que se trataría de la descarga del paquete. Afortunadamente, tanto el software para el cliente como para el servidor se encuentran en los repositorios oficiales del sistema operativo, con lo que simplemente habría que hacer:

  1. apt-get install fwknop-server

El proceso de instalación es muy breve, pues al final no se trata de nada más que un servicio que interactua con iptables para brindar acceso por un puerto que inicialmente se encontraba bloqueado. Aún así no basta con instalar el paquete, también es necesario configurarlo, para lo cual sería necesario dirigirse al directorio /etc/fwknop, el cual almacena dos ficheros: access.conf y fwknopd.conf


El primero, access.conf, se basa en la configuración de las políticas de acceso al servidor. Esto hace que sea necesario configurarlo, pues con la configuración por defecto no es suficiente para lograr nuestro objetivo; así pues en el fichero en cuestión hay una serie de parámetros que son realmente importantes:

  • OPEN_PORTS: Este se trata de parámetro más importante de todos, pues es el que se encarga de abrir los puertos que se le indique tras recibir el paquete SPA. A la hora de especificar los puertos que se quieren definir, siempre habría que especificarlo de la siguiente forma: puerto/protocolo.
  • SOURCE: Este parámetro está correctamente configurado por defecto, pues está ya preparado para aceptar el SPA desde cualquier origen, pero perfectamente puede especificarse otro.
  • KEY: Este parámetro varía dependiendo de nuestras necesidades. Puede ser KEY, o puede ser KEY_BASE64 (que permitiría caracteres especiales) o también HMAC_KEY_BASE64, el cual ya incluye opciones de cifrado. En este caso optaremos por un KEY_BASE64, que es más flexible que el parámetro KEY.
  • FW_ACCESS_TIMEOUT: Por último pero no menos importante está el establecimiento del tiempo que va estar abierto el firewall en segundos. En caso de no establecer ningún tiempo, el firewall se quedaría abierto indefinidamente, con lo que no sería una medida segura.
Basándonos en estos tres parámetros, bien podríamos crear un fichero access.conf con el siguiente contenido:

  1. OPEN_PORTS: tcp/22;
  2. SOURCE: ANY;
  3. KEY_BASE64: ivan;
  4. FW_ACCESS_TIMEOUT: 600;

El fichero fwknopd.conf no sería necesario configurarlo pues por defecto ya está cumple con los requisitos para lo que nosotros buscamos. Como habréis podido observar, únicamente está contemplado para abrir el puerto 22 del protocolo tcp, el resto de puertos permanecerían cerrados. Para asegurarnos que nuestro puerto ssh va a estar inaccesible para todo aquel que no posee la información necesaria, un script de iptables con una configuración MUY básica podría ser la siguiente:

  1. #!/bin/bash
  2. iptables -A INPUT -j DROP
  3. iptables -A INPUT -i lo -j ACCEPT
  4. iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Teniendo todo correctamente configurado, simplemente quedaría reiniciar el servicio fwknop mediante el comando /etc/init.d/fwknop-server restart, y ya estaría la parte del servidor preparada.

Configuración del cliente SPA

En este caso la configuración es mucho más sencilla que en el servidor, pero es indispensable tener primero instalado el cliente fwknop. Para ello comenzaríamos instalándolo mediante el comando:

  1. apt-get install fwknop-client

Con el cliente instalado, en este caso no es necesario configurar ningún fichero, sino que sería el turno de enviar el paquete SPA que se encargará de abrir el puerto. Dicho proceso posee la siguiente estructura:

fwknop -A ${protocolo}/${puerto} -D ${ip_destino} -a ${ip_origen}

En mi caso, por ejemplo, el comando sería:

  1. fwknop -A tcp/22 -D 192.168.1.7 -a 192.168.1.8

Al teclear dicho comando, la consola nos preguntará qué contraseña hemos establecido. En este caso se trataría de la password ivan, pero en el vuestro sería otro completamente distinto. Si la contraseña es correcta, el servidor debería abrir el puerto durante los segundos estipulados, quedando únicamente acceder por ssh al servidor. 

Obviamente, aunque este concepto ha sido únicamente aplicado al acceso por ssh, puede ser aplicado a cualquier otro puerto.

Saludos.

No hay comentarios :

Publicar un comentario