Vyatta y OpenVPN. Configuración VPNs de acceso remoto


La solución de acceso remoto mediante OpenVPN requiere la utilización de la autenticación TLS (Transport Layer Security). TLS utiliza certificados X.509 PKI (Public Key Infrastructure) y la negociación de una clave secreta.

Nosotros vamos a utilizar el propio appliance de Vyatta como CA (Certificate Authority).

Los pasos a realizar son:
  • Generar un certificado CA en el Vyatta dado que él va a trabajar como la autoridad de la infraestructura de clave pública para todos los certificados generados para la VPN.
  • Crear los certificados y ficheros asociados para cada uno de los extremos de la VPN. Todos los certificados son “firmados” por la autoridad certificadora (CA) de la PKI.

Los ficheros que generamos son:
  • Certificado CA. Este fichero contiene el certificado de la autoridad certificadora. Tiene que haber una copia en el Vyatta y otra en cada uno de los clientes.
  • Certificado cliente. Este fichero contiene el certificado del cliente y será presentado durante la negociación de TLS. Tiene que haber una copia en el Vyatta de cada uno de los clientes y otra en cada cliente.
  • Clave de cliente. Este fichero contiene la clave del cliente. Tiene que haber una copia de cada cliente en el Vyatta y otra en cada cliente.
  • Parámetros DH. Este fichero contiene los parámetros Diffie Hellman que son requeridos únicamente en el servidor al tomar el rol pasivo en la negociación TLS

CREACIÓN Y GESTIÓN DE CERTIFICADOS

En el Vyatta tenemos la suite easy-rsa que contiene los scripts para la generación e inicialización de una PKI. Se encuentra en la ruta /usr/share/doc/openvpn/examples/easy-rsa/2.0/. Podemos trabajar en este directorio o copiar los ficheros a otra ubicación. Nosotros los hemos copiado a /etc/openvpn/2.0/
  • Creamos el directorio keys que será donde almacenaremos los certificados que vayamos generando: 
root@vyatta00:/etc/openvpn/2.0# mkdir keys
  • Modificamos el fichero vars con los detalles del certificado y el valor  correcto de  KEY_DIR. El resultado final es el que sigue:
# easy-rsa parameter settings
# NOTE: If you installed from an RPM,
# don't edit this file in place in
# /usr/share/openvpn/easy-rsa --
# instead, you should copy the whole
# easy-rsa directory to another location
# (such as /etc/openvpn) so that your
# edits will not be wiped out by a future
# OpenVPN package upgrade.
 # This variable should point to
# the top level of the easy-rsa
# tree.
export EASY_RSA="`pwd`"
#
# This variable should point to
# the requested executables
#
export OPENSSL="openssl"
export PKCS11TOOL="pkcs11-tool"
export GREP="grep"
# This variable should point to
# the openssl.cnf file included
# with easy-rsa.
export KEY_CONFIG=`$EASY_RSA/whichopensslcnf $EASY_RSA`
# Edit this variable to point to
# your soon-to-be-created key
# directory.
#
# WARNING: clean-all will do
# a rm -rf on this directory
# so make sure you define
# it correctly!
export KEY_DIR="$EASY_RSA/keys" 
# Issue rm -rf warning
echo NOTE: If you run ./clean-all, I will be doing a rm -rf on $KEY_DIR
# PKCS11 fixes
export PKCS11_MODULE_PATH="dummy"
export PKCS11_PIN="dummy"
# Increase this to 2048 if you
# are paranoid.  This will slow
# down TLS negotiation performance
# as well as the one-time DH parms
# generation process.
export KEY_SIZE=1024
# In how many days should the root CA key expire?
export CA_EXPIRE=3650
# In how many days should certificates expire?
export KEY_EXPIRE=3650
# These are the default values for fields
# which will be placed in the certificate.
# Don't leave any of these fields blank.
export KEY_COUNTRY="ES"
export KEY_PROVINCE="Madrid"
export KEY_CITY="Madrid"
export KEY_ORG="Test"
  • Inicializamos el entorno PKI:
