Mostrando entradas con la etiqueta OpenVPN. Mostrar todas las entradas
Mostrando entradas con la etiqueta OpenVPN. Mostrar todas las entradas

20 agosto 2013

HTTPS, SSH y OpenVPN en un mismo puerto, ¿magia?

De vez en cuando uno encuentra una de esas herramientas que resuelve un problema de una forma tan brillante que realmente dan ganas de aplaudir.

Este es el caso de sslh, una herramienta que permite cumplir el sueño de todo aquel que ha tenido que lidiar en un entorno cuya salida estaba gestionada por un proxy.

Sslh permite multiplexar un único puerto y convertirlo en varios servicios a la vez. Lo que hace es recibir la conexión en el puerto indicado, analizar que tipo de conexión es (ssl, openvpn, ssh, xmpp) y en función de ese análisis, enviar la conexión al puerto indicado.

Por simple el concepto es brillante. Muchos nos hemos encontrado en un entorno donde un proxy solo facilita el método 'CONNECT' hacia el puerto 443. Si queríamos hacer uso de varios servicios era necesario usar túneles SSH que a la postre eran bastante engorrosos.

Además, el creador de la herramienta indica un método para lidiar con proxys 'inteligentes' que no solo restringen conexiones a puertos sino que también analizan que las conexiones sean efectivamente SSL.

Para instalarlo en Linux (para windows se proveen ejecutables) hay que hacer lo siguiente:

Descargamos el paquete:

wget https://github.com/yrutschle/sslh/archive/v1.15.tar.gz

Lo descomprimimos

tar -xvzf v1.15.tar.gz

Compilamos e instalamos

make install

Una vez hecho eso, tenemos que configurar sslh para indicarle como queremos que mueva las conexiones.

lo más fácil es usar el puerto 443 de la interface de red exterior para sslh y poner los otros servicios en localhost. De esa forma solo exponemos un puerto abierto al exterior y el resto de servicios están ocultos a miradas ajenas.

Un ejemplo de uso de sslh para escuchar en el puerto 443 de la interface de red y enviar el tráfico SSH al puerto localhost 22

sslh -p 172.16.183.139:443 --ssh 127.0.0.1:22

Si queremos mover tráfico openvpn, tan solo tenemos que añadir el flag --openvpn 127.0.0.1:1194

De esa forma estaremos moviendo tráfico SSH al puerto 22 y tráfico OpenVPN al puerto 1194 pero todas las conexiones desde el exterior irán contra el puerto 443
Leer más...

23 septiembre 2011

Una autenticación fuerte para Openvpn



Exponer a internet un servicio es siempre un punto de entrada para todo tipo de amenazas. Por supuesto, el nivel de riesgo dependerá de la configuración del servicio, el grado de actualización del software y las medidas de seguridad que tomemos para utilizar dicho servicio.

En mi caso, para acceder a mi red, utilizo OpenVPN. El objetivo, como comenté en uno de mis primeros posts en Security By Default (no ha llovido ni nada desde entonces), es estar conectado, esté donde esté. Respecto a OpenVPN, poco queda que contar que no hayamos hecho ya. Nos permite tener la conectividad con nuestras redes, a miles de kilómetros, como si estuviéramos en la oficina o en el salón de casa. Nuestro tráfico irá autenticado y cifrado mediante OpenSSL, utilizando una PKI, con certificados, tanto en el cliente como el servidor, para asegurar que somos quienes decimos que somos.

Desde 2004 hasta hace relativamente poco, mi configuración principal de OpenVPN era por TCP, utilizando un mecanismo port-knocking basado en TCP Wrappers que abría durante 20 segundos la posibilidad a establecer conexiones contra el servicio final. Pasados esos 20 segundos, no se permitían conexiones nuevas por lo que el grado de seguridad era de nivel paranoico para arriba. En realidad, los internals de la configuración eran algo más complicados, puesto que, al menos antiguamente, OpenVPN no permitía utilizar TCPwrappers, por lo que utilizaba Xinetd (que sí que los habilita) para publicar el TCP 443 al exterior durante 20 segundos y hacer un bind al TCP 444 que es donde corría realmente el servicio OpenVPN.

