Openvpn, VPN SSL
Par Pierre le jeudi 30 août 2007, 17:27 - Linux - Lien permanent
Petit tuto sur la mise en place d'un VPN SSL avec Openvn
Introduction
Le but est de créer un tunnel entre le client et le serveur pour que le client situé dans le réseau externe accède à mon réseau local.
Pour une communiquer avec un poste de mon LAN, le client passera donc par le tunnel jusqu’au serveur OpenVPN et sera ensuite routé sur mon LAN.
Installation
Avec OpenVPN, la notion de client et de serveur n’existe pas étant donné que c’est le même logiciel qui peut faire office de client ou de serveur. Dans mon cas, le serveur est installé sur une Debian 4 et les clients sont sous Windows XP ou Vista.
Installation du serveur sur Debian
OpenVPN
Paquet à installer :
apt-get install openvpn
OpenVPN permet à l’aide de l’outil « liblzo1 » de compresser les données passant dans le tunnel VPN pour limiter l’utilisation de la bande passante.
apt-get install liblzo1
OpenSSL
Pour sécuriser le tunnel VPN, OpenVPN utilise le programme OpenSSL :
apt-get install openssl
Installation des client sous Windows XP et Vista
Une version de OpenVPN avec interface graphique est disponible sur le site openvpn.se :
http://openvpn.se/download.html
La version stable actuelle est basée sur OpenVPN 2.0.9 et gui 1.0.3:
openvpn-2.0.9-gui-1.0.3-install.exe
Lancez l’installation en gardant les options par défaut. Lorsque l’on va vous demander d’installation un nouveau composant sur le système, faites « continuer ». Il s’agit de la carte réseau virtuelle « TAP-Win32 Adapter V8 ».
Il est possible de télécharger l’interface graphique en français:
openvpn-gui-1.0.3-fr.exe
Remplacer le fichier “C:\Program Files\OpenVPN\bin\openvpn-gui.exe” par celui que vous venez de télécharger.
Création de certificats et de clés
La partie la plus compliquée et la plus fastidieuse dans la mise en place d’un serveur OpenVPN concerne la génération des clés et des certificats. OpenVPN est livré avec plusieurs scripts permettant de générer plus facilement les clés et les certificats pour OpenSSL. Sous Linux ces scripts sont enregistrés dans le dossier « easy-rsa » :
cd /usr/share/doc/openvpn/examples/easy-rsa/
Sous Windows:
cd C:\Program Files\OpenVPN\easy-rsa
La manipulation suivante est réalisée sur le serveur, donc sous Linux pour moi.
Initialisation
Avant d’utiliser les scripts, il faut éditer le fichier « vars »
pour initialiser les variables par défaut indiquées à la fin de ce fichier. Par
exemple :
- export KEY_COUNTRY=FR
- export KEY_PROVINCE=France
- export KEY_CITY=Valence
- export KEY_ORG=homeunix
- export KEY_EMAIL=”pierre@email.fr”
Une fois le fichier modifié, il faut initialiser les variables pour les scripts :
. ./vars
Le script suivant, permet de créer ou de réinitialiser le sous-dossier « keys » :
./clean-all
Création du certificat de l’autorité de certification (CA)
Le script suivant permet de créer dans « keys » le certificat principal du serveur « ca.crt » et la clé correspondante « ca.key » :
./build-ca
Pour les questions, la plupart des champs sont renseignés par défaut sauf le « Common Name » qu’il faut renseigner manuellement.
Création du certificat et de la clé pour le serveur OpenVPN
Le script suivant permet de créer dans « keys » le certificat « homeunix.crt » et la clé « homeunix.key » pour le serveur VPN nommé par exemple « homeunix » :
./build-key-server homeunix
Pour les questions, tous les champs sont renseignés par défaut sauf le « Common Name » qu’il faut renseigner manuellement. De plus il n’est pas nécessaire de renseigné le champ « password ».
Création du certificat et de la clé pour un client OpenVPN
Le script suivant permet de créer dans « keys » le certificat « user_pierre.crt » et la clé « user_pierre.key » pour le client VPN nommé par exemple « user_pierre» :
./build-key user_pierre
ATTENTION : il faut renouveler cette opération pour chaque client. Pour les questions, tous les champs sont renseignés par défaut sauf le « Common Name » qu’il faut renseigner manuellement. Exemple « pierre ». Chaque « Common Name » de chaque client doit être différent. Il n’est pas obligatoire de renseigné le champ « password ».
Création du paramètre Diffie Hellman
Le script suivant permet de créer dans « keys » le fichier « dh1024.pem » :
./build-dh
Création de la clé spéciale pour éviter les attaques dites “Man in the middle”
Attention : sur la ligne suivante, il n’y a pas d’espace entre les -
openvpn - -genkey - -secret keys/ta.key
Résumé des certificats et des clés Serveur
Le serveur a besoin de 5 fichiers:
- Certificat du serveur de certification (CA) OpenSSL: ca.crt (non secret)
- Clé du serveur de certification (CA) OpenSSL: ca.key (secret)
- Certificat du serveur OpenVPN: homeunix.crt (non secret)
- Clé du serveur OpenVPN: homeunix.key (secret)
- Paramètre Diffie Hellman: dh1024.pem (non secret)
- Clé d’autorisation pour accès au démon: ta.key (secret)
Ces 6 fichiers sont à copier sur le serveur OpenVPN dans /etc/openvpn/ :
cp ./keys/ca.crt /etc/openvpn/
cp ./keys/ca.key /etc/openvpn/
cp
./keys/homeunix.crt /etc/openvpn/
cp
./keys/homeunix.key /etc/openvpn/
cp
./keys/dh1024.pem /etc/openvpn/
cp
./keys/ta.key /etc/openvpnClient
Le client a besoin de 4 fichiers, à copier dans « C :\Program Files\OpenVPN\config », ces fichiers servant à l’authentification du client via OpenSSL :
Certificat du serveur de certification (CA) OpenSSL: ca.crt (non secret) Certificat du client OpenVPN: user_fred.crt (non secret) Clé du client OpenVPN: user_fred.key (secret) Clé spéciale contre attaque MITM: ta.key (secret)
Configuration Serveur
Création d’un utilisateur avec des droits limités pour OpenVPN
Pour limiter les risques d’attaques sur OpenVPN, il est important que le processus d’OpenVPN fonctionne sur un utilisateur n’ayant aucun droit sur le système. Souvent, l’utilisateur « nobody » est utilisé par défaut, mais il est encore plus sécurisant de faire tourner chaque processus avec un utilisateur différent. Donc, pour le processus OpenVPN, nous allons créer l’utilisateur « openvpn » :
groupadd openvpn
useradd -d /dev/null -g openvpn -s /bin/false
openvpn
Fichier de configuration du serveur
Par défaut OpenVPN est fourni avec plusieurs fichiers d’exemples enregistrés dans le dossier :
/usr/share/doc/openvpn/examples/sample-config-files/
Pour configurer le serveur, je suis parti du fichier d’exemple « server.conf.gz », qu’il faut donc décompresser et mettre en place dans « /etc/openvpn » :
cd
/usr/share/doc/openvpn/examples/sample-config-files/
gunzip server.conf.gz
cp
server.conf /etc/openvpn/
Il suffit ensuite d’adapter ce fichier en fonction des besoins. La seule contrainte que je dispose est de vouloir faire passer le tunnel par un firewall d’entreprise. Ainsi j’ai choisi de passer en https (tcp et port 443). Voici donc la configuration de mon serveur:
Ports en écoute
port 443
TCP or UDP server?
proto tcp
==> port 443 + tcp = HTTPS
Type d’interface réseau virtuelle créée
dev tun
Nom des fichiers servant à l’authentification des clients via OpenSSL
ca ca.crt
cert homeunix.crt
key homeunix.key This file should be kept
secret
dh dh1024.pem
tls-auth .ta.key 0
Adresse du réseau virtuel (Le serveur aura l’adresse 10.8.0.1)
server 10.8.0.0 255.255.255.0
Maintain a record of client <-> virtual IP address associations in
this file. If OpenVPN goes down or is restarted, reconnecting clients can be
assigned the same virtual IP address from the pool that was previously
assigned.
ifconfig-pool-persist ipp.txt
Push routes to the client to allow it to reach other private subnets behind
the server. Remember that these private subnets will also need to know to route
the OpenVPN client address pool (10.8.0.0/255.255.255.0) back to the OpenVPN
server.
push “route 192.168.1.0 255.255.255.0″
Les clients peuvent se voir
client-to-client
keepalive 10 120
Activation de la compression
comp-lzo
uset et group pour le processus
user openvpn
group openvpn
Ces lignes permettent de rendre persistante la connexion
persist-key
persist-tun
Output a short status file showing current connections, truncated and
rewritten every minute.
status openvpn-status.log
Niveau de log
verb 1
Démarrage du serveur OpenVPN
La commande suivante permet de démarrer ou redémarrer le serveur :
/etc/init.d/openvpn restart
Ne pas hésiter à regarder dans les logs que tout c’est bien passé :
tail -100 /var/log/syslog
En cas de problème, et pour trouver l’origine de celui-ci il faut augmenter le niveau des logs en changeant le paramètre « verb » du fichier de configuration :
- verb 3 : Suffisamment de logs dans la plupart des cas.
- verb 9 : Énormément de logs.
Bien vérifier également que le processus tourne sous l’utilisateur « openvpn »
ps aux | grep openvpn
Pour finir, si tout c’est bien passé l’interface « tun0 » doit apparaître dans la configuration du réseau :
ifconfig … tun0 Lien encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 inet adr:10.8.0.1 P-t-P:10.8.0.2 Masque:255.255.255.255 UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 lg file transmission:100 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
Client Windows
Installation
L’installation ne pose aucun problème. Un simple avertissement lors de la création de l’interface.
Fichier de configuration du client
Pour éditer le fichier, il est possible de faire un clic droit sur l’icône « OpenVPN » situé à gauche de l’heure et de choisir l’option « Éditer la configuration ». Le fichier se trouve sous « C:\Program Files\OpenVPN\config\client.ovpn ». Voici l’exemple d’un fichier de configuration d’un client
client
dev tun
proto tcp
remote pierre.homeunix.net 443
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert user_pierre.crt
key user_pierre.key
tls-auth ta.key 1
comp-lzo
verb 3
Lancement du client graphique Windows
Pour lancer la connexion, il suffit de faire un clic droit sur l’icône « OpenVPN » situé dans le systray et de choisir l’option « Connecter ».
Si tout se passe bien, une fenêtre affichant les logs doit s’afficher. Selon la couleur de l’icône le statu de la connexion est différent:
vert: la connexion est fonctionnelle, jaune: il y a un problème (regarder les logs), rouge: connexion désactivée.
Une fois la connexion établie, il doit être possible de pinguer le serveur soit sur son adresse virtuelle (ex : 10.8.0.1 dans notre cas) soit sur son adresse réelle (ex : 192.168.1.209).
Routage
A cet instant le tunnel VPN SSL est operationnel. Cependant le client OpenVPN ne peut pas encore se connecter aux machines situés dans le réseau local.
Activation du routage sur le serveur OpenVPN
Pour cela, il faut activer le forwarding avec la commande suivante :
echo 1 > /proc/sys/net/ipv4/ip_forward
La commande suivante, permet de vérifier que le forwarding est bien activé :
cat /proc/sys/net/ipv4/ip_forward
Pour que la modification soit prise en compte au redémarrage, modifier le fichier /etc/sysctl.conf pour avoir:
net.ipv4.conf.default.forwarding=1
Pour info, sous Debian Etch le fichier /etc/network/options avec ip_forward=yes n’est plus d’actualité. Cette option fonctionne toujours mais vous obtiendrez un jolie message : /etc/network/options is deprecated (see README.Debian of netbase)..
Configuration des postes du réseau local
Actuellement, les clients OpenVPN connaissent l’existence du réseau 192.168.1.0/24 en passant par le serveur 10.8.0.1. Cependant les postes du réseau local ne connaissent pas le réseau 10.8.0.0/24.
Mon serveur VPN est à l’adresse 192.168.1.2, il faut ajouter une route manuellement sur chaque poste du réseau avec la commande suivante sous Windows :
C:\>route add 10.8.0.0 mask 255.255.255.0 192.168.1.2 -p
Pour ajouter une route sous Linux, il faut utiliser la commande suivante :
route add -net 10.8.0.0 netmask 255.255.255.0 gw 192.168.1.2
Configuration de la gateway
Pour éviter de devoir ajouter manuellement sur chaque poste du réseau une route, il faut ajouter une route statique au niveau de la passerelle. Ainsi lorsqu’un utilisateur du LAN souhaite communiquer avec un noeud situé dans le réseau 10.8.0.0/24, il contacte sa gateway qui redirige le paquet sur le serveur OpenVPN.
Enfin dans le cas où le serveur se situe dans un réseau privé, et est donc derrière un NAT, il faut penser à faire la correspondance entre le port et le serveur sur la gateway. Dans mon cas il faut faire correspondre le port 443 au serveur 192.168.1.209.
Partage de fichiers sous Windows XP SP2
Par défaut, seuls les utilisateurs de son propre réseau peuvent accéder aux dossiers partagés. Il faut donc configurer le firewall pour permettre aux utilisateurs du réseau 10.8.0.0/24 d’accéder à ces partages.