Actividad 11: OpenVPN en modo cliente-servidor SSL/TLS

per Victor Carceler darrera modificació 2020-03-25T15:26:22+01:00

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:

 

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.

  1. Haga una copia del directorio /usr/share/easy-rsa en el directorio de trabajo /home/<usuario>/easy-rsa. Este directorio será nuestra CA.
  2. Edite el fichero vars. Adapte los valores por defecto del certificado a conveniencia.
  3. 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]$
  4. Generar certificado y clave para el servidor
    ./build-key-server servidor
  5. Generar ceritificado y clave para el cliente1
    ./build-key cliente1
  6. Generar los parámetros Diffie Hellman
    ./build-dh

 

Actividad:

  1. A partir de la imagen virtual proporcionada por el profesor, realice dos clones que tengan por nombre: OpenVPN-Servidor y OpenVPN-Cliente1
  2. Asegúrese de que ambas máquinas tienen la interfaz de red en modo puente.
  3. 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.
  • Reinicie ambas máquinas, compruebe que arrancan de manera adecuada. Que puede hacer SSH desde el host físico y que, en las máquinas virtuales, puede ejecutar el comando: apt update. (Recuerde que para que OpenVPN-Servidor pueda acceder a Internet deberá tener configurada una puerta de enlace y un servidor DNS válido configurado en /etc/network/interfaces utilizando las directivas gateway y dns_nameservers).
  • Ambas máquinas: utilice apt install openvpn para instalar OpenVPN. Observe la velocidad de descarga de los paquetes. ¿Ha variado? ¿se han producido aciertos de cache en el proxy Squid que sirve al aula?
  • En la máquina OpenVPN-Servidor:
    • 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.
  • En la máquina OpenVPN-Servidor, configure un túnel OpenVPN con un fichero de configuración /etc/openvpn/servidor.conftal que:
    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
  • En la máquina OpenVPN-Servidor: copie los ficheros necesarios desde la autoridad de certificacion a /etc/openvpn. Reinicie la máquina y compruebe que el túnel arranca. Compruebe qué contienen los ficheros ipp.txt y openvpn-status.log.
  • En la máquina OpenVPN-Cliente1: Edite el fichero de configuración de OpenVPN /etc/openvpn/cliente1.confdel siguiente modo:
    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
  • Lleve a OpenVPN-Cliente1 los ficheros de la autoridad de certificación necesarios. Reinicie la maquina cliente y compruebe que al arrancar se establece un túnel. Compruebe que es posible comunicar el cliente y el servidor utilizando el túnel. Compruebe el contenido de los ficheros ipp.txt y openvpn-status.log en el servidor.
  • Prepare una nueva máquina OpenVPN-Cliente2 de manera que también establezca un túnel con el servidor utilizando para ello la clave cliente2.
  • Compruebe:
    • 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.
  • Que si en el servidor se activa la opción client-to-client, entonces un cliente puede comunicarse con otro.
  • Proporcione las claves cliente3 y cliente4 a diferentes compañeros. Obtenga un par de claves de otros compañeros, y utilice estas claves para establecer dos nuevos túneles desde OpenVPN-Servidor a los servidores de sus compañeros.