Open VPN
Open VPN
Open VPN
Nous allons voir comment installer OpenVPN, puis renforcer le niveau de sécurité de cette
installation.
1 / 19
Build an intermediate certificate authority certificate/key (optional)..................................16
Build diffie-hellman parameters (necessary for the server end of a ssl/tls connection)...... 17
Build a certificate signing request .......................................................................................... 17
Sign a certificate signing request.............................................................................................17
Build and sign a certificate signing request using a locally installed root certificate/key... 17
6.3 Convertir un certificat PEM ↔ p12..................................................................................... 18
Convertif PEM → p12.............................................................................................................. 18
Convertir p12 → PEM.............................................................................................................19
2 / 19
1 Généralités
OpenVPN est disponible sur plusieurs plateformes : Linux, Windows 2000/XP et plus récent,
OpenBSD, FreeBSD, NetBSD, Mac OS X, et Solaris.
Un utilisateur sur un réseau distant veut accéder à un serveur dans la zone interne du réseau de
son laboratoire. Dans cet exemple, l’architecture réseau du laboratoire est composée de deux
zones :
● la « zone semi-ouverte », accessible de l’Internet
● la « zone interne » hébergeant les serveurs internes du laboratoire
Ces deux premières zones sont séparées par un routeur assurant la sécurité entre elles. Une
troisième zone nommée « zone VPN » est créée pour les machines distantes. Elle regroupe une
plage d’adresses qui sera utilisée par le serveur OpenVPN pour celles-ci.
Les zones se partagent les adresses IP de la manière suivante :
● Zone semi-ouverte : 195.195.195.32/27
● Zone interne : 195.195.195.64/27
● Zone VPN : 195.195.195.224/27
Voici un schéma représentant ce que nous cherchons à mettre en place :
3 / 19
Le processus est le suivant :
1. L’utilisateur démarre le client OpenVPN et se connecte au serveur OpenVPN sur la
machine Cerbère (se trouvant dans la zone semi-ouverte) via Internet (traits pointillé
vert).
2. A l’ouverture du tunnel, le serveur OpenVPN :
1. affecte des adresses IP aux extrémités du tunnel entre le serveur et la machine cliente
dans la zone VPN du réseau du laboratoire.
2. envoie des commandes qui seront exécutées sur la machine cliente en particulier
pour créer une interface réseau et modifier sa table de routage.
3. Une fois le tunnel établi, toutes les connexions entre le poste client et la zone interne du
réseau du laboratoire passeront par le tunnel. Les datagrammes provenant de la machine
cliente à destination du réseau du laboratoire auront une adresse source contenue dans la
plage d’adresses de la « zone VPN ». La mise en place de la politique de filtrage en sera
facilitée.
2 Certificats
Dans le cadre de cet atelier, les fichiers contenant certificats et la clé privée vous seront fournis.
Certificat de la machine
Le serveur doit avoir son certificat qui doit être de type « serveur » défini dans les extensions. Le
serveur doit aussi avoir sa clé privée (fichier critique dans le sens où il doit être gardé secret).
Autorité(s) de certification
Le fichier CAs.crt doit contenir le(s) certificat(s) de la chaîne de certification de l'Autorité de
Certification (AC) du certificat du serveur et des Autorités de Certification autorisées à se
connecter au serveur OpenVPN pour établir un tunnel.
Ces certificats sont au format PEM. Par exemple :
Un certificat au format PEM a cette
-----BEGIN CERTIFICATE-----
MIIDZDCCAkygAwIBAgIBADANBgkqhkiG9w0BAQQFADArMQswCQYDVQQGEwJGUjEN
MAsGA1UEChMEQ05SUzENMAsGA1UEAxMEQ05SUzAeFw0wMTA0MjcwNTQ0MzZaFw0y
MTA0MjIwNTQ0MzZaMCsxCzAJBgNVBAYTAkZSMQ0wCwYDVQQKEwRDTlJTMQ0wCwYD
VQQDEwRDTlJTMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3Xer8er8
eLUUodx3YlaXjC+3VMJMVKbUfSJHe3Sp9+OtfFWyFPBIXZiPAr2SEbaIT8QV9W9Y
W/eJtSfqr6D8oI6Iho+fJLaQTiTcZ9BPj35WLRsoB3KxF2egDttCTsN8tCWi+IwE
samCXYyP1IN77qqf19Lb9ltuwoEQ1pqrXYgcNsoFZGhLi57AUJQj/bYota9dpN2m
xdPYVys++LW6xNj/EiJfJGkHYuQ0Sgh3yjC77NPtdZBoooxxcifeFSYsJSGEKp5X
GIFyI71mHw/jt70X2hK6GVT0HC2PcVIzsbYotnpoy5pNUjj6SIzBS4mWj8YXW8u5
Dg6BXBrHNDlXvQIDAQABo4GSMIGPMAwGA1UdEwQFMAMBAf8wHQYDVR0OBBYEFFbr
aLnSXH6YtaVTw5FvY1jE+Wu3MFMGA1UdIwRMMEqAFFbraLnSXH6YtaVTw5FvY1jE
+Wu3oS+kLTArMQswCQYDVQQGEwJGUjENMAsGA1UEChMEQ05SUzENMAsGA1UEAxME
4 / 19
Q05SU4IBADALBgNVHQ8EBAMCAQYwDQYJKoZIhvcNAQEEBQADggEBADjXwym8enei
XhZHSYZe0Bk4at6BCAK5p6ACpoi4DeJJNc7mqqI00vmjhDeaFelZK7e9zBGuKSGP
j5E5+p134ug56uwu1spIRyJMZbHTtm9YGzQuihCdEoR0pHlSVwBTFMiY3oFuxQt1
p1rn0zUIRYj1hFCY8Ac+xYY+Lglaoty2oGt7N6ufA3Bu3fWcwA4F7LWEWyO0iSEQ
iK37LQjkABMcVbOPd74grNwBHHl8ZwxaX0+5lIm+q5osErGoY8ZigAP9THCVvcbo
BdrLvgmmH+lt0oUuQ9MfGlx2/hN2YWD5ZNRYeL9/7+Vzo0PaKn932zR5ctmO5aXt
UtDERkxfG6o=
-----END CERTIFICATE-----
Pour vérifier le certificat (un seul à la fois) on peut utiliser la commande suivante :
openssl x509 -in CAs.crt -noout -text
Cette commande affiche le certificat dans un format que l'on peut lire.
3.1 Télécharger
Côté serveur
La librairie LZO n'est pas nécessaire à l'exécution du serveur OpenVPN, mais elle permet de
compresser les échanges entre le client et le serveur. Télécharger_la en allant sur le lien :
http://www.oberhumer.com/opensource/lzo/download/
Télécharger la verison 1.08-2_1 ( par rpmfind ) et taper la commande :
root yum install lzo-1.08-2_1.rhfc3.at.i386.rpm
Les sources OpenVPN sur le serveur,
http://openvpn.net/download.html
root wget http://openvpn.net/release/openvpn-2.0.7.tar.gz
Côté client
Client graphique :
http://openvpn.se/download.html
Télécharger la dernière version stable et l'installer sur le poste.
5 / 19
3.2 Installer
Pour installer LZO, exécuter la commande :
root# yum install lzo
Exécuter pour OpenVPN :
root# gunzip openvpn-2.0.7.tar.gz
root# tar xvf openvpn-2.0.7.tar
root# cd openvpn-2.0.7
root# ./configure \
--with-ssl-headers=/usr/local/openssl/include \
--with-ssl-lib=/usr/local/openssl/lib
root# make
root# make install
root# mkdir /etc/openvpn
root# cd /etc/openvpn
root# cp /usr/local/src/openvpn-2.0.7/sample-config-files/server.conf .
root# touch log/openvpn.log
root# touch log/openvpn-status.log
Ou vous pouvez également exécuter la commande
root# yum install openvpn
lancer le serveur
root# /etc/rc.d/init.d/openvpn start
ou encore
root# /usr/local/sbin/openvpn --writepid /var/run/openvpn/server.pid --config server.conf
en mode « daemon »
root# /usr/local/sbin/openvpn --daemon --writepid /var/run/openvpn/server.pid --config server.conf
6 / 19
4.2 Méthode d'autentification (serveur & client)
OpenVPN propose plusieur méthode d'autentification comme par exemple, login/mot de passe,
certificat. Lors de cet atelier, la méthode d'autentification se fait par certificat, Préparer des
certificats pour la configuration de votre réseau sécurisé ou les récupérer.
Sur le poste serveur :
ca /etc/openvpn/CAs.crt
cert /etc/openvpn/server.pem
key /etc/openvpn/server.key # This file should be kept secret
4.3 Définir le mode routeur plutot que le mode pont (serveur & client)
Dans les fichiers de configuration serveur et client(s), spécifier la directive :
dev tun
port 1194
7 / 19
proto tcp
dev tun
#certificates on the server
ca /etc/openvpn/CAs.crt
cert /etc/openvpn/server.pem
key /etc/openvpn/server.key # This file should be kept secret
8 / 19
# 5 and 6 can help to debug connection problems
# 9 is extremely verbose
verb 5
client
dev tun
proto tcp
# SSL/TLS parms.
# See the server config file for more
# description. It's best to use
# a separate .crt/.key file pair
# for each client. A single ca
# file can be used for all clients.
pkcs12 "C:\\Program Files\\OpenVPN\\config\\user.p12"
9 / 19
# To use this feature, you will need to generate
# your server certificates with the nsCertType
# field set to "server". The build-key-server
# script in the easy-rsa folder will do this.
ns-cert-type server
10 / 19
with 195.220.197.65:1527
Thu Apr 13 14:47:47 2006 us=7167 Alice_De_Bignicourt/195.220.197.65:1527 MULTI: Learn: 10.8.0.6 ->
Alice_De_Bignicourt/195.220.197.65:1527
Thu Apr 13 14:47:47 2006 us=7201 Alice_De_Bignicourt/195.220.197.65:1527 MULTI: primary virtual IP
for Alice_De_Bignicourt/195.220.197.65:1527: 10.8.0.6
RThu Apr 13 14:47:48 2006 us=126716 Alice_De_Bignicourt/195.220.197.65:1527 PUSH: Received control
message: 'PUSH_REQUEST'
Thu Apr 13 14:47:48 2006 us=126831 Alice_De_Bignicourt/195.220.197.65:1527 SENT CONTROL
[Alice_De_Bignicourt]: 'PUSH_REPLY,route 10.8.0.1,ping 10,ping-restart 120,ifconfig 10.8.0.6
10.8.0.5' (status=1)
WWWRR
Côté client :
On doit avoir une bulle de confirmation et voir quelle addresse de la zone VPN a été allouée au
client par le serveur. Pour rappel, la zone VPN est définie par la directive ifconfig-pool . Par
contre, on peut regarder quelles sont les routes définies sur le client après établissement du
tunnel :
● ouvrir une fenêtre 'Invite de commandes'
● exécuter la commande :
netstat -r
5 Sécuriser l'installation
Récupérer la clé pour la mettre sur la machine client et rajouter dans le fichier de configuration du
client :
tls-auth "C:\\Program Files\\OpenVPN\\config\\ta.key" 1 # --- 1 pour les clients
11 / 19
Modifier le fichier de configuration du serveur :
user openvpn
group openvpn
NB : pour l’utiliser, il faut copier le bash static, la commande sh ainsi que tous les exécutables et
toutes les librairies nécessaires au serveur OpenVPN et aux script externes appelés après son
initialisation dans le répertoire spécifié par la directive chroot.
root# ls /etc/openvpn/bin
bash sh
Pour retrouver les librairies associées aux exécutables, vous pouvez utiliser la commande :
root# ldd /bin/bash
libtermcap.so.2 => /lib/libtermcap.so.2 (0x00936000)
libdl.so.2 => /lib/libdl.so.2 (0x00fdd000)
libc.so.6 => /lib/tls/libc.so.6 (0x006e4000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x00195000)
Puis copier ces librairies dans /etc/openvpn/lib
if ($depth == 0) {
# If depth is zero, we know that this is the final
# certificate in the chain (i.e. the client certificate),
# and the one we are interested in examining.
# If so, parse out the common name substring in
# the X509 subject string.
12 / 19
#
# Accepte la connection pour :
# MONLABO :
if ($x509 =~ m|^/c=fr/o=cnrs/ou=MONLABO|oi) { exit 0; }
# UPS836 :
if ($x509 =~ m|^/c=fr/o=cnrs/ou=UPS836|oi) { exit 0; }
Pour utiliser cet exemple et la redéfinition de la racine du serveur (par la directive chroot), vous
devez imprétivement copier la commande PERL ainsi que toutes ses librairies (cf. emprisonner le
serveur ) dans le chemin 'chrooté'.
Fichier server.conf
#Fichier de configuration de OpenVPN partie SERVEUR
#----------------------Securite------------------------------
## Affecter l utilisateur et le groupe openvpn aux droits reduits
user openvpn
group openvpn
## Enfermer le processus openvpn dans le repertoire /etc/openvpn
chroot /etc/openvpn
## Protéger le serveur contre les denis de service
tls-auth /etc/ta.key 0 #fichier a distribuer a tous les clients!
## application d'un script de vérification des droits d'accès
tls-verify "/script/verify-dn"
; client-connect "/script/connect"
#----------------------Reseau--------------------------------
## Mode tunnel niveau 3
dev tun0
## serveur (une seul instance pour plusieurs clients)
mode server
## OpenVPN va assigner la 1ere adresse (.1) a l'extremite locale du tunnel et
## va fournir aux clients une adresse dans ce reseau en incrementant
server 147,173,102,0 255.255.255.0
# client-config-dir /ccd
## MTU de l interface TUN (On peut trouver la valeur ideal avec mtu-test)
;mtu-test
tun-mtu 1500
## Les sessions TCP etablies dans le tunnel doivent limiter la taille max
## de leur paquet afin qu'apres encapsulation, le paquet UDP resultant ne
13 / 19
## depasse pas la taille specifiee:
mssfix 1400
## Apres la creation du tunnel, ajouter la route suivante a la table de routage
locale
;route reseau masque passerelle metric # non utilise dans notre exemple
## ifconfig: la 1ere addresse est l'adresse local du tunnel
## la 2nde est celle distante
persist-key
persist-tun
keepalive 10 60
# ---------------------Certificats---------------------------
## Cette instance d'openVPN jouera le role de serveur dans l'echange TLS
tls-server
## Parametres Diffie-Hellman
ca /etc/openvpn/etc/CAs.crt
cert /etc/openvpn/etc/server.pem
key /etc/openvpn/etc/server.key # This file should be kept secret
dh /etc/openvpn/etc/dh1024.pem
## Controle de la liste de revocation
;crl-verify /root/pk/crl/crl.pem #non utilise dans cet environnement de test
# logs
log-append log/openvpn.log
status log/openvpn-status.log
14 / 19
comp-lzo
Fichier client.conf
client
dev tun
proto tcp
remote serverOpenVPN.cnrs.fr 1194
resolv-retry infinite
nobind
persist-key
persist-tun
pkcs12 "C:\\Program Files\\OpenVPN\\config\\plus.p12"
#ca ca.crt
#cert client.crt
#key client.key
ns-cert-type server
;tls-client
# Protéger le serveur contre les denis de service
tls-auth "C:\\Program Files\\OpenVPN\\config\\ta.key" 1
comp-lzo
pull
verb 11
15 / 19
6 Annexes
6.1 Bibliographie
Site officiel d'OpenVPN : http://openvpn.net/
Graphical User Interface for Windows (Mathias Sundman version) : http://openvpn.se/
Article « Installation Sécurisée d'OpenVPN » (A. de Bignicourt) :
http://www.urec.cnrs.fr/IMG/pdf/articles.06.openvpn.pdf
1. Edit vars.
2. Set KEY_CONFIG to point to the openssl.cnf file
included in this distribution.
3. Set KEY_DIR to point to a directory which will
contain all keys, certificates, etc. This
directory need not exist, and if it does,
it will be deleted with rm -rf, so BE
CAREFUL how you set KEY_DIR.
4. (Optional) Edit other fields in vars
per your site data. You may want to
increase KEY_SIZE to 2048 if you are
paranoid and don't mind slower key
processing, but certainly 1024 is
fine for testing purposes. KEY_SIZE
must be compatible across both peers
participating in a secure SSL/TLS
connection.
5 . vars
6. ./clean-all
7. As you create certificates, keys, and
certificate signing requests, understand that
only .key files should be kept confidential.
.crt and .csr files can be sent over insecure
channels such as plaintext email.
8. You should never need to copy a .key file
between computers. Normally each computer
will have its own certificate/key pair.
1. ./build-ca
2. ca.crt and ca.key will be built in your KEY_DIR
directory
1. ./build-inter inter
16 / 19
2. inter.crt and inter.key will be built in your KEY_DIR
directory and signed with your root certificate.
1. ./build-dh
1. ./sign-req mycert
2. mycert.crt will be built in your KEY_DIR
directory using mycert.csr and your root CA
file as input.
Build and sign a certificate signing request using a locally installed root
certificate/key
This script generates and signs a certificate in one step, but it requires that the generated
certificate and private key files be copied to the destination host over a secure channel.
17 / 19
KEY_DIR directory, and mycert.crt will be signed
by your root CA. If ./build-key-pkcs12 was used a
mycert.p12 file will also be created including the
private key, certificate and the ca certificate.
IMPORTANT
ns-cert-type server
NOTES
18 / 19
Convertir p12 → PEM
Pour aobtenir la clé privée :
openssl pkcs12 \
-nocerts \
-in cert.p12 \
-out ~user/userkey.pem
Pour obtenir la clé publique :
openssl pkcs12 \
-clcerts \
-nokeys \
-in cert.p12 \
-out ~user/usercert.pem
Changer la passephrase de la clé privée :
openssl rsa -in ~user/userkey.pem -des3
openssl vous demandera :
1. votre ancien mot de passe
2. votre nouveau mot de passe
3. confirmation du nouveau mot de passe
19 / 19