Mise en place d’un VPN SLL avec OpenVpn

Ecrit par Pierre dans Sécurité avec les tags , , ,


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”

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_pierre.crt (non secret)
  • Clé du client OpenVPN: user_pierre.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
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 statut 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.