User Tools

Site Tools


informatique:logiciels:openvpn

This is an old revision of the document!


sécurité VPN

OpenVPN

OpenVPN est un logiciel libre multiplateforme permettant de créer un tunnel VPN chiffré TLS ce qui signifie qu'il utilise TCP ou UDP (niveau 4).

Ce mode opératoire décrit la mise en place d'un tunnel routé avec certificats entre un serveur sous DD-WRT et 2 clients : un sous Windows 7 et l'autre sous Debian 6.0.7 (Squeeze).

Avant de commencer il faut savoir qu'il existe 2 types de tunnels :

  • tunnel bridgé = il obtient une adresse IP dans le réseau grâce à une interface tap (c'est un pont réseau).
  • tunnel routé on utilise une interface tun qui définit son réseau propre ; le lien entre notre LAN et le tunnel se fera en routant les paquets (on obtient une IP dans un nouveau réseau).

… et 2 types d'authentification :

  • par pre-shared key (clé partagée) : ne permet qu'un seul client simultané, l'unique clé est connue à l'avance par le client et le serveur.
  • par certificat : plus long à mettre en place, l'authentification se fait par échange de certificat + vérification mutuelle. On utilise une CA (autorité de certification) pour valider les certificats des protagonistes. Dans ce cas chacun (le CA, le serveur et chaque client) doit avoir une paire de c.. clés : une publique et une privée.

La méthode consiste à générer toutes les clés sous Windows 7 (il jouera le rôle de CA) pour signer toutes les clés ; puis on installera copiera ces clés sur chaque machine.

Générer les certificats

La première chose pour utiliser l'authentification par certificat est de générer la paire de clés de l'autorité de certification. Ces clés seront utilisées pour certifier l'authenticité (signer) des clés publiques du serveur et des clients. Dans notre cas nous allons auto-signer les certificats sur le serveur, qui aura donc une double casquette : serveur VPN + CA.

Nous allons voir comment générer des certificats sous Ubuntu (mais c'est aussi faisable sous Windows 7 avec les même commandes), puis nous les importerons sous DD-WRT. Les manips qui vont suivre se font en root.

Installation du paquet Openvpn sous Ubuntu :

sudo su -
aptitude install openvpn

OpenVPN contient des outils permettant de générer facilement des couples de clés. Ils sont situés dans le répertoire /usr/share/doc/openvpn/examples/easy-rsa/ ; il est conseillé de le copier dans un autre endroit, /etc/openvpn/easy-rsa par exemple, afin qu'une éventuelle future mise à jour du paquet n'efface pas tout ce que nous allons faire.

mkdir /etc/openvpn/eay-rsa
cp -R /usr/share/doc/openvpn/examples/easy-rsa/2.0/* /etc/openvpn/easy-rsa
cd /etc/openvpn/easy-rsa

CA

Éditer le fichier vars et remplir les champs KEY_COUNTRY, KEY_PROVINCE, KEY_CITY, KEY_ORG, et KEY_EMAIL (il parait qu'il vaut mieux éviter les espaces). Puis :

source ./vars
./clean-all
./build-ca

Finalement si ça marche on obtient cette sortie :

./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) [FR]:
State or Province Name (full name) [NA]:
Locality Name (eg, city) [Paris]:
Organization Name (eg, company) [pt3uz_corp]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:odin
Email Address [me@myhost.mydomain]:

.. suivi de prompt qui utiliseront les variables d'environnement précédemment enregistrées. Seul Common Name (eg, your name or your server's hostname) [pt3uz_corp CA]: : DOIT être renseigné avec l'identifiant de la machine (avant il n'était pas renseigné par défaut).

Serveur et client

On procède presque de la même façon pour générer les certificats du serveur et des clients :

./build-key-server server
./build-key client1

NB : Ne pas mettre de “Challenge password” (je ne veux pas saisir de mot de passe pour utiliser mon certificat) ni de “Compagny name”.

A chaque clé un prompt vous demande s'il faut signer les clés avec le CA ; il faut dire oui (“y”) !

Certificate is to be certified until Sep  2 15:10:41 2019 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

Au final toutes les clés générées sont situées dans le répertoire keys/ :

  • server.key est la clé privée du serveur
  • server.crt est le certificat (= public) du serveur

Diffie Hellman

Maintenant il faut générer les paramètres Diffie Hellman :

./build-dh
 Generating DH parameters, 1024 bit long safe prime, generator 2
 This is going to take a long time
 .......+......................................................+.................
 [...]
 .................+.........+.+....+...................+.++*++*++*

Fichiers générés

Les fichiers que l'on a générés :

ls keys/
01.pem  ca.key      dude.csr   index.txt.attr      serial      server.csr
02.pem  dh1024.pem  dude.key   index.txt.attr.old  serial.old  server.key
ca.crt  dude.crt    index.txt  index.txt.old       server.crt
  • les .key sont les clés privées donc secrètes
  • les .crt sont les certificats, publics
  • dh1024.pem c'est les paramètres Diffie Hellman (algo de chiffrement)

Config serveur

Se connecter en webUI

  • dans Services / VPN, dans “OpenVPN Daemon” cocher “Start OpenVPN=enable” et “Start type=Wan Up”
  • pour chaque textarea il faut copier la clé comme suivant (c'est-à-dire coller le contenu de chaque fichier cité) :
    • dans Public Server Cert mettre le certificat de la CA (ca.crt)
    • laisser le champ Certificate Revoke List vide
    • dans Public Client Cert copier la clé publique du serveur (server.crt)
    • dans Private Client Key copier la clé privée du serveur (server.key)
    • dans DH PEM copier les paramètres Diffie-Hellman (dh1024.pem)
    • dans OpenVPN Config mettre la configuration OpenVPN du serveur (voir plus bas)
    • laisser le champ OpenVPN TLS Auth vide

Mon fichier de conf contient ça :

# envoyer cette route aux clients (réseau de votre LAN)
push "route 192.168.2.0 255.255.255.0"
 
# le réseau utilisé pour les tunnels
# NB : OpenVPN utilise l'IP .1 du premier /30 pour son IP à lui
# les /30 suivants sont pour chaque tunnel
# ex : 192.168.3.4/30 pour le premier client, 192.168.3.8/30 pour le second, etc...
server 192.168.3.0 255.255.255.0
 
# tunnel tcp routé
dev tun0
proto tcp
# si port différent du défaut
#port 1194
 
# ping toutes les 10s ; considéré down au bout de 120s
keepalive 10 120
 
# spécification des clés
dh /tmp/openvpn/dh.pem
ca /tmp/openvpn/ca.crt
cert /tmp/openvpn/cert.pem
key /tmp/openvpn/key.pem
 
# spécification de l'algorithme de chiffrement
cipher AES-128-CBC
 
# activer la communication entre les clients
client-to-client
 
# limiter le nombre max de client simultanés
#max-clients 3
 
# activer la compression (à placer dans les confs clientes également)
comp-lzo
 
# activer le verbose (de 0 à 15) si ça monte pas ! à commenter sinon
#verb 4

Config client

client
dev tun
 
proto tcp
remote 82.xx.yy.zz 1194
 
# utiliser un port client specifique
nobind
 
persist-key
persist-tun
 
# SSL/TLS parms.
ca ca.crt
cert client.crt
key client.key
 
ns-cert-type server
cipher AES-128-CBC
comp-lzo

Conf avancée

On peut spécifier une conf par certificat en modifiant ainsi la conf du serveur:

# indique ou sont situes les fichiers
client-config-dir /tmp/openvpn/ccd
#ccd-exclusive
  • client-config-dir indique le répertoire contenant les fichiers nommés <common name> : le serveur utilisera le fichier idoine en récupérant ce champ dans le certificat du client. Par exemple pour configurer le client toto on créera un fichier /tmp/openvpn/ccd/toto. Ce dernier pourra contenir, par exemple :
ifconfig-push 192.168.3.10 192.168.3.9
push "route 192.168.2.0 255.255.255.0"

De cette façon on attribue au client toto l'IP 192.168.3.10 ; sa gateway (l'autre bout du tunnel) sera 192.168.3.9 (réseau 192.168.2.8/30) ; et on lui annoncera le réseau 192.168.2.0/24, atteingnable par VPN.

  • ccd-exclusive refuse les clients qui n'ont pas de fichier à leur nom dans le répertoire /tmp/openvpn/ccd.

Le driver TAP sous Windows impose l'utilisation d'un adressage en /30 (255.255.255.252) car c'est du point-à-point (2 IPs utilisables). Ainsi on ne peut utiliser les couples d'IPs suivantes (serveur/client) : (192.168.0.5,192.168.0.6), (9,10), (13,14), (17,18), etc… Sachant que DD-WRT ne permet par d'utiliser la première plage d'adresse, la 192.168.0.0/30 (de .0 à .3).

Explications :

  • créer une interco = un réseau /30 (255.255.255.252, 2 IPs possibles) avec une IP pour le serveur et une pour le client car le tunnel est point à point.

On peut couper la connexion si inactivité du client avec l'option –ping-restart <time>

''route'' controls the routing from the kernel to the OpenVPN server (via the TUN interface) while 
''iroute'' controls the routing from the OpenVPN server to the remote clients.

Divers

dev-node “nom_de_linterface_reseau” permet de spécifier quelle interface utiliser (elle doit être créée avec addtap). crl-verify crl.pem pour spécifier une liste de révocation

Liens

informatique/logiciels/openvpn.1372869356.txt.gz · Last modified: 2013/10/14 20:55 (external edit)