Sin embargo, harto de no poderme conectar a través de redes wireless públicas gratuitas, decidí cambiar mi filosofía del seguridad al 100% mientras no exponga el servicio, y cambié la configuración de OpenVPN al puerto 53 UDP. Quisé probar si los portales cautivos de determinadas redes gratuitas en aeropuertos, estaciones, hoteles, etc,… no controlaban correctamente que el tráfico que permitían salir al exterior fuera realmente DNS. Lo que me he encontrado en estos días de pruebas, es que efectivamente se comprueba que el tráfico enviado sea DNS, por lo que hay que buscar otra forma. No parece que haya más remedio que utilizar alternativas como Iodine o DNS2TCP ya comentadas en SbD en posts anteriores. Sin embargo, por lo que he leido, Iodine no utiliza cifrado de ningún tipo en el envío del tráfico, por lo que podría tunelizarse OpenVPN dentro del propio túnel Iodine, para asegurar que todo viaja cifrado.

Así pues, este cambio "para ganar en funcionalidad", me hará perder en "seguridad", estando el servicio abierto permanentemente a Internet por mucho que Iodine pueda configurarse para requerir una contraseña de acceso.

Me diréis: "Oye Lorenzo, pero si tienes montada tu propia PKI y utilizas autenticación con certificado de cliente, alguien tendría que tener tu certificado para poderse autenticar. Es un buen nivel de seguridad tal cual ¿No eres demasiado paranoico?" La respuesta es: "Sí, soy paranoico, pero si pierdo físicamente mi portátil, la sesión está abierta, es 29 de febrero, la luna está en cuarto creciente y el Logroñés vuelve a primera división y ficha a Messi y a Ronaldo, entonces es posible que presionando un botón, el que me ha robado y ha salido corriendo con mi Mac, esté en mi red".

Así pues, y dado que trabajo para un fabricante de soluciones de autenticación fuerte, quise darle una vuelta de tuerca y aprovechar que tengo licencia gratis para utilizar la solución de Swivel  :D

OpenVPN permite, realizar autenticación de doble factor utilizando algo que tienes (el mencionado certificado SSL) y algo que conoces (un usuario/contraseña por ejemplo).
Ya hemos contado en SbD, cómo OpenVPN permite utilizar usuarios de un directorio LDAP, por ejemplo. En este caso y dado que será Pinsafe quien provea autenticación mediante OTC (One-Time-Code como variante de One-Time-Password), integraremos esta autenticación contra un servidor RADIUS.

Este procedimiento serviría para integrar VPN con cualquier servidor RADIUS, aunque en este caso, además tiene la ventaja de que la contraseña a utilizar cambia en cada autenticación.


Cómo se hizo:
  • Parto de una máquina virtual en la que está instalado el servidor RADIUS en el que delegaré el segundo factor de autenticación en la IP 192.168.52.3.
  • Así pues lo primero es configurar en Swivel Pinsafe los parámetros necesarios para permitir que la IP del servidor openVPN pueda hacer consultas Radius utilizando un secreto compartido.
  • En el servidor OpenVPN instalamos el paquete pam_radius. En el fichero de configuración del propio servicio Openvpn (/etc/openvpn/openvpn.conf) añadimos la línea 
       "plugin /usr/share/openvpn/plugin/lib/openvpn-auth-pam.so openvpn"  
  • En el fichero /etc/pam_radius.conf añadimos una línea de la forma: 
     "192.168.52.3    atitelovoyacontar     10" ->  IP del servidor RADIUS // clave compartida // timeout
  • En el fichero /etc/pam.d/openvpn indicamos que este servicio utilizará el módulo pam_radius_auth.so. Para ello añadimos las siguientes líneas en dicho fichero.
      auth required pam_radius_auth.so no_warn try_first_pass
      account required pam_radius_auth.so

  • Reiniciamos el servicio openvpn -> /etc/init.d/openvpn restart
  • En el fichero de configuración del lado cliente, deberemos añadir la línea "auth-user-pass" de manera que antes de efectuar conexión alguna contra el servidor, el programa cliente pida usuario y contraseña (en este caso de un sólo uso) para enviarlo al servidor.
  • Así pues, cuando desde mi Mac me conecto con Tunnelblick, ahora me pide usuario y contraseña, siendo en este caso, de un solo uso.