root@vyatta00:/etc/openvpn/2.0# source ./vars
       NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/2.0/keys
y eliminamos certificados previos antes de generar los nuevos:
root@vyatta00:/etc/openvpn/2.0# ./clean-all
       NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/2.0/keys
  • Ahora procedemos con la generación de los certificados a usar en el acceso remoto. Necesitamos generar los ficheros que comentaba al principio.
      • Generación del certificado de la entidad certificadora (Certificate Authority (CA)). En este paso creamos nuestra clave privada RSA basada en los valores de los campos que definimos en el fichero vars:
root@vyatta00:/etc/openvpn/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) [ES]:
State or Province Name (full name) [Madrid]:
Locality Name (eg, city) [Madrid]:
Organization Name (eg, company) [Test]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [Test CA]:vyattasrv
Name []:vyattasrv
Email Address [apuntesdenetworking@gmail.com]:
---------------------
      • Generación del certificado para el servidor (el Vyatta en nuestro caso). En este paso creamos el certificado para el servidor y lo firmamos con nuestro CA. En este paso nos pregunta si queremos utilizar un password de intercambio. Esto es opcional y no lo hemos utilizado. En password en caso de introducirlo debe coincidir con el que se pide al generar los clientes:
root@vyatta00:/etc/openvpn/2.0/#./build-key-server vyattasrv
Generating a 1024 bit RSA private key
...++++++
..........++++++
writing new private key to 'vyattasrv.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) [ES]:
State or Province Name (full name) [Madrid]:
Locality Name (eg, city) [Madrid]:
Organization Name (eg, company) [Test]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [vyattasrv]:
Name []:
Email Address [apuntesdenetworking@gmail.com]:
 
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/openvpn/2.0/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'ES'
stateOrProvinceName   :PRINTABLE:'Madrid'
localityName          :PRINTABLE:'Madrid'
organizationName      :PRINTABLE:'Test'
commonName            :PRINTABLE:'vyattasrv'
emailAddress          :IA5STRING:'apuntesdenetworking@gmail.com'
Certificate is to be certified until Apr 26 10:58:53 2024 GMT (3650 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
--------------------------------------------------------------
 
      • Generación del fichero Diffie-Hellman necesario para la negociación en el lado del servidor:
root@vyatta:/usr/share/doc/openvpn/examples/easy-rsa/2.0# ./build-dh
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
..................................+..............................................................................................+......................................................+.......+.+...............................................................................................................+...............................................................+...................................................................+....................................................................++*++*++*
-------------------------------------------------------------------------------------------------------------------------------
 
      • Generación de los ficheros de certificados para los clientes. En este paso, que hay que repetir por cada cliente que queremos que se conecte, creamos y firmamos con nuestro CA el certificado de cliente. Si hubiéramos puesto password en el certificado del servidor deberíamos darle la misma. 
 
root@vyatta:/etc/openvpn/2.0# ./build-key jca
Generating a 1024 bit RSA private key
.....................++++++
................++++++
writing new private key to 'jca.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) [ES]:
State or Province Name (full name) [Madrid]:
Locality Name (eg, city) [Madrid]:
Organization Name (eg, company) [Test]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [jca]:
Name []:
Email Address [bcrsnetw@es.ibm.com]:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/openvpn/2.0/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'ES'
stateOrProvinceName   :PRINTABLE:'Madrid'
localityName          :PRINTABLE:'Madrid'
organizationName      :PRINTABLE:'Test'
commonName            :PRINTABLE:'jca'
emailAddress          :IA5STRING:'apuntesdenetworking@gmail.com'
Certificate is to be certified until May  3 10:03:48 2024 GMT (3650 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
 
----- IMPORTANTE ----
Si dentro de un tiempo queremos generar nuevos usuarios, los únicos pasos a realizar serian:
root@vyatta00:/etc/openvpn/2.0# source ./vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/2.0/keys
root@vyatta00:/etc/openvpn/2.0# ./build-key nuevocliente
-----------------------------
      • Una vez terminados estos pasos copiamos el contenido de /etc/openvpn/2.0/keys  a el directorio final que configuraremos en el Vyatta /config/auth/keys/:
root@vyatta00:/etc/openvpn/2.0# cp -R /etc/openvpn/2.0/keys/* /config/auth/keys/
 
Al final el directorio contiene los siguientes ficheros:
vyatta@vyatta00:/config/auth/keys$ ls -la
total 108
drwxr-sr-x 2 root vyattacfg 4096 May  6 12:08 .
drwxrwsr-x 3 root vyattacfg 4096 Apr 29 13:16 ..
-rw-r--r-- 1 root vyattacfg 3828 May  6 12:08 01.pem
-rw-r--r-- 1 root vyattacfg 3691 May  6 12:08 02.pem
-rw-r--r-- 1 root vyattacfg 1180 May  6 12:08 ca.crt
-rw-r--r-- 1 root vyattacfg  891 May  6 12:08 ca.key
-rw-r--r-- 1 root vyattacfg  245 May  6 12:08 dh1024.pem
-rw-r--r-- 1 root vyattacfg  417 May  6 12:08 index.txt
-rw-r--r-- 1 root vyattacfg   21 May  6 12:08 index.txt.attr
-rw-r--r-- 1 root vyattacfg   21 May  6 12:08 index.txt.attr.old
-rw-r--r-- 1 root vyattacfg  310 May  6 12:08 index.txt.old
-rw-r--r-- 1 root vyattacfg 3691 May  6 12:08 jca.crt
-rw-r--r-- 1 root vyattacfg  660 May  6 12:08 jca.csr
-rw-r--r-- 1 root vyattacfg  891 May  6 12:08 jca.key
-rw-r--r-- 1 root vyattacfg    3 May  6 12:08 serial
-rw-r--r-- 1 root vyattacfg    3 May  6 12:08 serial.old
-rw-r--r-- 1 root vyattacfg 3828 May  6 12:08 vyattasrv.crt
-rw-r--r-- 1 root vyattacfg  672 May  6 12:08 vyattasrv.csr
-rw-r--r-- 1 root vyattacfg  887 May  6 12:08 vyattasrv.key
 

CONFIGURACION DE OPENVPN EN EL VYATTA
            Ahora configuraremos el Vyatta para permitir acceso remoto mediante OpenVPN.
set interfaces openvpn vtun0 mode 'server'
Creamos el interface virtual vtun0 y lo definimos como servidor
set interfaces openvpn vtun0 local-host 'x.x.x.x'
Le indicamos la dirección sobre la que se levanta el servicio en el Vyatta y estará ‘escuchando’ por las conexiones
set interfaces openvpn vtun0 local-port '1194'
Le indicamos el puerto (el 1194 es el puerto por defecto para OpenVPN)
set interfaces openvpn vtun0 openvpn-option '--push route 81.95.130.0 255.255.255.248'
set interfaces openvpn vtun0 openvpn-option '--push route 172.30.60.0 255.255.255.0'
Definimos las rutas que vamos a inyectar a los clientes
set interfaces openvpn vtun0 server subnet '192.168.179.0/24'
Definimos el rango de direcciones que va a servir el Vyatta a los clientes
set interfaces openvpn vtun0 tls ca-cert-file '/config/auth/keys/ca.crt'
set interfaces openvpn vtun0 tls cert-file '/config/auth/keys/vyattayaap.crt'
set interfaces openvpn vtun0 tls dh-file '/config/auth/keys/dh1024.pem'
set interfaces openvpn vtun0 tls key-file '/config/auth/keys/vyattayaap.key
Definimos la ubicación de los ficheros que intervienen en la negociación TLS
 
Por último, debemos permitir el tráfico en el firewall:
set firewall name PROTECT_VYATTA rule 16 action 'accept'
set firewall name PROTECT_VYATTA rule 16 description 'OPENVPN'
set firewall name PROTECT_VYATTA rule 16 destination port '1194'
set firewall name PROTECT_VYATTA rule 16 log 'enable'
set firewall name PROTECT_VYATTA rule 16 protocol 'udp'
set firewall name PROTECT_VYATTA rule 16 state established 'enable'
 

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.