MONTANDO TU PROPIO SERVIDOR VPN PPH Luis Delgado J. Todos sabemos lo inseguro que es navegar sin protección por una red que no sabemos si puede estar o no comprometida, y más ahora con todo el revuelo montado alrededor de Firesheep. Hace unos días Yago Jesús comentaba en Security by Default los métodos que disponemos para defendernos de esta extensión. Como resumen decir que se comentaban tres métodos, la utilización de aplicaciones que inyectaran ruido en el tráfico desconcertando a la extensión, la utilización de extensiones que fuercen el uso de SSL y el uso de VPNs para cifrar todo el tráfico y evitarnos las miradas indiscretas. Como podemos entender, la mejor solución es esta última. Todos conocemos el “universo Cloud” y la cantidad de servicios asociados a él que no paran de aparecer. Uno de los que más me llamó la atención desde que le conocí (y ahora empieza a aparecer en muchas compañías) es el tema del alquiler de recursos/instancias por tiempos muy cortos (principalmente suelen ser intervalos de una hora). El más conocido es EC2 de Amazon pero como ya he dicho, hay otras compañías de hosting que se están subiendo al carro y ofrecen servicios muy competitivos. Entrando ya en el tema del artículo, ¿por qué no usar estos servicios para montarnos un servidor VPN que estará activo únicamente cuando lo necesitemos? Esto que es tan simple, tiene dos grandes ventajas, una que somos nosotros los que estamos administrando el servidor y por lo tanto no dependemos de terceros (y lo fiables que sean o no) y la segunda es que el gasto mensual cae estrepitosamente (en mi caso he pasado de pagar un servicio VPN de 12e, a una factura mensual alrededor de 1e). Resumiendo un poco, la finalidad de este artículo es que seamos capaces de montarnos nuestro propio servidor VPN utilizando estas instancias y que esté activo únicamente cuando lo necesitemos, tardando un par de minutos en estar operativo y costándonos desde un céntimo la hora. Como ya he comentado anteriormente, el servicio más conocido es EC2 de Amazon pero existen otros que pueden llegar a ser una mejor opción si la VPN va a ser de uso personal y no necesitamos tantos recursos. Yo recomiendo el servicio cloud de OVH pues nos ofrece una instancia muy similar a la de Amazon pero comenzando con 256mb de ram y un coste de 1c la hora, lo cual es más que suficiente para un solo usuario. El servicio VPN va a ser a través de OpenVPN y la gestión de los usuarios se va a realizar a través de OpenLDAP ya que es más flexible y cómodo que la utilización de certificados de cliente, pues nos evitamos el crear uno para cada cliente y el manejo de las blacklists, etc. No voy a explicar cómo utilizar el servicio cloud de OVH pues en esta página web disponen de videos bastante explicativos de todo el proceso (puesta en marcha, evolución, archivado/detención y eliminación). ¡Comencemos con la instalación! En primer lugar vamos a instalar y configurar OpenVPN, posteriormente haremos lo mismo con OpenLDAP y finalmente, utilizando el plugin openvpn-auth-ldap, los enlazaremos. Toda la explicación se basa en una instalación en Debian 5 de 64 bits (también ha sido probada en Ubuntu Server 10.04). 1. Instalación de OpenVPN Instalamos OpenVPN y nos cercioramos de que está instalado OpenSSL y Sudo: apt-get install openvpn openssl sudo Configuramos OpenVPN: vim /etc/default/openvpn + Añadimos AUTOSTART="openvpn" - Comentamos OPCTAGS vim /etc/openvpn/openvpn.conf dev tun proto tcp (también puede utilizarse udp) port 1194 (u otro) ca /etc/openvpn/keys/ca.crt cert /etc/openvpn/keys/servidor.crt key /etc/openvpn/keys/servidor.key dh /etc/openvpn/keys/dh2048.pem user nobody (solo en no-windows) group nogroup (solo en no-windows) server 10.8.0.0 255.255.255.0 (rango de ips que usara la vpn) ifconfig-pool-persist ipp.txt (guarda las asignaciones) persist-key persist-tun #up /etc/openvpn/openvpn.up (se ejecuta al iniciar el servicio, ¡comentarlo en Debian!) #client-to-client (permite que los usuarios se vean entre ellos) push "redirect-gateway def1" #comp-lzo (compresión) verb 3 (detalles error) max-clients 1 (número máximo de usuarios) Establecemos el script para el fowarding/iptables que habrá que ejecutar cada vez que queramos arrancar el servicio openvpn: vim /etc/openvpn/openvpn.up #!/bin/bash sudo /etc/init.d/openvpn restart sudo echo 1 > /proc/sys/net/ipv4/ip_forward sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE chmod +x /etc/openvpn/openvpn.up Configuramos/creamos las llaves y certificados y reiniciamos el servicio: Copiamos los ejemplos a una carpeta temporal cp -R /usr/share/doc/openvpn/examples/easy-rsa/ /etc/openvpn/ cd /etc/openvpn/easy-rsa/2.0/ Creamos la carpeta de las llaves mkdir keys vim vars · Modificamos KEY_DIR --> export KEY_DIR="/etc/openvpn/easy-rsa/2.0/keys" · Modificamos KEY_SIZE --> export KEY-SIZE=2048 · Modificamos los datos para la entidad (con precaución o todo el proceso fallará) Comenzamos a crear certificados/llaves: source ./vars ./clean-all ./build-dh ./build-ca ./build-key-server servidor ./build-key luis (uno para cada uno de los clientes) Copiamos los certificados/llaves cp -R /etc/openvpn/easy-rsa/2.0/keys /etc/openvpn/ cd /etc/openvpn/keys openvpn --genkey --secret /etc/openvpn/keys/ta.key Reiniciamos el servicio: sh /etc/openvpn/openvpn.up Una vez reiniciado el servicio tendremos completamente operativo nuestro servidor OpenVPN. Podemos instalarnos un cliente y comprobar que funciona, copiando en la carpeta de configuración el certificado del servidor (ca.crt), y el certificado/llave del cliente (luis.crt y luis.key) además del archivo de configuración (si habéis modificado la configuración del servidor tendréis que comprobar que concuerdan con los del cliente): client dev tun proto tcp (o udp) remote IP_SERVIDOR 1194 (u otro puerto) resolv-retry infinite nobind persist-key persist-tun ca ca.crt cert cliente.crt key cliente.key #comp-lzo verb 3 ns-cert-type server 2. Instalación de OpenLDAP En primer lugar instalaremos y configuraremos slapd, en este caso utilizare como dominio de ejemplo “example.com”, si utilizáis cualquier otro, acordaros de cambiarlo en todos los ficheros de configuración y de utilizarlo posteriormente cuando hagáis referencia a algún usuario/grupo. Instalamos los paquetes necesarios: apt-get install slapd ldap-utils Configuramos slapd: dpkg-reconfigure slapd DNS domain & Organization name: (p.e) example.com Administrator password: admin password Database backend to use: BDB (es la recomendada) Do you want the database to be removed when slapd is purged? No Allow LDAPv2 protocol? No vim /etc/ldap/ldap.conf · BASE: dc=example,dc=com · URI: ldap://localhost vim /etc/ldap/slapd.conf · loglevel --> 256 + Añadimos "index uid eq" después de "index objectClass eq" Creamos un nuevo schema para añadir el campo “accessVPN” a los usuarios que creemos, y poder indicar si tiene acceso o no (1 tiene acceso, cualquier otro valor se le deniega la conexión): vim /etc/ldap/schema/vpn.schema attributetype ( 1.3.6.1.4.1.3317.4.3.4.1 NAME 'accessVPN' DESC 'VPN Access' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) objectclass ( 1.3.6.1.4.1.3317.4.3.5.1 NAME 'vpn' DESC 'Abstraction for VPN users' SUP top AUXILIARY MUST ( accessVPN ) ) vim /etc/ldap/slapd.conf + Añadimos al inicio “include /etc/ldap/schema/vpn.schema” Aplicamos el nuevo índice: /etc/init.d/slapd stop slapindex chown openldap:openldap /var/lib/ldap/* /etc/init.d/slapd start Creamos el grupo VPN al que pertenecerán los usuarios: vim /etc/ldap/ldifs/vpn.ldif dn: cn=vpn,dc=example,dc=com objectClass: posixGroup objectClass: top cn: vpn gidNumber: 1000 Añadimos el nuevo grupo al ldap: ldapadd -x -D "cn=admin,dc=example,dc=com" -W -f /etc/ldap/ldifs/vpn.ldif Creamos los usuarios del grupo VPN. En primer lugar creo el usuario openvpn que utilizaremos posteriormente para conectarnos desde OpenVPN a LDAP y comprobar los credenciales (creo un usuario para evitar dejar activo el usuario anónimo). Posteriormente creo los demás usuarios que seguirán su mismo perfil, modificando sus datos (cn, password, etc) y el uidNumber (en este caso el valor de accessVPN será 1). Como apunte final, decir que podemos administrar LDAP utilizando aplicaciones con “FrontEnd” como por ejemplo phpldapadmin: vim /etc/ldap/ldifs/openvpn.ldif dn: uid=openvpn,cn=vpn,dc=example,dc=com objectClass: inetOrgPerson objectClass: posixAccount objectClass: vpn objectClass: top givenName: OpenVPN user sn: OpenVPN user uidNumber: 1000 gidNumber: 1000 homeDirectory: /home/vpn/openvpn cn: openvpn uid: openvpn userPassword: PASSWORD --> (p.e) slappasswd -h {MD5} accessVPN: 0 (no se puede conectar a la VPN) vim /etc/ldap/ldifs/luis.ldif dn: uid=luis,cn=vpn,dc=example,dc=com … uidNumber: 1001 … accessVPN: 1 Añadimos los nuevos usuarios a LDAP: ldapadd -x -D "cn=admin,dc=example,dc=com" -W -f /etc/ldap/ldifs/openvpn.ldif ldapadd -x -D "cn=admin,dc=example,dc=com" -W -f /etc/ldap/ldifs/luis.ldif 3. Enlazando OpenVPN y OpenLDAP: Como ya he dicho al comienzo del artículo, para enlazar ambos servicios utilizaremos el plugin de OpenVPN openvpn-auth-ldap. Si nos encontramos en Debian, tendremos que agregar un nuevo repositorio al archivo sources.list pues éste plugin no se encuentra en los que vienen por defecto (otra opción es bajar el plugin e instalarlo manualmente). vim /etc/apt/sources.list + Añadimos al final “deb http://ftp.de.debian.org/debian sid main” Instalamos el plugin: apt-get update apt-get install openvpn-auth-ldap Una vez instalado nos ponemos a configurarlo. Hacemos uso del fichero de configuración de ejemplo, eliminando toda referencia a conexión cifrada, pues LDAP se encuentra en el mismo servidor. Además, modificamos el fichero de configuración de OpenVPN añadiendo la localización del plugin y establecemos que el cliente no necesita un certificado para conectarse. Creamos el fichero de configuración: mkdir /etc/openvpn/auth cp /usr/share/doc/openvpn-auth-ldap/examples/auth-ldap.conf /etc/openvpn/auth vim /etc/openvpn/auth/auth-ldap.conf <LDAP> URL ldap://localhost BindDN uid=openvpn,cn=vpn,dc=example,dc=com Password PASSWORD Timeout 15 </LDAP> <Authorization> BaseDN "cn=vpn,dc=example,dc=com" SearchFilter "(&(uid=%u)(accessVPN=1))" RequireGroup false </Authorization> vim /etc/openvpn/openvpn.conf plugin /usr/lib/openvpn/openvpn-auth-ldap.so /etc/openvpn/auth/auth-ldap.conf client-cert-not-required Ya para terminar solo queda reiniciar los servicios (slapd y openvpn), modificar el fichero de configuración del cliente eliminando las referencias a los certificados de cliente y añadiendo “authuser-pass” y “auth-nocache” para que sepa que la autenticación es mediante usuario y contraseña (y no guarde en cache los credenciales). Con respecto a LDAP, en la mayoría de las configuraciones que me he ido encontrando, siempre se deja activado el usuario anónimo, permitiendo obtener acceso en modo lectura a todo el directorio. Esto, bajo mi punto de vista, es un grave problema de fuga de información pues cualquiera que pueda conectarse al servidor (o hacer uso de cualquiera de las aplicaciones web que permiten la administración de LDAP) podrá ver todos los usuarios y su información personal. Por ese mismo motivo, aconsejo aplicar una serie de medidas que eviten que incluso se pueda ver dicha información entre usuarios autenticados, es decir, que cada uno solo pueda verse a sí mismo y todo lo demás permanezca oculto. Para activar este comportamiento, basta con añadir/modificar las siguientes líneas en el archivo de configuración de slapd. vim /etc/ldap/slapd.conf cambiamos: access to * by dn="cn=admin,dc=example,dc=com" write by * read por: access to dn="dc=example,dc=com" by dn="cn=admin,dc=example,dc=com" write by users read by * none access to dn="cn=vpn,dc=example,dc=com" by dn="cn=admin,dc=example,dc=com" write by self write by users read by * none access to * by dn="cn=admin,dc=example,dc=com" write by dn="uid=openvpn,cn=vpn,dc=example,dc=com" read by self write by * none (La configuración superior no es la más correcta ni óptima, pero funciona). Bueno, como podéis ver, en relativamente sencillo tener funcionando nuestro propio servidor VPN. Además éste tiene un cobro por horas manteniendo la información, luego tenemos a nuestra disposición un servicio VPN a un clic que nos costará muy poco al mes. Aprovecho para enlazar un artículo que publicó Alejandro Ramos en Security By Default de cómo instalar un servidor PPTP para navegar de forma segura en Android (exportable también a iPhone y demás dispositivos que lo permitan). Como todos sabemos, y podemos acudir a las entregas de Chema Alonso sobre las distintas opciones de VPN y su seguridad, OpenVPN es de las más seguras pero tiene el inconveniente de requerir una aplicación externa. Simplemente decir que, como podéis observar, hay muchos usos interesantes que se les puede dar a estos servicios cloud. Otro que se me ocurre es un túnel DNS para saltarse los portales cautivos (tan de moda ahora en cafés/restaurantes). Ya escribió sobre este tema Alejandro Ramos aquí y aquí.