Actividad 11: OpenVPN en modo cliente-servidor SSL/TLS
El modo cliente-servidor de OpenVPN resulta conveniente porque facilita la conexión de varios clientes utilizando un mismo puerto y sin necesidad de abrir puertos en los routers de los clientes. Además proporciona la mayor de las seguridades al combinar cifrado y autenticación.
Para conseguir la mayor seguridad al realizar una VPN con OpenVPN se debe utilizar criptografía asimétrica (o de clave pública). Estos sistemas se inventaron para evitar el problema del intercambio de claves propio de los sistemas de cifrado simétricos.
Entre los inconvenientes de la criptografía asimétrica se encuentran:
- Es necesario un tamaño mayor de clave para garantizar la seguridad.
- El cifrado es más lento que un cifrado simétrico.
- El mensaje cifrado ocupa más espacio.
Por esto, en algunas aplicaciones se utilizan sistemas de criptografía híbrida en los que se combinan las dos técnicas. Se utiliza cifrado asimétrico para transmitir la clave simétrica a la otra estación, después se utiliza la clave simétrica para cifrar el mensaje (gran volumen de información) a transmitir. Como no es seguro confiar de forma continua en la misma clave simétrica, cada cierto tiempo se renegocian nuevas claves.
Para obtener conexiones seguras en Internet se utiliza el estandard SSL/TLS, que es un sistema de criptografía híbrida, pues se utiliza tanto el cifrado asimétrico como el simétrico.
Infraestructura de clave pública PKI
Para poder utilizar la criptografía de clave pública es necesario disponer de una infraestructura PKI (public key infraestructure).
Algunos de los elementos que forman una PKI son:
- Autoridad de certificación
- Es la entidad que gestiona (emitiendo y revocando) los certificados digitales. La Autoridad de Certificación (AC o CA en inglés) legitima ante terceros que confían en sus certificados la relación entre la identidad de un usuario y su clave pública.
- Certificado digital
- Documento digital mediante el que la AC garantiza la relación entre una persona (o entidad) y su clave pública. Normalmente se utiliza el estandard ITU - X.509 para definir el formato de los certificados digitales.
- Lista de revocación de certificados
- Como su nombre indica, es una lista de certificados que han dejado de ser válidos y ya no se debe confiar en ellos.
Generando una autoridad de certificación propia
Existen autoridades de certificación privadas como Thawte o Verisign. Y por primera vez Let's Encrypt permite obtener certificados reconocidos por los navegadores para HTTPS de manera gratuita. Pero no hay ningún problema en crear nuestra propia autoridad de certificación, de manera que con su certificado raíz podamos crear todos los certificados necesarios para los túneles en nuestra organización. Para tal fin se puede utilizar OpenSSL o GNU TLS.
Puede encontrar ejemplos sobre como crear la infraestructura PKI con OpenSSL en:
- https://openvpn.net/index.php/open-source/documentation/howto.html#pki
- OpenSSL Certificate Authority
En el primer documento se explica como utilizar los scripts easy-rsa pueden instalarse junto a OpenVPN y en el segundo se utilizan directamente las herramientas de OpenSSL para generar la autoridad de certificación y todas las claves.
En cualquier caso se debe obtener:
- Un certificado/clave de Autoridad de Certificación maestra para firmar el resto.
- Un certificado/clave para cada máquina.
Utilizando easy-rsa
Los scripts de easy-rsa están incluidos en un paquete que se puede instalar junto, o de manera independiente, a OpenVPN y permiten utilizar las herramientas de OpenSSL con facilidad.
- Haga una copia del directorio /usr/share/easy-rsa en el directorio de trabajo /home/<usuario>/easy-rsa. Este directorio será nuestra CA.
- Edite el fichero vars. Adapte los valores por defecto del certificado a conveniencia.
- Construya una nueva autoridad de certificación
[vcarceler@localhost 2.0]$ . ./vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /home/vcarceler/easy-rsa-2.0/2.0/keys
[vcarceler@localhost 2.0]$ ./clean-all
[vcarceler@localhost 2.0]$ ./build-ca
Generating a 1024 bit RSA private key
.............++++++
....++++++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [US]:ES
State or Province Name (full name) [CA]:Cataluña
Locality Name (eg, city) [SanFrancisco]:Santa_Coloma_de_Gramenet
Organization Name (eg, company) [Fort-Funston]:IES_Puig_Castellar
Organizational Unit Name (eg, section) []:xeill
Common Name (eg, your name or your server's hostname) [Fort-Funston CA]:IES Puig Castellar CA
Email Address [me@myhost.mydomain]:
[vcarceler@localhost 2.0]$ - Generar certificado y clave para el servidor
./build-key-server servidor
- Generar ceritificado y clave para el cliente1
./build-key cliente1
- Generar los parámetros Diffie Hellman
./build-dh
Actividad:
- A partir de la imagen virtual proporcionada por el profesor, realice dos clones que tengan por nombre: OpenVPN-Servidor y OpenVPN-Cliente1
- Asegúrese de que ambas máquinas tienen la interfaz de red en modo puente.
- Arranque cada una de las máquinas y cambie:
- El nombre de host a 'servidor' y/o 'cliente1' según corresponda.
- En la máquina OpenVPN-Servidor: La configuración de la tarjeta de red para que la interfaz tenga la IP estática 192.168.<AULA>.<200+X>. En la máquina OpenVPN-Cliente1 no necesitamos una IP estática, así que dejaremos la interfaz de red en modo dinámico.
- Instale el paquete easy-rsa. Y copie el contenido de /usr/share/easy-rsa en /home/usuari/easy-rsa.
- Construya una autoridad de certificación propia.
- Construya una clave de servidor.
- Construya 4 claves de cliente: cliente1, client2, cliente3, cliente4.
- Construya el fichero con los parámetros Diffie-Hellman.
port 1194 proto udp dev tap ca ca.crt cert servidor.crt key servidor.key dh dh2048.pem server 10.<X>.0.0 255.255.255.0 ifconfig-pool-persist ipp.txt #client-to-client keepalive 10 120 persist-key persist-tun status openvpn-status.log verb 3
client proto udp dev tap remote <IP SERVIDOR> 1194 nobind persist-key persist-tun ca ca.crt cert cliente1.crt key cliente1.key verb 3
- Que los dos clientes pueden mantener simultáneamente el túnel con el servidor.
- Que los túneles permiten: que cada cliente se comunique con el servidor y que el servidor se comunique con los dos clientes.
- Que los túneles no permiten que un cliente se comunique con otro.
- El contenido de los ficheros ipp.txt y openvpn-status.log en el servidor.