Openvpn
est un service vpn
trés sûr, super stable, et d’enveloppe légère (la qualité enfonce largement PPTP
), relativement simple à mettre en place, même si j’ai galéré à comprendre sa simplicité, et bourré de fonctionnalités utiles (cf la doc sur openvpn.org )…
Indépendamment des cas évidents ou l’on a besoin de connecter de manière sûre des sites distant, c’est un bon outil pour faire transiter des données jusqu’à une passerelle et travailler en wifi, le tout avec un bon niveau de sécurité.
Par ailleurs la version windows fonctionne aussi bien et se configure à peu prés de la même manière (et oui, on a parfois des clients windows à gèrer aussi, il faut s’en souvenir).
Phase 1 : prérequis, pré-installation des paquets nécessaires
Attention
En fin d’install, il y a des modifications à vérifier :
- Créer un user/group
openvpn
avant de lancer le script. - Penser à changer l’interface d’écoute
eth0
enbr0
dans par exemple les fichiers de routage, de configuration diverses de serveurs (Squid, Samba, etc) ET surtout dans/etc/default/dhcp
openvpn
plante parfois avec un noyau 2.4, il vaut mieux utiliser un 2.6.
Par ailleurs, quoi que je ne l’ai pas testé pour des raisons diverses, il est conseillé d’utiliser un noyau sur lequel est appliqué le patch grsecurity
, trouvable sur grsecurity.net/ .
Votre noyau doit comporter les options actives suivantes :
Installations
Sur le serveur debian :
apt-get install bridge-utils openvpn openssl libssl-dev liblzo1 liblzo-dev
Sur le client debian :
apt-get install openvpn liblzo1
Tous ces paquets peuvent être pris en source et recompilés plus finement bien sûr dans le cas d’un serveur d’accès dédié.
Phase 2 : mise en œuvre de la PKI
Pour l’authentification, nous allons mettre en œuvre une PKI
( “Public Key Infrastructure”=Infrastructure de clé publique ), et identifier un à un les clients du serveur d’accès, en utilisant le jeu de scripts easy-rsa
fourni par le paquet openvpn
Préparation
Commencez par recopier, dans un coin sûr, le répertoire
/usr/share/doc/openvpn/examples/easy-rsa
$ cp -R /usr/share/doc/openvpn/examples/easy-rsa/ .
Passez en root
, et sécurisez le répertoire:
# chown -R root.root easy-rsa
# chmod -R 0700 easy-rsa
Descendez dans le répertoire.
La première étape consiste à modifier les variables communes à la génération des différentes clés.
Ces variables sont à ajuster dans le fichier vars
Voici un exemple:
À partir de maintenant, chaque fois que vous reviendrez générer des clés ou faire une opération de clé,
pensez à “sourcer” ce fichier avant pour mettre à jour votre environnement :
# . ./vars
Ensuite :
# mkdir keys
# touch keys/index.txt
# echo 01 > keys/serial
# chmod -R 0700 keys
Préparation des clés du serveur :
# ./build-dh
# ./build-ca
# ./build-key-server serveur
(ndr : à étoffer)
Et d’un client :
./build-key client
(ndr: à etoffer)
A l’issue de ces manœuvres on se retrouve avec les fichiers suivants dans keys
:
-rwx------ 1 root root 0 2008-09-18 18:58 index.txt.old
-rwx------ 1 root root 3 2008-09-18 18:59 serial.old
-rw-r--r-- 1 root root 245 2008-09-18 19:00 dh1024.pem
-rw------- 1 root root 887 2008-09-18 19:01 ca.key
-rw-r--r-- 1 root root 1224 2008-09-18 19:01 ca.crt
-rw------- 1 root root 887 2008-09-18 19:01 serveur.key
-rw-r--r-- 1 root root 680 2008-09-18 19:01 serveur.csr
-rw-r--r-- 1 root root 3647 2008-09-18 19:01 serveur.crt
-rw-r--r-- 1 root root 3 2008-09-18 19:01 serial
-rw-r--r-- 1 root root 21 2008-09-18 19:01 index.txt.attr
-rw-r--r-- 1 root root 105 2008-09-18 19:01 index.txt
-rw-r--r-- 1 root root 3647 2008-09-18 19:01 01.pem
-rw-r--r-- 1 root root 887 2008-09-18 19:03 client.key
-rw-r--r-- 1 root root 688 2008-09-18 19:03 client.csr
-rw-r--r-- 1 root root 0 2008-09-18 19:03 client.crt
Les fichiers .key
sont les clefs privés du serveur, du client et du serveur d’authentification (ca.key
).
Les fichiers .crt
sont les certificats correspondants.
dh1024.pem
est un paramètre Diffie Hellman [à expliquer, m’a l’air curieux ce truc]
permettant apparemment de sécuriser les transferts contre une attaque man-in-the-middle
Pour notre utilisation, il faut en fait mettre ces fichiers dans le répertoire /etc/openvpn
# cp ./keys/ca.crt /etc/openvpn/
# cp ./keys/ca.key /etc/openvpn/
# cp ./keys/serveur.crt /etc/openvpn/
# cp ./keys/serveur.key /etc/openvpn/
# cp ./keys/dh1024.pem /etc/openvpn/
Notes:
- N’oubliez pas d’utiliser des
CN
(Common Name) unique pour chaque participant duVPN
(serveur, et chaque client), sinon votre serveur ne fonctionnera pas !
Mettez aussi unON
(Organization Name) commun au serveur et aux clients. - N’utilisez pas de
fqdn
pour désigner votre serveur et vos clients,
openvpn
n’aime pas les clés avec un nom de fichier long avec une arobase dedans.
Je n’ai pas réussi à savoir pourquoi, mais certains nomsfqdn
passent, d’autres non. - Ne transférez pas vos clés par un canal non sécurisé.
L’idéal est de stocker le répertoirekeys
sur une clé usb et rien sur la machine,
mais on peut aussi utiliser le useropenvpn
pour les transférer enscp
(puisque le userroot
doit si vous êtes raisonnable être désactivé pourssh
). - Une précaution supplémentaire est d’utiliser une solution
TLS
et de générer une clé supplémentaire pour éviter les interceptions de clé (attaque “Man in the Middle”).
Vous pourrez trouver un exemple de config ici : nbs-system.com/article/openvpn2_howto.
Pour les paranos, ce tuto effectue unchroot
du serveur en plus de la démarche que je décris ici, et il est en français.
Ça y est, vous pouvez annoncer à tout le monde que vous avez votre propre PKI
(la frime)
Configuration du serveur
Comme je l’ai indiqué dans le titre, ce tuto propose une configuration en mode pont ("Bridged
"), en opposition au mode routé ("Routed
").
Ponté ou non, openvpn
utilise un mécanisme appelé Tun/Tap
, qui est une sorte de “câble virtuel” entre le client et le serveur, et qui se traduit des deux cotés par l’ajout d’une interface (tunX
en routé, tapX
en ponté).
Le mode routé est facilement compréhensible, à savoir qu’il faut configurer, une fois le “câble” branché, les tables éventuelles de routage sur le client et le serveur qu’on considère alors comme des routeurs.
Cette configuration est plutôt simple, mais nécessite d’utiliser un réseau “à part” pour l’interface d’entrée du serveur et les clients, augmente d’un hop la distance entre les deux lan
connectés, et ne permet pas de transférer d’autres protocoles que ceux qu’iptables
sait router (pas d’ipx
, ni de - beurk - netbios
, par exemple).
Pour info, il suffit d’installer la config serveur openvpn
d’exemple, de modifier un peu les valeurs, et de configurer un peu de routage.
Config sur le serveur (dans /etc/openvpn/server.conf
, par exemple)
port 5555
proto udp
dev tap0
ca ca.crt
cert serveur.crt
key serveur.key
dh dh1024.pem
ifconfig-pool-persist ipp.txt
server-bridge 192.168.0.1 255.255.255.0 192.168.0.151 192.168.0.250
keepalive 10 120
comp-lzo
user openvpn
group openvpn
persist-key
persist-tun
status openvpn-status.log
verb 1
Démarrage d’openvpn
À l’installation, openvpn
est configuré pour démarrer avec la machine.
Pour le mode ponté, cela n’est pas souhaitable, car cela pose des problèmes si le pont n’est pas bien configuré à ce moment-là.
Pour désactiver le service :
update-rc.d -f openvpn remove
Plutôt que d’utiliser un script pour lever le bridge comme beaucoup de tutos non spécifiques debian font,
nous allons utiliser les scripts de levées d’interface dans /etc/network/interfaces
C’est le bridge
qui va désormais hériter des caractéristiquesd de la carte vers le lan.
Considèrons dans notre exemple que la carte (la seule dans notre exemple) vers le lan est eth0
configurée en static 192.168.0.1/24
.
On aura alors:
/etc/network/interfaces
auto lo br0
iface lo inet loopback
iface br0 inet static
address 192.168.0.1
netmask 255.255.255.0
broadcast 192.168.0.255
bridge-ports eth0
post-up /etc/openvpn/scripts/ovup && /etc/init.d/openvpn start
pre-down /etc/init.d/openvpn stop
post-down /etc/openvpn/scripts/ovdown
/etc/openvpn/scripts/ovup
#!/bin/sh
openvpn --mktun --dev tap0
brctl addif br0 tap0
ifconfig eth0 promisc up
ifconfig tap0 promisc up
ifconfig br0 192.168.0.1 netmask 255.255.255.0 broadcast 192.168.0.255
/etc/openvpn/scripts/ovdown
#!/bin/sh
openvpn --rmtun --dev tap0
Config sur le client :
Sur le client, un fichier de config suffit :
/etc/openvpn/client.conf
client
dev tap0
proto udp
remote adresse.du.serveur 5555
resolv-retry infinite
nobind
user openvpn
group openvpn
persist-key
persist-tun
ca ca.crt
cert client.crt
key client.key
comp-lzo
verb 1
Conclusion
N’hésitez pas à regarder les fichier d’exemple de configuration dans
/usr/share/doc/openvpn/examples
Je ne peux que vous renvoyer à nbs-system.com/article/openvpn2_howto qui s’est encore affiné depuis le début de la redaction de ce post.