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
http://www.openvpn.org )..
Indépendament 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, preinstallation des paquets necessairesAttention 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 en br0 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
http://www.grsecurity.net/ .
votre noyau doit comporter les options actives suivantes:
Citation:
Device Driver
-> Networking support
--> Networking Options
---> Universal Tun/Tap device driver support
---> 802.1d Ethernet Bridging
installationssur le serveur debian:
Code:
apt-get install bridge-utils openvpn openssl libssl-dev liblzo1 liblzo-dev
sur le client debian:
Code:
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 oeuvre de la PKIPour l'authentification, nous allons mettre en oeuvre 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.
preparationCommencez par recopier, dans un coin sûr, le répertoire /usr/share/doc/openvpn/examples/easy-rsa.
Code:
$ cp -R /usr/share/doc/openvpn/examples/easy-rsa/ .
Passez en root, et sécurisez le répertoire:
Code:
# 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:
Citation:
export D=`pwd`
export KEY_CONFIG=$D/openssl.cnf
export KEY_DIR=$D/keys
export KEY_SIZE=1024
export KEY_COUNTRY=FR
export KEY_PROVINCE=France
export KEY_CITY=UNEVILLE
export KEY_ORG="Ma société"
export KEY_EMAIL="bidon@isp.com"
à 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:
Code:
# . ./vars
Ensuite:
Code:
# mkdir keys
# touch keys/index.txt
# echo 01 > keys/serial
# chmod -R 0700 keys
Préparation des clés du serveur:Code:
# ./build-dh
# ./build-ca
# ./build-key-server serveur
(ndr: à etoffer)
Et d'un client:Code:
./build-key client
(ndr: à etoffer)
A l'issue de ces manoeuvres on se retrouve avec les fichiers suivants dans keys:
Code:
-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'au
thentification (ca.key). Les fichiers .crt sont les certificats correspondants.
dh1024.pem est un paramètre Diffie Hellman [à expliquer, m'a l'air curieux ce tr
uc] 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 du VPN (serveur, et chaque client), sinon votre serveur ne fonctionnera pas ! Mettez aussi un ON (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 reussi à savoir pourquoi, mais certains noms fqdn passent, d'autres non.
- ne transfèrez pas vos clés par un canal non sécurisé. L'idéal est de stocker le repertoire keys sur une clé usb et rien sur la machine, mais on peut aussi utiliser le user openvpn pour les transfèrer en scp (puisque le user root doit si vous êtes raisonable être désactivé pour ssh).
- une precaution 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 :
http://www.nbs-system.com/article/openvpn2_howto . Pour les paranos, ce tuto effectue un chroot du serveur en plus de la démarche que je décris ici, et il est en français.
Ca y est, vous pouvez annoncer à tout le monde que vous avez votre propre PKI (la frime)
Configuration du serveurComme 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 mecanisme appelé Tun/Tap, qui est une sorte de "cable 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 comprehensible, à savoir qu'il faut configurer, une fois le "cable" branché, les tables éventuelles de routage sur le client et le serveur qu'on considère alors comme des routeurs. Cette configuration est plutot simple, mais necessite 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)Code:
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é, celà n'est pas souhaitable, car celà pose des problême si le pont n'est pas bien configuré à ce moment la.
Pour désactiver le service:
Code:
update-rc.d -f openvpn remove
Plutot que d'utiliser un script pour lever le bridge comme beaucoup de tutos non specifiques 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èristique 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
Code:
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
Code:
#!/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
Code:
#!/bin/sh
openvpn --rmtun --dev tap0
Config sur le client:Sur le client, un fichier de config suffit:
* /etc/openvpn/client.conf
Code:
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
ConclusionN'hesitez pas à regarder les fichier d'example de configuration dans /usr/share/doc/openvpn/examples.
Je ne peux que vous renvoyer à
http://www.nbs-system.com/article/openvpn2_howtoqui s'est encore affiné depuis le début de la redaction de ce post.