martes, 27 de octubre de 2015

INSTALAR OPENVPN MEDIANTE CERTIFICADOS X.509 EN RASPBERRY Pt.1

“Openvpn” es un programa “open source” para la creación de túneles seguros VPN (Virtual Private Network). Este no se basa en el protocolo IPsec como en la mayoría de las VPN, sino que se sustenta en el protocolo TLS/SSL.
Su objetivo principal es proporcionar los servicios de autentificación, confidencialidad e integridad.
Pero, ¿para que nos puede servir en nuestra Raspberry?. Pues por ejemplo para que nuestra navegación sea anónima si nos conectamos a una red pública, o también para poder acceder a un recurso compartido o servicio que se encuentre en nuestra red doméstica.
Utilizaremos en este caso el modo "Host to LAN", donde los clientes se pueden conectar de forma independiente desde el exterior al servidor, y éste los conectará a nuestra red privada de casa por medio de una interface virtual ("tun0"). Toda la comunicación entre cliente y servidor está encriptada a través del túnel.

OpenVPN se basa en OpenSSL para implementar SSL/TLS, y soporta dos modos de autentificación:
  • Por compartición de claves privadas (más sencilla y menos segura a la vez). Modo que veremos en próximos tutoriales.
  • Por certificados digitales con estándar X.509 (más compleja pero más segura). Esta será la opción que veremos en el tutorial.
Para empezar, instalamos el programa:

$ sudo apt-get install openvpn

Lo primero que haremos será crear todos los certificados:
  • ca.crt: Este es el certificado público de la CA, que tendremos que usar en todos los clientes y en el servidor.
  • servidor.crt y servidor.key: Certificado público y privado del servidor. Solo los usaremos en el este.
  • dh2048.pem: Contiene los parámetros Diffie-Hellman que se ubicarán sólo en el servidor.
  • usuario1.crt y usuario1.key: Certificados público y privado del usuario que utilizaremos para configurarlo  en su dispositivo.
OpenVPN proporciona unos archivos de ejemplos que nos servirán de ayuda para configurar de manera cómoda el servicio VPN ubicada en "/usr/share/doc/openvpn/examples".

Copiaremos el directorio de creación de certificados a nuestro directorio principal de configuración:

$ sudo cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0 /etc/openvpn/

Para crear ahora nuestra propia autoridad certificadora CA con RSA editaremos el archivo "vars" y modificamos las últimas líneas:

$ sudo nano /etc/openvpn/2.0/vars















En este archivo también otros aspectos importantes cómo el tiempo de expiración del certificado, el tamaño de la clave RSA,...

Para crear un mayor seguridad, modificaremos el tamaño de la clave de 1204 a 2048 bits. Buscamos la línea correspondiente y la modificamos:







Ahora exportaremos los datos introducidos en vars:

$ cd /etc/openvpn/2.0
$ sudo su
# source ./vars

Debemos comprobar y eliminar que no haya otros archivos en la carpeta "keys" para evitar un posible conflicto:

# ./clean-all

Ya que tenemos todo preparado. Iremos creando los diferentes certificados para adaptarlos a la configuración de "OPENVPN".

Primero crearemos las claves de la Autoridad Certificadora "CA":

# ./buil-ca












Veremos como se nos ha creado la carpeta "keys" con el primer certificado y clave:



Seguiremos los mismos pasos para la creación  del certificado "Diffie-Hellman":

# ./build-dh











Sólo nos quedará crear las claves del servidor y los clientes que se conectarán a él:

# ./build-key-server raspberrypi2
#  ./build-key usuario1

Rellenamos los campos como cuando creamos la CA. Nos pedirá si queremos poner una "passphrase" para resguardar el archivo, y posteriormente lo autofirmaremos.















Si queremos aumentar la seguridad de la comunicación, crearemos otra clave que se instalará en el servidor y los clientes respectivamente. Esto permitirá el uso de la autentificación TLS a través de firmas HMAC para verificar la integridad de los paquetes transmitidos entre el cliente y servidor. Así evitaremos ataques de Denegación de Servicios (DoS), ataques "Man in The Middle",...