Leer más...

19 noviembre 2008

Seguridad en redes inalámbricas

Mucho se ha hablado sobre la inseguridad de las redes wireless respecto a las claves WEP de 40 bits, que si se capturan los paquetes con IVs, etc etc,... y ya puedes navegar por la red del vecino. Parecía que la solución llegaba de forma intermedia antes de WPA2, mediante la utilización de WPA. La utilización de esta nueva tecnología para las comunicaciones inalámbricas caseras y corporativas supuso una gran revolución puesto que permitía enlazar con servidores de autenticación (Radius), claves compartidas (PSK o pre-shared keys) o certificados digitales. Se ha convertido en el estándard de facto.

Sin embargo WPA refuerza a WEP por la longitud del tamaño de clave (de 40 a 128 bits) y por longitudes de vectores de inicialización (IVs) de 48 bits, aunque se sigue utilizando el algoritmo simétrico RC4. Dada la longitud de clave utilizada se hace computacionalmente más duro reventar este tipo de algoritmo puesto que hay más combinaciones que probar.

Hace poco tiempo se publicó que se estaba aprovechando la potencia de las GPUs de las tarjetas gráficas Nvidia para efectuar ataques de fuerza bruta ante redes wifi con claves WPA y WPA2, de manera que el tiempo necesitado para comprometer redes se dividía por 100.

Las últimas noticias apuntan a que, parcialmente, el algoritmo WPA podría haber sido comprometido. En realidad esta noticia tan alarmista en realidad solo se refiere a WPA-PSK (es decir el basado en una clave compartida). No obstante, en Kriptópolis descartan ya WPA y se deja al final la esperanza de que al menos nos queda WPA2...

Mi duda es,.... ¿hasta cuándo durará imbatible WPA2? A lo largo de mi vida como consultor de seguridad, cuando una organización me ha pedido asesoría sobre cómo securizar sus redes wireless, he propuesto diferentes alternativas dependiendo del caso. Sin embargo, ha habido algo que, dada la criticidad de la información intercambiada, y la potencia de cálculo de las máquinas utilizadas, he recomendado como algo común: la utilización de tecnología VPN a lo largo de la red wifi.

Un despliegue clásico podría incluir una red wireless conectada contra un firewall que sólo permitiese tráfico VPN hasta un gateway de VPNs (en ocasiones hasta el mismo firewall puede realizar ese papel). Directamente antes de poder conectarse a la red interna, se hace necesario el establecimiento de un túnel VPN. De esta manera, se asociará una IP de rango interno (o un rango VPN) a un interfaz virtual en la máquina cliente de manera similar a como sucede cuando se hace desde Internet. Si confiamos en encapsular nuestro tráfico confidencial a través de la red de redes, ¿por qué no hacerlo en una red mucho menos arriesgada, como puede ser una red inalámbrica?

Para mentes aún más paranoicas, siempre se puede encapsular el tráfico VPN sobre una red wireless que obligue por supuesto un control de acceso por dirección física o MAC, y que utilice además WPA2 para cifrado a nivel de punto de acceso.

Desde SecurityByDefault recomendamos OpenVPN como alternativa libre basada en SSL con clientes para Windows, Linux y Macintosh, de fácil despliegue para este tipo de lides.

Yago recomendó tiempo atrás la utilización de un punto de acceso "fake" para emitir con el mismo SSID aunque en distinto canal en los límites físicos de la organización para engañar a atacantes externos.

¿Y tú, tienes algún otro mecanismo de securización de redes Wireless?
Leer más...