Solución para gestión remota con OpenVPN, TigerVNC y Guacamole – PART 1

Los días de pandemia han llevado a que muchas empresas se enfoquen en la continuidad de sus labores desde los hogares, mediante el tele-trabajo. Ante la necesidad de seguir trabajando, desde un ambiente seguro, siempre que sea necesario, ha llevado al autor de este artículo a realizar un estudio profundo sobre diversas herramientas del Software Libre (SWL) que permitan realizar una gestión segura de la red. Sin embargo, aun cuando la necesidad impere, el mismo ha de cumplir con estrictos requerimientos en seguridad, para hacer que la información de gestión no se vea comprometida. Pudieran abrirse todo un debate alrededor de este artículo, sobre el por qué haber seleccionado una solución u otra, habiendo otras quizá mejores, como sería el caso de WireGuard para la VPN. Quisiera aclarar que este tutorial es una implementación práctica del proyecto de gestión remota de mi empresa y que según su especialista de seguridad informática y del MININT, sólo podía usar las últimas versiones de OpenVPN y OpenSSL. Ante dichos requerimiento, comencé a enarbolar una solución que les vendrá de «perlas» a aquellos administradores que quieran gestionar la red desde cualquier punto de la red, de manera segura.

1.    ¿Qué es lo que se busca con este tutorial?

En este tutorial analizaremos una aplicación práctica en la que se logra gestión remota de la red con encriptación de los datos de extremo a extremo, mediante un túnel VPN o HTTPS, según de dónde provenga la conexión. El siguiente escenario de red nos muestra la distribución de estos servidores y los posibles accesos a estos para la gestión remota:

Este estudio les será de mucha ayuda para el caso de una red gestionada por varios administradores, desde dentro y fuera de la misma, pues permitirá la gestión por individual para cada administrador, sin entorpecer el trabajo de uno con el del otro. Mientras que si se trata de una red administrada por un único administrador, le serviría más la parte de la conectividad VPN para el acceso remoto, pues la gestión de la red aislada a través del host “tservice” puede ser resuelta con una VPN dedicada a esto desde la LAN y WAN1, aunque no se descarta la posibilidad de implementar el RDG Guacamole, permitiendo así una escalabilidad en la gestión de la red aislada.

NOTA: No es obligatorio el uso de dos cortafuegos en la infraestructura de la red, pero al menos uno de ellos es recomendado, para aislar los servidores de la DMZ de los de la GI. En este tutorial se tratan conceptos propios, como el relacionado a la red aislada. Cuando se haga referencia a dicho término, se refiere a la red de virtualización, almacenamiento y gestión de almacenamiento, que no debe estar enrutada por la red pública.

Para el caso del host “vpn”:

  • Host sobre el cual se encuentra el servidor “ovpn10” (para TUN10) y “ovpn11” (para TUN11).
  • Controlará el acceso remoto desde internet, mediante TUN10 y TUN11. El host “tservice” será un cliente más del host “vpn” para TUN10 y TUN11.
  • El TUN10 túnel garantizará la comunicación entre clientes (opción “client-to-client” requerida en el OpenVPN), para que los administradores que accedan desde la WAN2, con una dirección IP dentro del TUN10, puedan acceder al “tservice” por la IP obtenida por este, dentro del mismo túnel. De esta manera se completaría el camino cifrado de extremo a extremo, sin comprometer la información de gestión. Se re quiere una cuenta en el Directorio Activo, además de los certificados y llaves necesarias, para poder autenticarse satisfactoriamente en el “ovpn10”.
  • El TUN11 servirá con el mismo propósito, pero su autenticación será por PAM, usuarios del sistema del propio host “vpn” que serán creados para este servicio. Estos usuarios son aquellos casos a los que se les quiere dar acceso a la red aislada de la empresa y no pertenecen directamente a ella, lo cual implicaría que no tengan una cuenta en el AD y por ello, la necesidad de usar otro método de autenticación y otro túnel VPN (no puede haber dos métodos de autenticación habilitados en uno mismo).

