Configuración de OpenVPN 2.4.3 en openSUSE Linux 15.1
OpenVPN permite implementar túneles de comunicación encriptados y establecer VPN's a través de Internet, que dependiendo de la configuración puede ser entre una o varias redes empresariales u hogareñas, o bien también entre una red y hosts específicos.
En esta guía se abarcará básicamente la configuración necesaria para que un equipo cliente o varios de ellos (Roadwarriors) pueden conectarse mediante Internet a los equipos de una red ubicada detrás del servidor OpenVPN que hace de pasarela.
Finalizando esta sección, quisiera comentarles que primero se abarcarán las configuraciones correspondientes al servidor OpenVPN y posteriormente los pasos para configurar los equipos clientes.
Podemos automatizar las cosas creando un script que simplifique la tarea de revocar los certificados de los clientes, los pasos a seguir se exponen a continuación.
En esta guía se abarcará básicamente la configuración necesaria para que un equipo cliente o varios de ellos (Roadwarriors) pueden conectarse mediante Internet a los equipos de una red ubicada detrás del servidor OpenVPN que hace de pasarela.
Servidor OpenVPN para Roadwarriors
La denominación RoadWarrior se refiere a aquellos equipos que siempre están en movimiento y se encuentran conectados al extremo de un túnel VPN normalmente desde una IP dinámica (véase en wikipedia). Esta configuración no contempla una VPN bajo el esquema red a red, sino solamente equipo/s a red como se muestra a modo de ejemplo en el siguiente gráfico:Finalizando esta sección, quisiera comentarles que primero se abarcarán las configuraciones correspondientes al servidor OpenVPN y posteriormente los pasos para configurar los equipos clientes.
Paquetes requeridos
- Debemos verificar que los paquetes requeridos para OpenVPN se encuentren instalados, lo podemos hacer mediante el siguiente comando:
testsrv:~ # zypper search -i openvpn easy-rsa telnet
- Si algunos paquetes no se encuentran instalados los instalamos de la siguiente manera:
testsrv:~ # zypper install openvpn easy-rsa telnet
Para openSUSE 15.1 el paquete openvpn que viene en el repositorio es la versión 2.4.3.
Generación de llaves y certificados para CA y servidor
- Autoridad de Certificación: En este punto vamos a comenzar a realizar algunos ajustes y configuraciones para preparar la base del servicio OpenVPN. En los siguientes pasos necesitamos generar una llave y un certificado para la Autoridad de Certificación (de ahora en más llamado CA) que en este caso será el mismo equipo en el que va a correr el servidor OpenVPN. Lo primero que debemos hacer es ubicarmos en el directorio /etc/openvpn, creamos el archivo vars a partir del archivo vars.example y lo editamos:
testsrv:~ # cp /etc/easy-rsa/vars.example /etc/easy-rsa/vars
Una vez abierto el archivo vars podemos verificar y descomentar la directiva EASYRSA_KEY_SIZE, para configurar el tamaño de la clave que en esta versión ya se encuentra configurado por defecto en 2048.
testsrv:~ # vi /etc/easy-rsa/varsset_var EASYRSA_KEY_SIZE=2048
Sin embargo, lo más importante que tenemos que configurar es la información relacionada al CA, para ello configuramos las siguientes variables con nuestra información.set_var EASYRSA_REQ_COUNTRY "PY"
Otras configuraciones importantes a revisar son las directivas EASYRSA_CA_EXPIRE y EASYRSA_CERT_EXPIRE, que permiten configurar la cantidad de días en que expiran automáticamente los certificados generados para la entidad certificadora (CA) y para los roadwarriors respectivamente. En este ejemplo se ha configurado en 100 años la expiración de la entidad certificadora y en 10 años para los roadwarriors, si algún certificado se llega a vencer.
set_var EASYRSA_REQ_PROVINCE "IT"
set_var EASYRSA_REQ_CITY "nombre_ciudad"
set_var EASYRSA_REQ_ORG "nombre_organizacion"
set_var EASYRSA_REQ_EMAIL "admin@dominio"
set_var EASYRSA_REQ_OU "unidad_de_la_empresa"
# In how many days should the root CA key expire? set_var EASYRSA_CA_EXPIRE 36500 # In how many days should certificates expire? set_var EASYRSA_CERT_EXPIRE 3650
Y finalmente verificamos que la configuración de la variable EASYRSA_REQ_CN esté debidamente comentada. Esta directiva se utiliza al crear una llave para un cliente, sin embargo, conviene que la misma sea configurada con el nombre del cliente para el cual se generar la llave y no con un nombre genérico, esto se verá más adelante donde mediante un script se seteará dicha directiva cada vez que generemos la llave para un cliente:# Default CN:
Salimos del archivo guardando los cambios.
# This is best left alone. Interactively you will set this manually, and BATCH
# callers are expected to set this themselves.
#set_var EASYRSA_REQ_CN "ChangeMe" - A continuación nos trasladamos al directorio /etc/openvpn:
testsrv:~ # cd /etc/openvpn
- Una vez ubicados en el directorio /etc/openvpn procedemos a ejecutar el comando pkitool para crear la llave y el certificado para la CA:
testsrv:/etc/openvpn # easyrsa init-pki
Note: using Easy-RSA configuration from: /etc/easy-rsa/vars
init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /etc/openvpn/pki
testsrv:/etc/openvpn # - Generamos la configuración del certificado para la CA:
testsrv:/etc/openvpn # easyrsa build-ca nopass
Note: using Easy-RSA configuration from: /etc/easy-rsa/vars
Using SSL: openssl OpenSSL 1.1.0i-fips 14 Aug 2018
Enter New CA Key Passphrase:
Re-Enter New CA Key Passphrase:
Generating RSA private key, 2048 bit long modulus
..+++++
.......................................+++++
e is 65537 (0x010001)
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]:testsrv
CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/etc/openvpn/pki/ca.crt
testsrv:/etc/openvpn # - Ahora procedemos a generar los parámetros Diffie Hellman, para lo cual ejecutamos la siguiente directiva:
testsrv:/etc/openvpn # easyrsa gen-dh
Note: using Easy-RSA configuration from: /etc/easy-rsa/vars
Using SSL: openssl OpenSSL 1.1.0i-fips 14 Aug 2018
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
.............................................................................
................................................................+............
............................................+................................
................................................+............++*++*++*++*
DH parameters of size 2048 created at /etc/openvpn/pki/dh.pem
testsrv:/etc/openvpn # - Generación de llave y certificado para el servidor: En los siguientes pasos vamos a generar la llave y el certificado para el servidor que ejecutará el servicio OpenVPN, para ello ejecutamos nuevamente el comando pkitool pero con los siguientes argumentos:
testsrv:/etc/openvpn # easyrsa gen-req servidor nopass
Una observación, para el tercer parámetro se ha utilizado la palabra servidor, que es el nombre con el cual se genera la petición de firma y el certificado, los archivos resultantes serán servidor.req y servidor.key respectivamente, y que más adelante serán utilizados en la configuración del servicio OpenVPN.
Note: using Easy-RSA configuration from: /etc/easy-rsa/vars
Using SSL: openssl OpenSSL 1.1.0i-fips 14 Aug 2018
Generating a 2048 bit RSA private key
...+++++
.........+++++
writing new private key to '/etc/openvpn/pki/private/servidor.key.fXdSTOSkoX'
-----
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) [servidor]:testsrv
Keypair and certificate request completed. Your files are:
req: /etc/openvpn/pki/reqs/servidor.req
key: /etc/openvpn/pki/private/servidor.key
testsrv:/etc/openvpn # - A continuación, la llave servidor.key generada previamente tiene que ser firmada digitalmente por la entidad certificadora (CA):
testsrv:/etc/openvpn # easyrsa sign-req server servidor
Note: using Easy-RSA configuration from: /etc/easy-rsa/vars
Using SSL: openssl OpenSSL 1.1.0i-fips 14 Aug 2018
You are about to sign the following certificate.
Please check over the details shown below for accuracy. Note that this request
has not been cryptographically verified. Please be sure it came from a trusted
source or that you have verified the request checksum with the sender.
Request subject, to be signed as a server certificate for 1080 days:
subject=
commonName = testsrv
Type the word 'yes' to continue, or any other input to abort.
Confirm request details: yes
Using configuration from /etc/easy-rsa/safessl-easyrsa.cnf
Can't open /etc/openvpn/pki/index.txt.attr for reading, No such file or directory
140072140343104:error:02001002:system library:fopen::crypto/bio/bss_file.c:74:fopen('/etc/openvpn/pki/index.txt.attr','r')
140072140343104:error:2006D080:BIO routines:BIO_new_file:no such file:crypto/bio/bss_file.c:81:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName :ASN.1 12:'testsrv'
Certificate is to be certified until Jun 11 17:09:29 2022 GMT (1080 days)
Write out database with 1 new entries
Data Base Updated
Certificate created at: /etc/openvpn/pki/issued/servidor.crt
testsrv:/etc/openvpn # - Generación de firma HMAC tls-auth: Necesitamos generar una firma HMAC tls-auth que aumenta los niveles de seguridad en varios aspectos. Para ello estando en el directorio /etc/openvpn ejecutamos el siguiente comando:
testsrv:/etc/openvpn # openvpn --genkey --secret ta.key
Y con este paso concluimos esta sección.
Configuración del servidor
- El archivo server.conf que será utilizado por el servicio OpenVPN lo creamos a partir del archivo de mismo nombre ubicado en el directorio /usr/share/doc/packages/openvpn/sample-config-files como se muestra a continuación:
testsrv:/etc/openvpn # cp /usr/share/doc/packages/openvpn/sample-config-files/server.conf /etc/openvpn
- Procedemos a editar el archivo server.conf:
testsrv:/etc/openvpn # vi /etc/openvpn/server.conf
Y configuramos las directivas correspondientes a la entidad CA, al certificado y llave para el servidor, el parámetro DH, la autenticación TLS y la configuración cipher. Es importante aclarar que debemos especificar la ruta completa a los archivos relacionados como se muestra a continuación:ca /etc/openvpn/pki/ca.crt
Descomentamos la configuración comp-lzo:
cert /etc/openvpn/pki/issued/servidor.crt
key /etc/openvpn/pki/private/servidor.key
dh /etc/openvpn/pki/dh.pem
tls-auth /etc/openvpn/ta.key 0
cipher AES-256-GCMcomp-lzo
Luego descomentamos la directiva client-config-dir ccd que permite definir el directorio en donde se colocarán todas las políticas personalizadas de acceso para cada uno de los clientes que generaremos más adelante.client-config-dir ccd
También debemos descomentar la directiva log-append y debería quedar configurado como sigue:log-append /var/log/openvpn.log
Nos vamos al final del archivo y especificamos la directiva crt-verify y le especificamos el archivo que contendrá los certificados que fueron revocados por el administrador del servicio OpenVPN (los pasos para revocar certificados será abordados más adelante):# -- SE AGREGA LA DIRECTIVA QUE ESPECIFICA EL ARCHIVO EN DONDE
A continuación de la directiva anterior agregamos la directiva management para definir el host y el puerto desde los cuales se podrá acceder a la consola de administración de OpenVPN. Si bien se puede configurar la dirección IP de la interfaz de red activa para que la consola de administración se encuentre accesible remotamente, se recomienda que solo se habilite en el localhost ya que no solicita usuario ni contraseña al conectarnos a ella.
# SE ENCUENTRAN LOS CERTIFICADOS REVOCADOS.
crl-verify /etc/openvpn/pki/crl.pem# -- SE HABILITA LA CONSOLA DE ADMINISTRACION EN EL PUERTO 1195
También agregamos las siguientes configuraciones relacionadas con el MTU:
# DE LA INTERFAZ LOCALHOST (Recomendado, ya que al acceder a la
# consola no pide usuario y contrasenia) DEL SERVIDOR
management 127.0.0.1 1195# -- CONFIGURACION DEL MTU DE LA INTERFAZ TUN:
Con lo anterior hemos finalizado con la configuración de las directivas del archivo server.conf, guardamos los cambios realizados y salimos del archivo para continuar con el siguiente paso.
tun-mtu 1500 - Luego creamos los directorios keys para almacenar las llaves de los clientes y ccd (definido en la directiva client-config-dir del paso anterior) para almacenar los archivos de políticas de acceso para los distintos common name de los clientes.
testsrv:/etc/openvpn # mkdir /etc/openvpn/keys
testsrv:/etc/openvpn # mkdir /etc/openvpn/ccd - Para evitar problemas durante el arranque necesitamos generar una lista para certificados revocados vacía denominada crl.pem en el directorio /etc/openvpn/pki, para lo cual primero procedemos a editar el archivo de configuración openssl-easyrsa.cnf del directorio /etc/openvpn/pki:
testsrv:/etc/openvpn # vim /etc/openvpn/pki/openssl-easyrsa.cnf
A fin de asignar el valor 3650 a las directivas default_days y default_crl_days para evitar expiraciones automáticas de llaves no deseadas como el caso comentado en éste foro.#default_days = $ENV::EASYRSA_CERT_EXPIRE # how long to certify for
Una vez finalizado con lo anterior ya podemos proceder a generar el archivo crl.pem con el siguiente comando:
default_days = 3650 # how long to certify for
#default_crl_days= $ENV::EASYRSA_CRL_DAYS # how long before next CRL
default_crl_days= 3650 # how long before next CRLtestsrv:/etc/openvpn # easyrsa gen-crl
Note: using Easy-RSA configuration from: /etc/easy-rsa/vars
Using SSL: openssl OpenSSL 1.1.0i-fips 14 Aug 2018
Using configuration from /etc/easy-rsa/safessl-easyrsa.cnf
An updated CRL has been created.
CRL file: /etc/openvpn/pki/crl.pem
testsrv:/etc/openvpn # - Activamos el servicio openvpn para que se inicie durante el arranque del sistema operativo y finalmente lo arrancamos con los siguientes comandos:
testsrv:/etc/openvpn # systemctl enable openvpn@server
OBS: El @server hace referencia al archivo de configuración server.conf, ya que OpenVPN por defecto no viene con un script tradicional para gestionar el servicio.
testsrv:/etc/openvpn # systemctl start openvpn@server
Configuración del Firewall
- Antes de configurar las directivas del Firewall de OpenSUSE, debemos tener en cuenta que con la ejecución del servicio OpenVPN se generará una nueva interfaz de red lógica para el túnel ssh llamado normalmente por defecto tun0. Recomiendo que la interfaz tun0 se asigne a la zona desmilitarizada (DMZ) y la interfaz de red que utilizamos para nuestra LAN interna (eth0, eth1, etc. o el que hayan usado) a otra zona que utilizamos para ello (externa o interna), esto permite evitar que los servicios habilitados para la interfaz que se conecta a la LAN interna no se encuentren también publicados en la interfaz tun0. De esta forma los clientes (Roadwarriors) que se conecten al servicio OpenVPN (que lo pueden hacer únicamente a través de la interfaz tun0) solo podrán acceder a los servicios del servidor openvpn autorizados para esa zona.
- Hecha la aclaración anterior comenzamos a configurar primero la zona pública editando el archivo public.xml del directorio /etc/firewalld/zones, que por defecto suele estar asociada a la interfaz LAN interna (eth0, eth1, etc).
testsrv:~ # vi /etc/firewalld/zones/public.xml
Una vez abierto lo dejamos como sigue:<?xml version="1.0" encoding="utf-8"?>
En lo anterior resalta que la zona Public tiene habilitada los servicios ssh y openvpn, y tiene activada la función de enmascaramiento de los paquetes mediante la directiva masquerade.
<zone>
<short>Public</short>
<description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
<service name="ssh"/>
<service name="openvpn"/>
<masquerade/>
</zone> - A continuación creamos a partir del archivo public.xml el archivo dmz.xml para la zona DMZ, luego lo editamos:
testsrv:~ # cp /etc/firewalld/zones/public.xml /etc/firewalld/zones/dmz.xml
Y lo dejamos como sigue:
testsrv:~ # vi /etc/firewalld/zones/dmz.xml<?xml version="1.0" encoding="utf-8"?>
Como se puede observar más arriba, en el archivo dmz.xml se le indica que la interfaz tun0 se encuentra asociada a la zona DMZ, y como no se especifica ningún servicio (como por ejemplo ssh), el cliente remoto no estará autorizado para poder conectarse directamente al servidor OpenVPN a través de dicho protocolo, o lo que sería lo mismo, el firewall del servidor evita que los clientes Roadwarriors puedan conectarse al puerto ssh 22 o a cualquier otro puerto de algún servicio que pueda estar escuchando en la interfaz de red tun0 del servidor (que por defecto suele tener la IP 10.8.0.1/24). También se incluye la directiva masquerade para permitir que el firewall permita enmascarar paquetes de la red corporativa que van al equipo RoadWarrior mediante la interfaz tun0.
<zone>
<short>DMZ</short>
<description>For computers in your demilitarized zone that are publicly-accessible with limited access to your internal network. Only selected incoming connections are accepted.</description>
<interface name="tun0"/>
</zone> - El siguiente y último paso consiste en reiniciar el servicio del Firewall con el siguiente comando:
testsrv:~ # systemctl restart firewalld
IP Forwarding
El siguiente paso que se debe realizar es activar el IP forwarding. Hay varias formas de hacerlo, pero en este caso la configuración se realiza mediante sysctl que no requiere el reinicio del sistema operativo. Los pasos son los siguientes:- Editamos el archivo /etc/sysctl.conf.
testsrv:~ # vi /etc/sysctl.conf
- Asignamos el valor 1 a la siguiente directiva (o la agregamos en el caso de que no exista):
net.ipv4.ip_forward = 1
Luego guardamos los cambios y salimos del archivo sysctl.conf. - Para que los cambios tomen efecto en el sistema operativo sin reiniciarlo ejecutamos el siguiente comando:
testsrv:~ # sysctl -p
Generación de llaves y certificados para roadwarriors
Para crear los certificados y las llaves que utilizarán los clientes vamos a crear un script que nos facilite la tarea de generación automatizando varios pasos que de otra forma deberían ser realizados manualmente. A este script solo será necesario pasarle el Common Name del cliente (el common name debe ser un nombre único para cada cliente) en forma de argumento para generar su correspondiente llave.- Lo primero que vamos a hacer es crear un archivo llamado clientes_crear.sh en el directorio /etc/openvpn:
testsrv:~ # cd /etc/openvpn
testsrv:/etc/openvpn # touch clientes_crear.sh - Luego editamos el archivo:
testsrv:/etc/openvpn # vi clientes_crear.sh
Y le agregamos el siguiente script bash:#!/bin/bash
Lo que hace el script es cargar las variables de entorno para la generación de llaves y certificados OpenVPN, se definen una seria de variables globales para ubicar los archivos ca.crt y ta.key que se necesitaran incluir en el paquete para el nuevo cliente, luego se verifica que se haya pasado como primer argumento ($1) del script el Common Name que se utiliza para nombrar a los archivos certificado (.crt) y llave (.key) del cliente. El siguiente paso automatizado consiste en definir la ruta en donde se colocarán los archivos a ser generados y se crea la carpeta en el caso de que no exista. Posteriormente se generan los archivos para el cliente y se los reubican en el directorio definido, copiándose en el mismo también los archivos ca.crt y ta.key. Por último se crea un archivo de configuración con las directivas necesarias para el cliente y que con la inclusión de los argumentos dos y tres ($2 y $3) en la ejecución del script se puede configurar dinámicamente la dirección IP o nombre de dominio del servidor OpenVPN y el puerto UDP en el cual se ejecuta el servicio respectivamente. El archivo resultante se coloca en el mismo directorio en donde fueron colocados la llave y el certificado del cliente.
#
# -- Definicion de variables globales
CLIENT=""
OPENVPN_DIR=/etc/openvpn
PKI_DIR=$OPENVPN_DIR/pki
KEY_DIR=$OPENVPN_DIR/keys
CA_CRT=$PKI_DIR/ca.crt
TA_KEY=$OPENVPN_DIR/ta.key
DEFAULT_SERVER_IP="ip_o_dominio_del_servidor"
DEFAULT_SERVER_PORT="1194"
WIN_CFG_FILE=client.ovpn
LIN_CFG_FILE=client.conf
# -- Se verifica que se haya pasado el parámetro
# correspondiente al cliente y que exista la
# carpeta en donde se van a colocar la llave y
# los certificados.
if [ -z "$1" ]; then
echo "Debe Especificar el nombre del cliente!"
exit
else
CLIENT=$KEY_DIR/$1
fi
if ! [ -d "$CLIENT" ]; then
mkdir -p $CLIENT
fi
# -- Se procede a crear la llave y el certificado para
# el nuevo cliente, y luego firmarlo con la CA..
export EASYRSA_BATCH=1
export EASYRSA_REQ_CN=$1
easyrsa gen-req $1 nopass
easyrsa sign-req client $1
mv -v $PKI_DIR/private/$1.* $CLIENT
cp -v $PKI_DIR/issued/$1.* $CLIENT
cp -v $CA_CRT $CLIENT
cp -v $TA_KEY $CLIENT
# -- Se crean los archivos de configuración para el nuevo
# cliente, tanto para Windows como para Linux.
echo "client" > $CLIENT/$WIN_CFG_FILE
echo "dev tun" >> $CLIENT/$WIN_CFG_FILE
echo "proto udp" >> $CLIENT/$WIN_CFG_FILE
echo "resolv-retry infinite" >> $CLIENT/$WIN_CFG_FILE
echo "nobind" >> $CLIENT/$WIN_CFG_FILE
echo "persist-key" >> $CLIENT/$WIN_CFG_FILE
echo "persist-tun" >> $CLIENT/$WIN_CFG_FILE
echo "ns-cert-type server" >> $CLIENT/$WIN_CFG_FILE
echo "comp-lzo" >> $CLIENT/$WIN_CFG_FILE
echo "verb 3" >> $CLIENT/$WIN_CFG_FILE
echo "ca ca.crt" >> $CLIENT/$WIN_CFG_FILE
echo "tls-auth ta.key 1" >> $CLIENT/$WIN_CFG_FILE
echo "tun-mtu 1500" >> $CLIENT/$WIN_CFG_FILE
echo "cipher AES-256-GCM" >> $CLIENT/$WIN_CFG_FILE
echo "cert $1.crt" >> $CLIENT/$WIN_CFG_FILE
echo "key $1.key" >> $CLIENT/$WIN_CFG_FILE
# -- Se arma la directiva para especificar el servidor y
# el puerto del servidor openvpn para un cliente Windows.
if ! [ -z "$2" ]; then
# -- Se verifica si el puerto se recibió como argumento.
if ! [ -z "$3" ]; then
echo "remote $2 $3" >> $CLIENT/$WIN_CFG_FILE
else
echo "remote $2 $DEFAULT_SERVER_PORT" >> $CLIENT/$WIN_CFG_FILE
fi
else
echo "remote $DEFAULT_SERVER_IP $DEFAULT_SERVER_PORT" >> $CLIENT/$WIN_CFG_FILE
fi
# -- Se crea el archivo de configuración para Linux a partir del
# archivo de configuración de Windows generado anteriormente.
cp $CLIENT/$WIN_CFG_FILE $CLIENT/$LIN_CFG_FILE
echo "log-append /var/log/openvpn.log" >> $CLIENT/$LIN_CFG_FILE
Guardamos los cambios y salimos del archivo. - El siguiente paso consiste en asignarle al archivo clientes_crear.sh los permisos de ejecución correspondientes:
testsrv:/etc/openvpn # chmod 700 clientes_crear.sh
- Ahora ya podemos ejecutar el script, como ejemplo básico podemos crear los archivos para un cliente llamado empresaX:
testsrv:/etc/openvpn # ./clientes_crear.sh empresaX
Otro ejemplo podría ser crear los archivos para un cliente llamado empresaX y que la configuración del servidor remoto tenga como IP y puerto lo siguiente:
Generating a 2048 bit RSA private key
..........................+++++
...........................................................+++++
writing new private key to '/etc/openvpn/pki/private/empresaX.key.MnvO5YHgV8'
-----
Using configuration from /etc/easy-rsa/safessl-easyrsa.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName :ASN.1 12:'empresaX'
Certificate is to be certified until Aug 27 02:41:17 2022 GMT (1080 days)
Write out database with 1 new entries
Data Base Updated
renamed '/etc/openvpn/pki/private/empresaX.key' -> '/etc/openvpn/keys/empresaX/empresaX.key'
'/etc/openvpn/pki/issued/empresaX.crt' -> '/etc/openvpn/keys/empresaX/empresaX.crt'
'/etc/openvpn/pki/ca.crt' -> '/etc/openvpn/keys/empresaX/ca.crt'
'/etc/openvpn/ta.key' -> '/etc/openvpn/keys/empresaX/ta.key'
testsrv:/etc/openvpn #testsrv:/etc/openvpn # ./clientes_crear.sh empresaX 192.168.1.3 1194
- Finalizado la ejecución del script se generará una carpeta con el common name empresaX (en base a los ejemplos del paso anterior) en el directorio /etc/openvpn/keys con los archivos que deberán ser entregados al cliente, la lista de archivos es la siguiente:
- ca.crt
- ta.key
- empresaX.crt
- empresaX.key
- client.ovpn
- client.conf
- ca.crt
- Aun nos faltan definir los hosts o nuestras redes corporativas a las cuales deseamos dar acceso a nuestro cliente, esto es algo que se puede definir fácilmente en nuestro servidor OpenVPN. Para lograr lo mencionado anteriormente debemos acceder al directorio /etc/openvpn/ccd y crear un archivo de configuración para el cliente con el CommonName utilizado para el mismo, en este caso utilizaremos como ejemplo nuevemente empresaX:
testsrv:~ # cd /etc/openvpn/ccd/
Accedemos al archivo empresaX,
testsrv:/etc/openvpn/ccd # touch empresaXtestsrv:/etc/openvpn/ccd # vi empresaX
y le asignamos las políticas que nos parezcan, por ejemplo, podemos autorizar al cliente empresaX para que pueda acceder a una red interna con el rango 192.168.1.0/24, la directiva quedaría como sigue:push "route 192.168.1.0 255.255.255.0"
También podríamos otorgar al cliente el acceso a una sola estación de trabajo que se encuentra dentro de la red interna 192.168.1.0/24 mencionada anteriormente.push "route 192.168.1.2 255.255.255.255"
- Con el paso anterior culminamos con esta sección ya pudiendo generar los archivos necesarios para nuestros clientes.
Revocar certificados
Revocar un certificado consiste en invalidar uno que habíamos creado previamente y que por alguna razón necesitamos que deje de ser útil. Al revocar un certificado el cliente afectado ya no podrá conectarse al servicio OpenVPN, ya que este último rechazará todas aquellas conexiones que utilicen el certificado en cuestión.Podemos automatizar las cosas creando un script que simplifique la tarea de revocar los certificados de los clientes, los pasos a seguir se exponen a continuación.
- Nos dirigimos al directorio /etc/openvpn y creamos un nuevo archivo de texto plano llamado clientes_revocar.sh:
testsrv:~ # cd /etc/openvpn
testsrv:/etc/openvpn # touch clientes_revocar.sh - Luego editamos el archivo clientes_revocar.sh:
testsrv:/etc/openvpn # vi clientes_revocar.sh
y le agregamos el siguiente contenido:#!/bin/bash
Guardamos los cambios del archivo y salimos del mismo.
#
# SCRIPT PARA REVOCAR LLAVES DE CLIENTES.
#
# -- Se verifica que se haya pasado el common name
# del cliente como argumento.
if [ -z "$1" ]; then
echo "Debe Especificar el nombre del cliente!"
exit
fi
# -- Se procede a revocar la llave del cliente.
export EASYRSA_BATCH=1
export EASYRSA_REQ_CN=$1
easyrsa revoke $1
easyrsa gen-crl - Le otorgamos los permisos de ejecución necesarios:
testsrv:/etc/openvpn # chmod 700 clientes_revocar.sh
- Y con eso ya está, ya podemos revocar los certificados ejecutando el script clientes_revocar.sh de la siguiente forma:
testsrv:/etc/openvpn # ./clientes_revocar.sh empresaX
Según manual, si hemos revocado un cliente mientras este se encuentre conectado, su conexión seguirá funcionando hasta tanto intente renegociar su conexión que en OpenVPN se encuentra configurado por defecto en una (1) hora. Esta configuración se puede modificar declarando la directiva reneg-sec n en el archivo /etc/openvpn/server.conf, donde n es la cantidad de segundos que se desea esperar entre cada renegociación de conexión y que por defecto está configurado de forma implícita en 3600 segundos, o lo que es lo mismo, la 1 hora que había mencionado al principio.
Using configuration from /etc/easy-rsa/safessl-easyrsa.cnf
Revoking Certificate 59C71CFB43E54378656640E37504EFDF.
Data Base Updated
Using configuration from /etc/easy-rsa/safessl-easyrsa.cnf
testsrv:/etc/openvpn #
Sin embargo, en el entorno de pruebas que configuré, la renegociación de la conexión de un cliente revocado no evitó que el tunel dejara de funcionar, tiraba un montón de errores de conexión en el log del servidor, pero el túnel seguía funcionando en ambas direcciones sin problemas. Para forzar que el servidor y el cliente se den cuenta de que el certificado se encuentra revocado, el único procedimiento que me funcionó fue reiniciar el servicio openvpn, con todo lo que ello implica para las demás conexiones activas y vigentes:testsrv:/etc/openvpn # systemctl restart openvpn@server
Consola de administración de OpenVPN
Anteriormente, cuando configuramos el servicio OpenVPN mediante el archivo de configuración server.conf agregamos la directiva management cuya funcionalidad era la de activar la consola de administración del servicio, como en ese momento no se especificó la forma de acceder a dicha herramienta nos encargaremos de eso en esta sección.- Para acceder a la consola de administración del servico OpenVPN hacemos uso del protocolo telnet especificando el host y el puerto como se muestra con el siguiente comando:
testsrv:~ # telnet 127.0.0.1 1195
- El comando anterior desplegará una interfaz que nos permitirá introducir comandos para gestionar el servicio, a modo de ejemplo les dejo con la salida de la ejecución del comando state, pero si desean conocer la lista completa de opciones pueden ejecutar el comando help:
testsrv:~ # telnet 127.0.0.1 1195
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
>INFO:OpenVPN Management Interface Version 1 -- type 'help' for more info
state
1295529194,CONNECTED,SUCCESS,10.8.0.1,
END
exit
Connection closed by foreign host.
testsrv:~ #
Clientes OpenVPN en Windows
A continuación se verán los pasos necesarios para configurar el cliente OpenVPN en Windows. Es importante tener en cuenta que en los equipos clientes la red de su interfaz debe ser distinta a las redes autorizadas en el servidor OpenVPN (en el archivo /etc/openvpn/ccd/empresaX), ya que en caso contrario se generará un conflicto en el ruteo de las redes. El equipo cliente no podrá identificar correctamente su propia red local con la red remota a la cual puede acceder a través del túnel de la VPN.- Si bien se recomienda descargar la última versión del programa OpenVPN para Windows desde su sitio oficial en Internet, para estas pruebas se usó la versión 2.4.7 que ha funcionado correctamente con la versión 2.4.3 del servidor Linux.
URL: https://openvpn.net/community-downloads/
- En el directorio C:\Archivos de programa\OpenVPN\config le copiamos los archivos generados en el servidor para nuestro cliente, en esta guía el cliente de ejemplo será "empresaX", los archivos que deben estar en ese directorio son los siguientes:
- ca.crt
- ta.key
- empresaX.crt
- empresaX.key
- client.ovpn
- client.conf (No requerido para Windows)
OPCIONAL: Si no disponemos de un archivo de configuración .ovpn generado por el script clientes_crear.sh mencionado en el apartado Generación de llave y certificado para el cliente de esta guía, podemos crear ese archivo de configuración a partir de un archivo de ejemplo que viene junto con la instalación, para ello creamos una copia del archivo C:\Archivos de programa\OpenVPN\sample-config\client.ovpn en el directorio C:\Archivos de programa\OpenVPN\config, luego editamos el archivo con nuestro editor preferido y le seteamos las siguientes directivas:remote ip_o_dominio_de_servidor 1194
Guardamos los cambios del archivo.
ca ca.crt
cert empresaX.crt
key empresaX.key
tls-auth ta.key 1 - ca.crt
- Luego debemos configurar la ejecución del cliente openvpn como un servicio, para ello nos dirigimos a Panel de Control -> Herramientas Administrativas -> Servicios, en la ventana de la aplicación servicios buscamos la opción openvpn y la configuramos para que arranque de forma automática durante el inicio del sistema operativo. Esta opción funciona muy bien y es la recomendada, ya que mientras no haya conexión a Internet el servicio se mantendrá inactivo, cuando se restablece la conexión a Internet el servicio openvpn automáticamente también se iniciará estableciendo la conexión sin contratiempos y sin intervención del usuario.
Si no queremos utilizar el servicio podemos ejecutar la aplicación OpenVPN GUI como administrador, cuyo icono se ubicará en el área de notificaciones y sobre el cual tenemos que hacer un clic con el botón derecho del mouse para seleccionar la opción Connect. Esta opción no es tan recomendada porque cuando no se ejecuta con permisos de administrador el programa puede no tener los permisos necesarios para establecer el túnel y crear las rutas, sin contemplar que el operador puede cerrar la aplicación o cambiar alguna configuración por error. - Para finalizar podemos controlar las rutas que fueron agregadas a la tabla de ruteo del sistema operativo luego de que el túnel se haya establecido de forma exitosa:
C:\>route print
Vencimiento de Certificados
Dejo una pequeña nota al final del artículo para recordar que si no hemos configurado apropiadamente las directivas EASYRSA_CA_EXPIRE y EASYRSA_CERT_EXPIRE en el archivo /etc/easy-rsa/vars, es posible que nuestros certificados expiren automáticamente en el momento menos previsto.Si les llega a expirar automáticamente un certificado de un roadwarrior, lo único que tenemos que hacer es volver a generar un nuevo certificado con el script clientes_crear.sh, usando el mismo nombre de cliente, y enviarle los nuevos archivos al equipo cliente para reemplazar los antiguos.
Ahora bien, si el certificado de la Entidad Certificadora llega a expirar el problema será mucho mayor, ya que es posible que se tenga que volver a generar el certificado para la CA y luego volver a generar de nuevo todos los certificados para los equipos clientes, ya que al cambiar el certificado del CA todos los demás certificados ya quedarán obsoletos.
Hola buenas, felicidades por el excelente manual que ofreces. Tuve un problema y quiero saber si sabes la solución. Agradezco cualquier orientación. Saludos
ResponderEliminarlocalhost:/etc/openvpn # easyrsa gen-crl
Note: using Easy-RSA configuration from: /etc/easy-rsa/vars
Using SSL: openssl OpenSSL 1.1.1d 10 Sep 2019
Using configuration from /etc/easy-rsa/safessl-easyrsa.cnf
ca: Error on line 141 of config file "/etc/easy-rsa/safessl-easyrsa.cnf"
140669627835008:error:0E079065:configuration file routines:def_load_bio:missing equal sign:crypto/conf/conf_def.c:391:line 141
140669627835008:error:0E079065:configuration file routines:def_load_bio:missing equal sign:crypto/conf/conf_def.c:391:line 141
Easy-RSA error:
CRL Generation failed.
Mi correo para contacto es politikon1@gmail.com
GRACIAS
Hola, la verdad que no sabría decirte, al parecer hay algún error con la configuración del archivo "safessl-easyrsa.cnf":
EliminarError on line 141 of config file "/etc/easy-rsa/safessl-easyrsa.cnf"
No se si llegaste a modificar algo de ese archivo, o es un problema de la versión en particular que instalaste.