Accederemos a la carpeta "keys" y aplicamos el siguiente comando:

$ sudo cd /etc/openvpn/2.0/keys
$ sudo openvpn --genkey --secret ta.key

Se nos generará una llave estática que copiaremos en el directorio principal y que después configuraremos en el archivo "server.conf":

$ sudo mv ta.key /etc/openvpn/

Una vez obtenidos los diferentes certificados y claves solo nos falta integrarlos al archivo de configuración de "OPENVPN".

El archivo de configuración por defecto no existe, por lo que exportaremos el  archivo estándar del directorio de ejemplos y lo descomprimimos:

# cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
# gunzip /etc/openvpn/server.conf.gz

Abrimos el archivo:

# nano /etc/openvpn/server.conf

Modificaremos las siguientes líneas:

local 192.168.0.101 # Definimos el servidor de escucha.
dev tun Interface virtual por el que se creara el túnel.
proto udp # Protocolo que utilizaremos para la conexión.
port 1194 # Puerto de escucha.
ca /etc/openvpn/2.0/keys/ca.crt # Certificado CA.
cert /etc/openvpn/2.0/keys/raspberypi2.crt  # Certificado del servidor .
key /etc/openvpn/2.0/keys/raspberrypi2.key # Clave privada del servidor.
dh dh2048.pem # Certificado Diffie Hellman.
server 10.8.0.0 255.255.255.0 # Definimos la subred en la cual la Raspberry asignara las #distintas ips a los clientes VPN.
ifconfig-pool-persist ipp.txt # Logs que contendra el registro de las ip de los clientes que se #conecten.
push “route 192.168.0.0 255.255.255.0”  # Permite al cliente conectarse a la red interna por la interface "tun0".
push “dhcp-option DNS 8.8.8.8" # Definimos los servidores a través de la cual los clientes #realizarán sus peticiones DNS.
client-to-client # Permite a los clientes verse entre sí.
tls-auth ta.key 0 # Clave para a la autentificación TLS
max-clients 5 Número máximo de clientes que se pueden conectar de forma #simultanea. 

Reiniciamos el servidor para que nuestra configuración surta efecto:

# sudo /etc/init.d/openvpn restart

Si no nos devuelve ningún error, pasaremos a la configuración del enrutamiento para que los clientes puedan acceder a nuestra subred.
Lo primero que debemos hacer es activar el bit "ip forwarding" para que nuestra Raspberry actúe como router y pueda reenviar los paquetes que pasan a través de él.

Editamos el siguiente archivo:

$ sudo nano /etc/sysctl.conf

Descomentamos la siguiente línea:

net.ipv4.ip_forward=1

En nuestro caso, tenemos instalado "UFW" como firewall por lo que editaremos:

$ sudo nano /etc/ufw/sysctl.conf

Modificamos el parámetro:

net/ipv4/ip_forward=1

El siguiente paso será configurar las reglas de tráfico para que sea enrutado de manera correcta.

Abrimos el archivo:

$ sudo nano /etc/default/ufw

Modificando esta línea habilitamos la política del firewall para que acepte por defecto los reenvíos de paquetes:

DEFAULT_FORWARD_POLICY="ACCEPT"

A continuación vamos a añadir la reglas "UFW" adicionales para la traducción de direcciones de red y el enmascaramiento de los clientes VPN:

$ sudo nano /etc/ufw/before.rules

Introducimos esta configuración justo después de esta línea:


# Don't delete these required lines, otherwise there will be error
# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]
# Permitir el tráfico VPN a través de la interface etho0
-A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE
COMMIT 

Por último crearemos una regla para abrir el puerto UDP 1194, que es el que utiliza por defecto "OPENVPN":

$ sudo ufw allow 1194/udp

Desactivamos y activamos el cortafuegos para que cargue las modificaciones que hemos hecho:

$ sudo ufw disable
$ sudo ufw enable

Ya tenemos nuestro servidor VPN listo. Solo nos queda la configuración en los clientes.
Pero eso será en nuestro próximo tutorial, donde configuraremos los clientes en Windows y Android.

Hasta luego.....

No hay comentarios:

Publicar un comentario