Para el caso del host “tservice”:

  • Permite gestionar los nodos de virtualización y almacenamiento, sirviendo como intermediario.
  • Cuenta con un entorno grafico para acceder vía web a los WebGUI de los nodos de virtualización y almacenamiento.
  • Tiene instalado el servicio Guacamole, que funciona como RDG (Remote Desktop Gateway). El trafico web está encriptado con TLSv1.2 y TLSv1.3, permitiendo los cifrados de tipo AEAD y PFS. El servidor web tiene redirección permanente de HTTP a HTTPS para los usuarios fuera del TUN10 y TUN11 y en los túneles solo se usará TLSv1.3 para el tráfico web.
  • También cuenta con un servidor VNC, para que, desde Guacamole se pueda hacer conexiones de escritorio remoto, usando su cliente VNC integrado.
  • La red de los nodos de virtualización y almacenamiento se encuentran en una red aislada. A dicha red sólo tiene acceso el host “tservice”, y con el uso de las herramientas anteriormente mencionadas, se podrán gestionar remotamente y de forma segura, desde otros puntos de la red pública (LAN, WAN1 y WAN2).
  • Seguridad para los diferentes tipos de accesos al cliente web de Guacamole (tomcat9), desde la red pública:

1.1.       Datos

Versiones del sistema y principales paquetes:

 Sistema Operativo de los hosts “vpn” y “tservice”: Debian 10.8

  • openvpn: 2.5.0, por repos de Bullseye (Debian 11 o testing)
  • easy-rsa: 3.0.6, por repos de Buster (Debian 10)
  • openssl: 1.1.1i, por repos de Bullseye
  • libssl-dev: 1.1.1i, por repos de Bullseye
  • openjdk: 11.0.9.1, por repos de Buster
  • guacamole: 1.3.0, por fuentes
  • tigervnc: 1.9.0, por repos de Buster

NOTA: Tratar de usar las mismas versiones u otras mas actuales de los paquetes indicados anteriormente.

Datos de red pública:

  •  vpn: 192.168.130.103
  • tservice: 192.168.120.50

Datos de red privada TUN10:

  • vpn: 192.168.254.1
  • tservice: 192.168.254.50

Datos de red privada TUN11:

  • vpn: 192.168.253.1
  • tservice: 192.168.253.50

2.    Configuraciones en host “vpn”

En este apartado, se procederá con la configuración del servicio de VPN, basado en la propuesta de OpenVPN. Se usará una configuración estricta en la seguridad, según los requerimientos del órgano de la seguridad en nuestro país (Cuba), por el MININT, al momento de ser redactado este documento.

Por la estructura en la que se configurará el TUN10, si llegase a ser necesario en el futuro, el host “vpn” tendrá una estructura de directorios capaz de albergar varias instancias de openvpn de manera simultánea, siempre y cuando los recursos hardware del servidor lo permitan. Basta solamente con repetir el procedimiento para un nuevo “ovpnXY” y TUNXY.

2.1.       Instalación de OpenVPN

Habilitamos el reenvío de paquetes de manera permanente:

echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf

Creamos los directorios raíz de cada uno de los servidores ovpn:

mkdir /etc/openvpn/server/ovpn10
mkdir /etc/openvpn/server/ovpn11

Directorio para configurar la reservación de IP por el tunel ovpnXY:

mkdir /etc/openvpn/server/ovpn10/ccd
chmod +x /etc/openvpn/server/ovpn10/ccd
mkdir /etc/openvpn/server/ovpn11/ccd
chmod +x /etc/openvpn/server/ovpn11/ccd

Directorio para albergar las herramientas para la PKI:

mkdir /etc/openvpn/server/ovpn10/easy-rsa
mkdir /etc/openvpn/server/ovpn11/easy-rsa

Directorio que albergará la ca, certificado y llaves del servidor:

mkdir /etc/openvpn/server/ovpn10/auth
mkdir /etc/openvpn/server/ovpn11/auth

Instalamos OpenSSL y libssl1.1 (1.1.1d), easy-rsa (3.0.6-1) y openvpn (2.4.7-1) por los repos oficiales de Buster:

apt install openssl libssl-dev easy-rsa openvpn -y

Los repos de Buster no vienen con OpenSSL 1.1.1i ni sus librerías. Para ello apuntaremos momentáneamente a los repos de Bullseye e instalaremos dichos paquetes:

echo "deb [trusted=yes] https://ftp.debian.org/debian bullseye main contrib non-free" > /etc/apt/sources.list.d/bullseye.list
apt update

Instalación de OpenSSL (1.1.1i) y sus librerías actualizadas

apt install openssl libssl-dev -y

Verificamos la versión instalada:

openssl version

Debe devolver algo, como lo siguiente:

OpenSSL 1.1.1i  8 Dec 2020

Instalación de OpenVPN (2.5.0-1) y su módulo de autenticación LDAP:

apt install openvpn openvpn-auth-ldap -y

Verificamos la versión instalada de openvpn:

openvpn --version

Debe devolver algo, como lo siguiente:

OpenVPN 2.5.0 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Oct 28 2020
library versions: OpenSSL 1.1.1i  8 Dec 2020, LZO 2.10
Originally developed by James Yonan
Copyright (C) 2002-2018 OpenVPN Inc <sales@openvpn.net>
Compile time defines: enable_async_push=no enable_comp_stub=no enable_crypto_ofb_cfb=yes enable_debug=yes enable_def_auth=yes enable_dependency_tracking=no enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown enable_fast_install=needless enable_fragment=yes enable_iproute2=no enable_libtool_lock=yes enable_lz4=yes enable_lzo=yes enable_maintainer_mode=no enable_management=yes enable_multihome=yes enable_option_checking=no enable_pam_dlopen=no enable_pedantic=no enable_pf=yes enable_pkcs11=yes enable_plugin_auth_pam=yes enable_plugin_down_root=yes enable_plugins=yes enable_port_share=yes enable_selinux=no enable_shared=yes enable_shared_with_static_runtimes=no enable_silent_rules=no enable_small=no enable_static=yes enable_strict=no enable_strict_options=no enable_systemd=yes enable_werror=no enable_win32_dll=yes enable_x509_alt_username=yes with_aix_soname=aix with_crypto_library=openssl with_gnu_ld=yes with_mem_check=no with_sysroot=no

Comentamos los repos de Bullseye y volvemos actualizar el listado:

echo "#deb https://ftp.debian.org/debian bullseye main contrib non-free" > /etc/apt/sources.list.d/bullseye.list
apt update

Creamos el siguiente enlace simbólico:

ln -s /usr/sbin/openvpn /usr/local/sbin/

2.2.       Configuración de la PKI

Copiar el directorio “/usr/share/easy-rsa/” y pegarlo en “/etc/openvpn/server/ovpnXY/easy-rsa”:

cp -rv /usr/share/easy-rsa/* /etc/openvpn/server/ovpn10/easy-rsa/

Acceder al directorio “/etc/openvpn/server/ovpn10/easy-rsa/”:

cd /etc/openvpn/server/ovpn10/easy-rsa/

Usamos el fichero “vars.example”:

cp vars.example vars

Editamos el fichero “vars”:

nano vars

Modificamos las siguientes líneas, según el entorno de la red:

# [...]
set_var EASYRSA_REQ_COUNTRY     "CU"
set_var EASYRSA_REQ_PROVINCE    "Habana"
set_var EASYRSA_REQ_CITY        "La Habana"
set_var EASYRSA_REQ_ORG         "EMPRESA"
set_var EASYRSA_REQ_EMAIL       "postmaster@empresa.midominio.cu"
set_var EASYRSA_REQ_OU          "Redes"
# [...]
# Longitud del parametro DH
set_var EASYRSA_KEY_SIZE        4096
# [...]
# Fecha de expiracion de la CA
set_var EASYRSA_CA_EXPIRE       730
# [...]
# Fecha de expiracion del certificado
set_var EASYRSA_CERT_EXPIRE     730
# [...]

Inicializando la PKI:

./easyrsa init-pki

Debe devolver lo siguiente:

Note: using Easy-RSA configuration from: ./vars

init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /etc/openvpn/server/ovpn10/easy-rsa/pki

Copiamos el fichero “openssl-easyrsa.cnf” al nuevo directorio creado para la PKI:

cp openssl-easyrsa.cnf pki/

Construimos la ca sin contraseña:

./easyrsa build-ca nopass

Debe devolver lo siguiente:

Note: using Easy-RSA configuration from: ./vars
Using SSL: openssl OpenSSL 1.1.1i  8 Dec 2020 (Library: OpenSSL 1.1.1d  10 Sep 2019)
Generating RSA private key, 2048 bit long modulus (2 primes)
........................+++++
........................................+++++
e is 65537 (0x010001)
Can't load /etc/openvpn/server/ovpn10/easy-rsa/pki/.rnd into RNG
140105689179264:error:2406F079:random number generator:RAND_load_file:Cannot open file:../crypto/rand/randfile.c:98:Filename=/etc/openvpn/server/ovpn10/easy-rsa/pki/.rnd
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.
-----
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:ovpn10-ca

CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/etc/openvpn/server/ovpn10/easy-rsa/pki/ca.crt

Generamos el parámetro DH:

./easyrsa gen-dh

Debe devolver al final lo siguiente:

# [...]
DH parameters of size 4096 created at /etc/openvpn/server/ovpn10/easy-rsa/pki/dh.pem

Generamos la llave del servidor “ovpn10” sin contraseña:

./easyrsa build-server-full ovpn10 nopass

Debe devolver lo siguiente:

Note: using Easy-RSA configuration from: ./vars
Using SSL: openssl OpenSSL 1.1.1i  8 Dec 2020 (Library: OpenSSL 1.1.1d  10 Sep 2019)
Generating a RSA private key
...............+++++
............................................................................+++++
writing new private key to '/etc/openvpn/server/ovpn10/easy-rsa/pki/private/ovpn10.key.A89rT0cdo2'
-----
Using configuration from /etc/openvpn/server/ovpn10/easy-rsa/pki/safessl-easyrsa.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'ovpn10'
Certificate is to be certified until Feb  6 00:39:07 2023 GMT (730 days)

Write out database with 1 new entries
Data Base Updated

Copiar los archivos del servidor:

cp /etc/openvpn/server/ovpn10/easy-rsa/pki/ca.crt /etc/openvpn/server/ovpn10/auth
cp /etc/openvpn/server/ovpn10/easy-rsa/pki/private/ovpn10.key /etc/openvpn/server/ovpn10/auth
cp /etc/openvpn/server/ovpn10/easy-rsa/pki/issued/ovpn10.crt /etc/openvpn/server/ovpn10/auth
cp /etc/openvpn/server/ovpn10/easy-rsa/pki/dh.pem /etc/openvpn/server/ovpn10

Hasta aquí se encuentra configurada la PKI para “ovpn10”.

NOTA: Para el “ovpn11” se debe hacer lo mismo, respetando sus directorios y nombre de CA:

2.3.       Instancia OpenVPN en modo servidor con autenticación LDAP

Editando el fichero de configuración del servidor “onvpn10”:

nano /etc/openvpn/server/ovpn10.conf

Adaptando a su entorno:

#     ____                 _    ______  _   __   _____
#    / __ \____  ___  ____| |  / / __ \/ | / /  / ___/___  ______   _____  _____
#   / / / / __ \/ _ \/ __ \ | / / /_/ /  |/ /   \__ \/ _ \/ ___/ | / / _ \/ ___/
#  / /_/ / /_/ /  __/ / / / |/ / ____/ /|  /   ___/ /  __/ /   | |/ /  __/ /
#  \____/ .___/\___/_/ /_/|___/_/   /_/ |_/   /____/\___/_/    |___/\___/_/
#      /_/

# IP publica del servidor ovpn
local 192.168.130.103

# Puerto de escucha del servidor ovpn
port 11940

# Protocolo de transporte a usar
proto udp

# Tipo de interfaz
dev tun10

# Rutas para CA, DH, y certificado y llave del servidor, con las capas de TLS activadas
tls-server
ca      /etc/openvpn/server/ovpn10/auth/ca.crt
cert    /etc/openvpn/server/ovpn10/auth/ovpn10.crt
key     /etc/openvpn/server/ovpn10/auth/ovpn10.key
dh      /etc/openvpn/server/ovpn10/dh.pem

# Toplogia
topology subnet

# Subred a utilizar para el tunel
server 192.168.254.0 255.255.255.0

# Configuraciones persistentes para los clientes
ifconfig-pool-persist ipp.txt

# Rutas especificas, no persistentes, para todos los clientes
;push "route 192.168.100.0 255.255.255.0"
;push "route 192.168.110.0 255.255.255.0"
;push "route 192.168.111.0 255.255.255.0"

# Hacer que todo el trafico de red del cliente viaje a traves del tunel
# (ruta por defecto)
;push "redirect-gateway def1 bypass-dhcp"

# Definir el DNS
push "dhcp-option DNS 192.168.120.31"

# Bloquear filtraciones DNS fuera del tunel, para clientes sobre Windows
;push "block-outside-dns"

# Configuraciones especificas, no persistentes, para los clientes
client-config-dir /etc/openvpn/server/ovpn10/ccd

# Mensajes de verificacion cada 10s. Si no hay mensajes recibidos en 120s, se asume que el peer esta caido
keepalive 10 120

# HMAC firewall con encriptacion de mensajes con llave pre-compartida
tls-crypt /etc/openvpn/server/ovpn10/auth/ta.key 0

# Usar TLSv1.2, como minimo
tls-version-min 1.2

# Autorizar cifrados de tipo AEAD y Perfect Forward Secrecy (FS-ECDHE) para TLSv1.2
tls-cipher ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256

# Autorizar los cifrados de TLSv1.3
tls-ciphersuites TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256

# Usar AES-GCM para cifrado de datos
cipher AES-256-GCM

# Usar SHA-2 para autenticar datos como una funcion de control
auth SHA512

# Autenticar usuarios por LDAP
plugin /usr/lib/openvpn/openvpn-auth-ldap.so /etc/openvpn/server/ovpn10/ldap.conf

# Renegociar llaves de encriptacion cada 1h
reneg-sec 3600

# Verificar si el certificado del cliente esta revocado
;crl-verify /etc/openvpn/server/ovpn10/auth/crl.pem

# Para certificados con el estandar X509v3 de la UIT
remote-cert-eku "TLS Web Client Authentication"

# Metodo de compresion no vulnerable al ataque "VORACLE"
compress lz4-v2
push "compress lz4-v2"

# Numero maximo de clientes conectados
max-clients 10

# Para sistemas que no sean Windows
user nobody
group nogroup

# Mantener estado de llave e interfaz, aun despues del reinicio
persist-key
persist-tun

# Logs y estado del servidor
status  /var/log/openvpn/ovpn10-status.log
log     /var/log/openvpn/ovpn10.log

# Nivel de verbosidad de los logs
verb 3

# Notificar al cliente cuando el servidor reinicia, para que se conecte reconecte automaticamente
explicit-exit-notify 1

# Habilitar que los clientes puedan comunicarse entre ellos
client-to-client

Generamos la llave especificada en los ficheros de configuración anterior, para autenticación HMAC:

openvpn --genkey secret /etc/openvpn/server/ovpn10/auth/ta.key

Se quiere configurar autenticación LDAP para el TUN10, ya que los usuarios que vayan a hacer uso de este túnel, son usuarios del AD. Para ello, debemos seguir los pasos que se explican en esta sección.

NOTA: Se requiere haber instalado el módulo de autenticación de LDAP para OpenVPN “openvpn-auth-ldap”

Copiamos el siguiente ejemplo de configuración de la documentación:

cp /usr/share/doc/openvpn-auth-ldap/examples/auth-ldap.conf /etc/openvpn/server/ovpn10/ldap.conf

Editamos el fichero:

nano /etc/openvpn/server/ovpn10/ldap.conf

Lo modificamos, según los datos de su red. En este caso se trata de un AD basado en Samba4, por tanto, usaremos los esquemas para la autenticación contra su LDAP. En este caso no usaremos una conexión cifrada con el LDAP:

<LDAP>
        # LDAP server URL
        URL             ldap://dc1.empresa.midominio.cu
        # Bind DN (If your LDAP server doesn't support anonymous binds)
        BindDN          cn=administrator,cn=Users,dc=empresa,dc=midominio,dc=cu
        # Bind Password
        Password        Admin*123
        # Network timeout (in seconds)
        Timeout         15
        # Enable Start TLS
        TLSEnable       no
        # Follow LDAP Referrals (anonymously)
        FollowReferrals no
</LDAP>

<Authorization>
        # Base DN (Tiene que tener, al menos, un OU para que funcione)
        BaseDN          "ou=Usuarios,dc=empresa,dc=midominio,dc=cu"
        # User Search Filter
        SearchFilter    "(sAMAccountName=%u)"
        # Require Group Membership
        RequireGroup    false
</Authorization>

Instalamos las herramientas necesarias para encuestar el LDAP y hacer unas pruebas de conexión con el servicio:

apt install ldap-utils -y

Verificamos que podamos obtener información del LDAP del AD:

ldapsearch -z 0 -H ldap://dc1.empresa.midominio.cu:389 -W -D "cn=administrator,cn=Users,dc=empresa,dc=midominio,dc=cu" -b " dc=empresa,dc=midominio,dc=cu" "(sAMAccountName=franco.diaz)"

Si se ponen los datos correctamente, podremos ver la información solicitada.

Habilitamos los servicios para que inicie con el sistema la instancia openvpn:

systemctl enable openvpn-server@ovpn10

Debe devolver lo siguiente:

Created symlink /etc/systemd/system/multi-user.target.wants/openvpn-server@ovpn10.service → /lib/systemd/system/openvpn-server@.service.

Iniciamos los servicios de cada instancia openvpn:

systemctl start openvpn-server@ovpn10

Hasta este punto, la instancia “ovpn10” se encuentra lista para ser inicializada y esperando por conexiones provenientes de los clientes.

Con el comando “ifconfig” podemos verificar la interfaz virtual iniciada para TUN10.

2.4.       Instancia OpenVPN en modo servidor con autenticación PAM

Editando el fichero de configuración del servidor “onvpn11”:

nano /etc/openvpn/server/ovpn11.conf

Adaptando a su entorno:

#     ____                 _    ______  _   __   _____
#    / __ \____  ___  ____| |  / / __ \/ | / /  / ___/___  ______   _____  _____
#   / / / / __ \/ _ \/ __ \ | / / /_/ /  |/ /   \__ \/ _ \/ ___/ | / / _ \/ ___/
#  / /_/ / /_/ /  __/ / / / |/ / ____/ /|  /   ___/ /  __/ /   | |/ /  __/ /
#  \____/ .___/\___/_/ /_/|___/_/   /_/ |_/   /____/\___/_/    |___/\___/_/
#      /_/

# IP publica del servidor ovpn
local 192.168.130.103

# Puerto de escucha del servidor ovpn
port 11941

# Protocolo de transporte a usar
proto udp

# Tipo de interfaz
dev tun11

# Rutas para CA, DH, y certificado y llave del servidor, con las capas de TLS activadas
tls-server
ca      /etc/openvpn/server/ovpn11/auth/ca.crt
cert    /etc/openvpn/server/ovpn11/auth/ovpn11.crt
key     /etc/openvpn/server/ovpn11/auth/ovpn11.key
dh      /etc/openvpn/server/ovpn11/dh.pem

# Toplogia
topology subnet

# Subred a utilizar para el tunel
server 192.168.253.0 255.255.255.0

# Configuraciones persistentes para los clientes
ifconfig-pool-persist ipp.txt

# Rutas especificas, no persistentes, para todos los clientes
;push "route 192.168.100.0 255.255.255.0"
;push "route 192.168.110.0 255.255.255.0"
;push "route 192.168.111.0 255.255.255.0"

# Hacer que todo el trafico de red del cliente viaje a traves del tunel
# (ruta por defecto)
;push "redirect-gateway def1 bypass-dhcp"

# Definir el DNS
push "dhcp-option DNS 192.168.120.31"

# Bloquear filtraciones DNS fuera del tunel, para clientes sobre Windows
;push "block-outside-dns"

# Configuraciones especificas, no persistentes, para los clientes
client-config-dir /etc/openvpn/server/ovpn11/ccd

# Mensajes de verificacion cada 10s. Si no hay mensajes recibidos en 120s, se asume que el peer esta caido
keepalive 10 120

# HMAC firewall con encriptacion de mensajes con llave pre-compartida
tls-crypt /etc/openvpn/server/ovpn11/auth/ta.key 0

# Usar TLSv1.2, como minimo
tls-version-min 1.2

# Autorizar cifrados de tipo AEAD y Perfect Forward Secrecy (FS-ECDHE) para TLSv1.2
tls-cipher ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256

# Autorizar los cifrados de TLSv1.3
tls-ciphersuites TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256

# Usar AES-GCM para cifrado de datos
cipher AES-256-GCM

# Usar SHA-2 para autenticar datos como una funcion de control
auth SHA512

# Autenticar usuarios por PAM (del sistema)
plugin /usr/lib/x86_64-linux-gnu/openvpn/plugins/openvpn-plugin-auth-pam.so login

# Renegociar llaves de encriptacion cada 1h
reneg-sec 3600

# Verificar si el certificado del cliente esta revocado
;crl-verify /etc/openvpn/server/ovpn11/auth/crl.pem

# Para certificados con el estandar X509v3 de la UIT
remote-cert-eku "TLS Web Client Authentication"

# Metodo de compresion no vulnerable al ataque "VORACLE"
compress lz4-v2
push "compress lz4-v2"

# Numero maximo de clientes conectados
max-clients 10

# Para sistemas que no sean Windows
user nobody
group nogroup

# Mantener estado de llave e interfaz, aun despues del reinicio
persist-key
persist-tun

# Logs y estado del servidor
status  /var/log/openvpn/ovpn11-status.log
log     /var/log/openvpn/ovpn11.log

# Nivel de verbosidad de los logs
verb 3

# Notificar al cliente cuando el servidor reinicia, para que se conecte reconecte automaticamente
explicit-exit-notify 1

# Habilitar que los clientes puedan comunicarse entre ellos
client-to-client

Generamos la llave especificada en los ficheros de configuración anterior, para autenticación HMAC:

openvpn --genkey secret /etc/openvpn/server/ovpn11/auth/ta.key

Como usaremos autenticación PAM, creamos el usuario con el siguiente comando:

adduser --system --no-create-home --force-badname --group tservice

Creamos la contraseña para el usuario creado:

passwd tservice

Debe devolver lo siguiente:

Nueva contraseña:*****
Vuelva a escribir la nueva contraseña:*****
passwd: contraseña actualizada correctamente

Habilitamos los servicios para que inicie con el sistema la instancia openvpn:

systemctl enable openvpn-server@ovpn11

Debe devolver lo siguiente:

Created symlink /etc/systemd/system/multi-user.target.wants/openvpn-server@ovpn11.service → /lib/systemd/system/openvpn-server@.service.

Iniciamos los servicios de la instancia openvpn:

systemctl start openvpn-server@ovpn11

Hasta este punto, la instancia “ovpn11” se encuentra lista para ser inicializada y esperando por conexiones provenientes de los clientes.

Con el comando “ifconfig” podemos verificar la interfaz virtual iniciada para TUN11.

2.5.       Emisión de certificados auto-firmados

Este apartado se explica cómo generar certificados auto-firmados. En esta ocasión se utiliza como ejemplo la emisión de los certificados el usuario “tservice”, el cual será el usuario que use el host “tservice” para establecer una conexión con las instancias openvpn del TUN10 y TUN11. Este host requiere establecer conexiones por ambos túneles, para que pueda dar acceso a los usuarios, tanto del AD como los de PAM que están dentro de las instancias de VPN.

Creamos los ficheros para el host “tservice”, donde reservaremos su dirección IP en los túneles.

echo "ifconfig-push  192.168.254.50 255.255.255.0" > /etc/openvpn/server/ovpn10/ccd/tservice
echo "ifconfig-push  192.168.253.50 255.255.255.0" > /etc/openvpn/server/ovpn11/ccd/tservice

Accedemos al directorio donde se encuentra la PKI de ovpn10:

cd /etc/openvpn/server/ovpn10/easy-rsa

Generamos el certificado para el cliente “tservice” con contraseña. De esta manera el cliente del servidor deberá tener una cuenta, en este caso en el AD (autenticación LDAP en para el TUN10), la CA, los certificados y llaves del cliente, y la contraseña del certificado:

./easyrsa build-client-full tservice

Debe devolver lo siguiente:

Note: using Easy-RSA configuration from: ./vars
Using SSL: openssl OpenSSL 1.1.1i  8 Dec 2020
Generating a RSA private key
.......+++++
...................+++++
writing new private key to '/etc/openvpn/server/ovpn10/easy-rsa/pki/private/tservice.key.Eu80kmerxe'
Enter PEM pass phrase:*****
Verifying - Enter PEM pass phrase:*****
-----
Using configuration from /etc/openvpn/server/ovpn10/easy-rsa/pki/safessl-easyrsa.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'tservice'
Certificate is to be certified until Feb  6 01:16:43 2023 GMT (730 days)

Write out database with 1 new entries
Data Base Updated

Accedemos al directorio donde se encuentra la PKI de ovpn11:

cd /etc/openvpn/server/ovpn11/easy-rsa

Generamos el certificado para el cliente “tservice”, esta vez para el TUN11.

./easyrsa build-client-full tservice

Debe devolver lo siguiente:

Note: using Easy-RSA configuration from: ./vars
Using SSL: openssl OpenSSL 1.1.1i  8 Dec 2020
Generating a RSA private key
.......+++++
...................+++++
writing new private key to '/etc/openvpn/server/ovpn11/easy-rsa/pki/private/tservice.key.Eu80kmerxe'
Enter PEM pass phrase:*****
Verifying - Enter PEM pass phrase:*****
-----
Using configuration from /etc/openvpn/server/ovpn11/easy-rsa/pki/safessl-easyrsa.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'tservice'
Certificate is to be certified until Feb  6 01:16:43 2023 GMT (730 days)

Write out database with 1 new entries
Data Base Updated

Copiamos los certificados del usuario “tservice”, para el TUN10, al directorio especificado por el servidor:

cp /etc/openvpn/server/ovpn10/easy-rsa/pki/issued/tservice.crt /etc/openvpn/server/ovpn10/auth/tservice.crt
cp /etc/openvpn/server/ovpn10/easy-rsa/pki/private/tservice.key /etc/openvpn/server/ovpn10/auth/tservice.key

Copiamos los certificados del usuario “tservice”, para el TUN11, al directorio especificado por el servidor:

cp /etc/openvpn/server/ovpn11/easy-rsa/pki/issued/tservice.crt /etc/openvpn/server/ovpn11/auth/tservice.crt
cp /etc/openvpn/server/ovpn11/easy-rsa/pki/private/tservice.key /etc/openvpn/server/ovpn11/auth/tservice.key

Obtener los archivos para el cliente (“ca.crt”, “tservice.key”, “tservice.crt”, “ta.key”). Los archivos a copiar se encuentran en los siguientes directorios:

  • Para TUN10:
    • /etc/openvpn/server/ovpn10/auth/ca.crt
    • /etc/openvpn/server/ovpn10/auth/ta.key
    • /etc/openvpn/server/ovpn10/auth/tservice.key
    • /etc/openvpn/server/ovpn10/auth/tservice.crt
  • Para TUN11:
    • /etc/openvpn/server/ovpn11/auth/ca.crt
    • /etc/openvpn/server/ovpn11/auth/ta.key
    • /etc/openvpn/server/ovpn11/auth/tservice.key
    • /etc/openvpn/server/ovpn11/auth/tservice.crt

Lo importante es copiar dichos ficheros y hacérselos llegar al cliente, mediante un canal seguro. Para el caso del usuario “tservice” usamos el comando “scp” para hacerle llegar de manera segura los ficheros.

Copiando los certificados del usuario “tservice” para TUN10:

scp /etc/openvpn/server/ovpn10/auth/ca.crt root@192.168.120.50:/etc/openvpn/client/ovpn10/auth/
scp /etc/openvpn/server/ovpn10/auth/ta.key root@192.168.120.50:/etc/openvpn/client/ovpn10/auth/
scp /etc/openvpn/server/ovpn10/auth/tservice.key root@192.168.120.50:/etc/openvpn/client/ovpn10/auth/
scp /etc/openvpn/server/ovpn10/auth/tservice.crt root@192.168.120.50:/etc/openvpn/client/ovpn10/auth/

Copiando los certificados del usuario “tservice” para TUN11:

scp /etc/openvpn/server/ovpn11/auth/ca.crt root@192.168.120.50:/etc/openvpn/client/ovpn11/auth/
scp /etc/openvpn/server/ovpn11/auth/ta.key root@192.168.120.50:/etc/openvpn/client/ovpn11/auth/
scp /etc/openvpn/server/ovpn11/auth/tservice.key root@192.168.120.50:/etc/openvpn/client/ovpn11/auth/
scp /etc/openvpn/server/ovpn11/auth/tservice.crt root@192.168.120.50:/etc/openvpn/client/ovpn11/auth/

¿De cuánta utilidad te ha parecido este contenido?

Franco Diaz Hurtado

Ing. Telecomunicaciones y Electrónica; 1er Especialista en Redes de ECASA Nivel Central

Compartir
Publicado por
Franco Diaz Hurtado

Entradas recientes

Alta disponibilidad de sus base de datos con Percona XtraDB Cluster en Kubernetes

Uno de los grandes retos al que nos podemos enfrentar cuando una aplicación crece, es…

8 meses hace

Home automation (Parte 3) – ESPHome

Qué es lo que deseo hacer en este capítulo? Básicamente un sonoff, quiero encender/apagar las…

1 año hace

Home automation (Parte 2) – Home Assistant

Hace algunos meses estoy escuchando hablar del proyecto Home Assistant (HA). En palabras literales del…

1 año hace

Home automation (Parte 1)

Desde hace varios meses vengo con la idea de automatizar la casa donde vivo. Poco…

1 año hace

Cocinando una imagen personalizada de OpenWRT

El artículo describe el uso para un caso particular de OpenWRT y la creación de…

1 año hace