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.
# 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.