04 febrero 2007

Portknocking: cerradura de combinación en el firewall

Como sabeis, Linux implementa un firewall por kernel: iptables. Con él podemos crear y/o modificar reglas para permitir, denegar o redirigir las conexiones en nuestro sistema. Es un sistema altamente confiable y muy seguro. Pero es un sistema estático: cumple las reglas impuestas por root, y nada más.

Para que entendais lo que quiero decir nada mejor que un ejemplo. Podemos poner una regla de iptables que rechace las conexiones a nuestro puerto 22 (SSH):
iptables -t filter -A INPUT -p tcp --dport 22 -j DROP

Esto blindará el acceso por el puerto 22, impidiendo que nadie pueda acceder a nuestro servidor SSH. Sin duda aumenta la seguridad, pero ¿y si somos nosotros los que queremos acceder a él desde un equipo remoto?

Se pueden, por supuesto, construir reglas que permitan el acceso a una IP dada, incluso a una dirección MAC dada (iptables es muy versátil), pero eso tiene dos inconvenientes:
  • Disminuye la seguridad, siendo vulnerable a ataques de IP spoofing y de MAC spoofing

  • Nos encontramos atados a esa IP o a esa MAC: si necesitamos acceder desde cualquier otra no podremos hacerlo

La solución es una ingeniosa técnica llamada portknocking.

Firewall activo: portknocking

Esta técnica consiste en bloquear los servicios de un host, pero manteniendo un demonio a la escucha de intentos de conexión en determinados puertos (cerrados). Cuando un cliente intente conectar a estos puertos según una secuencia determinada, el demonio variará temporalmente las reglas de iptables para permitirle acceder. Sigamos con el ejemplo de antes.

Digamos que quiero acceder a mi equipo remotamente usando el servidor SSH, pero no quiero dejarlo permanentemente expuesto en Internet, arriesgándome a que sufra ataques brute force o con algún exploit 0-day. Pongamos también que quiero acceder a él desde diversas máquinas (el trabajo, la casa de la novia, un cibercafé...) que pueden no ser siempre las mismas, y que además aunque lo fueran no crearía reglas que permitiesen a su IP/MAC acceder, ya que soy muy paranoico y sé que alguien podría spoofear esas IP/MAC para conseguir acceso.

La solución sería dropear todas las conexiones entrantes, pero mantener un demonio knockd en background escuchando los puertos, digamos, 2546, 3101, 6969, 21732 y 4400, puertos que estarían cerrados. Yo puedo configurar knockd de forma que, si alquien intenta conectar con esos puertos por ese orden y en un intervalo de treinta segundos, varíe las reglas del cortafuegos permitiendo a esa IP acceder al puerto 22.

¿Cómo implementarlo?

Nada más sencillo:

apt-get install knockd

knockd es un servidor de portknocking que escucha todo el tráfico de una interfaz determinada (de momento sólo soporta Ethernet y PPP). Cuando detecta una secuencia determinada de knocks ejecuta un comando definido en su archivo de configuración, que puede perfectamente ser una regla de iptables para permitirnos el acceso al servicio que deseemos.

Como clientes, debemos envíar los paquetes a los puertos que hayamos establecido previamente para que knockd nos brinde acceso. Eso es fácil de hacer con cualquier herramienta que genere paquetes TCP o UDP, como por ejemplo GSpoof o Nemesis (aunque la finalidad de estas herramientas es otra, generar e inyectar paquetes con las cabeceras TCP/IP manipuladas: sí, para hacer ataques de IP spoofing, por ejemplo). También podemos hacerlo "artesanalmente" con un simple cliente telnet.

Como veis el portknocking nos da a la vez seguridad, confiabilidad y versatilidad, convirtiendo nuestro cortafuegos estático en un firewall activo que nos permite variar sus reglas adaptándose a nuestras necesidades.

2 comentarios:

Anónimo dijo...

Oues si ya tuvieras un manual del IPtables seria la leche :)

Probe hace poco el Firestarter, pero la verdad, no se si estaba haciendo algo o no. Se supone que es residente en memoria, pero cada vez que hacia un status, me daba la impresion de que solo hacia eso, residir...

kirazuel dijo...

Manuales de iptables hay muchos por la Red, por ejemplo éste está bastante bien.

En cuanto a firestarter es una buena opción si no conoces la sintaxis de iptables. En realidad no es más que una GUI para iptables: tú le dices lo que quieres y él crea y ejecuta las reglas. Para comprobar si está funcionando correctamente puedes ejecutar iptables -L para listar las reglas que hay en ejecución.