domingo, 25 de septiembre de 2011

Por seguridad, toque antes de entrar

Tocar antes de entrar no parece presisamente una medida de seguridad sino más bien una regla de buenas costumbres. Pero entonces... ¿A qué me refiero con el título de este post?

Hoy hablaremos del "Port Knocking", una medida de seguridad complementaria que puede ser de mucha utilidad, sobre todo si tenemos el paranoic_mode enable xD

Si en nuestras manos está la responsabilidad de administrar un servidor y garantizar la disponibilidad de sus servicios, sin duda que habremos configurado alguna forma de acceso remoto para poder resolver los problemas que se presenten aún cuando estemos en casa, de viaje o perdidos en la jungla amazónica (los jefes no perdonan nada xD)

En linux, para la administración remota, se suele usar SSH o VNC. Estos servicios, como cualquier otro, requieren abrir un puerto adicional en el servidor para atender nuevas conexiones. Este simple hecho puede representar un riesgo de seguridad pues da pie a que un atacante intente acceder por fuerza bruta o explotando alguna vulnerabilidad del servicio. Por ejemplo, recuerden esa vez que "parcharon" los WARNINGS de OpenSSL reduciendo la entropía del PRNG a depender de un simple PID... ¿Qué sucedió después? Pues solo miren este vídeo...



Entonces ¿Qué podemos hacer? Algunas medidas serían cambiar el puerto de servicio por defecto, configurar auteticación por certificados y contraseña (doble seguridad: por algo que tengo y por algo que sé) y también usar "Port Knocking".

Port knocking se puede traducir como "tocar puertos" y es algo así como cuando tocas la puerta de una forma especial para que el que está adentro sepa que eres tú y no otra persona. En este caso lo que se hace es "tocar" una secuencia de puertos predefinida para que el servidor sepa que eres tú y te deje entrar. Interesante ¿Verdad?

Veamos como configurar esto en Ubuntu. Lo primero será instalar el paquete "knockd".

$ sudo apt-get install knockd

Este paquete tiene tanto el servicio que escuchará el toque de puertos como el cliente para tocar puertos.

Ahora modificaremos el fichero /etc/default/knockd

$ sudo vim /etc/default/knockd
################################################
#
# knockd's default file, for generic sys config
#
################################################

# control if we start knockd at init or not
# 1 = start
# anything else = don't start
#
# PLEASE EDIT /etc/knockd.conf BEFORE ENABLING
START_KNOCKD=1

# command line options
KNOCKD_OPTS="-i eth0"
Cambiamos el valor START_KNOCKD a 1 para que arranque con el sistema, descomentamos KNOCKD_OPTS y cambiamos eth1 por la interface donde queremos escuchar el toque de puertos (en mi caso eth0).

Luego toca modificar el fichero /etc/knockd.conf, ahí especificaremos los puertos que se van a tocar y la acción que se realizará.

$ sudo vim /etc/knockd.conf
[options]
	UseSyslog

[openSSH]
	sequence      = 7000,8000,9000
	seq_timeout   = 5
	tcpflags      = syn
	start_command = /sbin/iptables -A INPUT -s %IP% -p tcp -m tcp --dport 22 -m state --state NEW -j ACCEPT
	cmd_timeout   = 60
	stop_command  = /sbin/iptables -D INPUT -s %IP% -p tcp -m tcp --dport 22 -m state --state NEW -j ACCEPT

Si lo configuramos de esa forma, cuando se toquen los puertos 7000, 8000 y 9000 se añadirá una regla al firewall para que le permita a nuestra IP establecer nuevas conexiones al puerto 22 (puerto del SSH) y pasado un minuto borrará esa regla. Puedes cambiar la secuencia de puertos por otra menos intuitiva.

También haremos un script para configurar el firewall.
#!/bin/sh
# Script para configurar el firewall local con iptables

# Eliminamos reglas actuales
iptables -F
iptables -X
iptables -Z
iptables -t nat -F

# Politicas por defecto (denegamos todo)
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

# Permitimos conexiones desde localhost
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# Permitimos conexiones al servidor web (similar para otros servicios)
/sbin/iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp -m tcp --sport 80 -m state --state RELATED,ESTABLISHED -j ACCEPT

# Mantener las conexiones establecidas a SSH
/sbin/iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state RELATED,ESTABLISHED -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp -m tcp --sport 22 -m state --state RELATED,ESTABLISHED -j ACCEPT

Añade una llamada a este script en /etc/init.d/rc.local para que se ejecute al iniciar el sistema.

Por último, reinicamos knockd

# /etc/init.d/knockd restart

Luego, cuando queramos conectar al SSH, primero debemos tocar los puertos así:

$ knock mi.servidor.com 7000 8000 9000

y luego lanzar el ssh

$ ssh miusuario@mi.servidor.com

De otra forma, no nos permitirá conectar.

Pues bien, ya hemos configurado port knocking. La próxima vez que Trinity lance su nmap y scanee nuestro servidor verá que el puerto 22 ya no está OPEN sino FILTERED y no podrá lanzar su exploit contra nosotros. Lo siento nena :P

Fig. 1 - Pero si te mira así, mejor déjale hacer lo que quiera ;)
Hasta la próxima...

Saludos.

2 comentarios: