User Tools

Site Tools


openvpn

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

openvpn [2020/06/24 14:16] (current)
guy created
Line 1: Line 1:
 +====== OpenVPN ======
  
 +**OpenVPN** ​ permet la création de réseau privé virtuel VPN (Virtual Private Network). ​
 +
 +Il permet à des pairs de s'​authentifier entre eux à l'aide d'une clé privée partagée à l'​avance,​ de certificats ou de couples de noms d'​utilisateur/​mot de passe. Il utilise **OpenSSL** (Secure Sockets Layer) pour l'​authentification. Logiciel libre, il existe sous Linux, Mac OS X et Windows.
 +
 +{{openvpn.png|}}
 +
 +
 +L'​architecture comprend d'un côté un client et de l'​autre un serveur.
 +
 +===== Procédure d'​installation =====
 +
 +Installer d'​abord les paquets **[[apt://​openvpn,​openssh-server,​openssl]]**. Au préalable, activer si besoin le dépôt Universe.
 +
 +==== Infrastructure des Clés Publiques ====
 +
 +Une ICP fonctionne grâce à :
 +  * une clé publique pour le serveur et une clé privée pour chacun des clients
 +  * un certificat de l’Autorité de Certification maître et des clés qui sont utilisées pour identifier (signer, identifier…) chaque certificat serveur et client.
 +
 +OpenVPN supporte une authentification bidirectionnelle basée sur les certificats,​ donc le client doit authentifier le certificat du serveur et le serveur doit authentifier le certificat du client avant qu’une confiance mutuelle puisse être établie.
 +
 +=== Les fichiers clés ===
 +
 +Le tableau suivant récapitule les clés et les certificats fraichement générés dans le dossier **keys**. Suit une explication de ce que contiennent les fichiers du dossier keys.
 +
 +^ Nom de fichier ^ Besoin pour ^ Utilité ^ Secret ^
 +| **ca.crt** | Serveur et //tous les clients// | Certificat racine CA | NON |
 +| ca.key | Clé signant la machine seulement | Clé racine CA | OUI |
 +| dh{n}.pem | Serveur ​ | Paramètres Diffie Hellman | NON |
 +| server.crt | Serveur ​ | Certificat serveur | NON |
 +| server.key | Serveur ​ | Clé serveur | OUI |
 +| client1.crt | //​Client1// ​ | Certificat Client1 | NON |
 +| client1.key | //​Client1// ​ | Clé Client1 | OUI |
 +| client2.crt | //​Client2// ​ | Certificat Client2 | NON |
 +| client2.key | //​Client2// ​ | Clé Client2 | OUI |
 +
 +=== Création du certificat de l’autorité de certification (CA) ===
 +
 +  * Pour simplifier la tâche, on va effectuer une copie des scripts de génération de clés dans son dossier propre /​home: ​
 +<​file>​cp /​usr/​share/​doc/​openvpn/​examples/​easy-rsa ~/openvpn/ -R</​file>​
 +  * L'​ensemble des commandes se fera donc dans le répertoire suivant ​ ~/​openvpn/​2.0/​
 +<​file>​cd ~/​openvpn/​2.0 </​file>​
 +  * Se connecter en root et éditer_un_fichier le fichier **vars** ​
 +<​file>​sudo -s && nano vars </​file>​
 +  * Initialiser les variables **KEY_COUNTRY,​ KEY_PROVINCE,​ KEY_CITY, KEY_ORG, and KEY_EMAIL**,​ par exemple :
 +<​code>​- export KEY_COUNTRY=FR
 +- export KEY_PROVINCE=France
 +- export KEY_CITY=Toulon
 +- export KEY_ORG="​AssoXYZ"​
 +- export KEY_EMAIL="​contact@AssoXYZ.fr"​
 +</​code>​
 +  * Une fois le fichier modifié, la ligne suivante permet d’initialiser les variables pour les scripts:
 +<​file>​. ./​vars ​ # bien mettre un espace entre les 2 points</​file>​
 +  * Le script suivant permet de réinitialiser,​ si besoin, ​ le sous-dossier **keys**:
 +<​file>​./​clean-all ​ # pour nettoyer toutes les clés et certificats existants</​file>​
 +  * Le script suivant permet de créer dans **keys** le certificat principal du serveur **ca.crt** et la clé correspondante **ca.key** :
 +<​file>​./​build-ca</​file>​
 +
 +==== Création du certificat et da la clé du serveur ====
 +
 +Le script suivant permet de créer dans le répertoire **keys** le certificat **userv.crt** et la clé **userv.key** pour le __serveur VPN__ nommé par exemple **userv**:
 +
 +<​code>​
 + ​./​build-key-server userv
 +Generating a 1024 bit RSA private key
 +...........++++++
 +................................................++++++
 +writing new private key to '​userv.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) [France]:
 +Locality Name (eg, city) [Toulon]:
 +Organization Name (eg, company) [USERV]:
 +Organizational Unit Name (eg, section) []:
 +Common Name (eg, your name or your server'​s hostname) [userv]: ​ # à remplir impérativement
 +Email Address [...@free.fr]:​
 +
 +Please enter the following '​extra'​ attributes
 +to be sent with your certificate request
 +A challenge password []:
 +An optional company name []:
 +Using configuration from /​usr/​share/​doc/​openvpn/​examples/​easy-rsa/​2.0/​openssl.cnf
 +Check that the request matches the signature
 +Signature ok
 +The Subject'​s Distinguished Name is as follows
 +countryName ​          :​PRINTABLE:'​FR'​
 +stateOrProvinceName ​  :​PRINTABLE:'​France'​
 +localityName ​         :​PRINTABLE:'​Toulon'​
 +organizationName ​     :​PRINTABLE:'​USERV'​
 +commonName ​           :​PRINTABLE:'​userv' ​ # à remplir impérativement
 +emailAddress ​         :​IA5STRING:'​...@free.fr'​
 +Certificate is to be certified until Apr 21 17:17:18 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
 +</​code>​
 +
 +=== Création du certificat et de la clé pour un client OpenVPN ===
 +
 +Le script suivant permet de créer dans **keys** le certificat **Client01.crt** et la clé **Client01.key** pour le client VPN nommé par exemple **Client01**:​
 +<​file>​ ./build-key Client01
 +</​file>​
 +<​note>​Bien choisir le nom du client pour retrouver facilement le serveur et le client auxquels il se rapporte, surtout si on correspond avec plusieurs serveurs et/ou plusieurs clients</​note>​
 +Ce script doit afficher à l’écran quelque chose comme:
 +<​code>​
 + ​./​build-key Client01
 +Generating a 1024 bit RSA private key
 +..++++++
 +....................++++++
 +writing new private key to '​Client01.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.
 +-----
 +-----
 +1 out of 1 certificate requests certified, commit? [y/n]y
 +Write out database with 1 new entries
 +Data Base Updated
 +</​code>​
 +
 +Si besoin, on crée des clés pour un second client Client02:
 +<​file>​ ./build-key Client02 </​file>​
 +
 +=== Création du paramètre Diffie Hellman ===
 +
 +Le script build-dh permet de créer le fichier **dh1024.pem**
 +<​file>​./​build-dh</​file>​
 +
 +
 +==== Mise en place des certificats et des clés ===
 +
 +Déplacer maintenant les certificats et clés dans le répertoire **/​etc/​openvpn**:​
 +<​file>​cp keys/ca.crt /​etc/​openvpn/</​file>​
 +<​file>​cp keys/ca.key /​etc/​openvpn/</​file>​
 +<​file>​cp keys/​userv.crt /​etc/​openvpn/</​file>​
 +<​file>​cp keys/​userv.key /​etc/​openvpn/</​file>​
 +<​file>​cp keys/​dh1024.pem /​etc/​openvpn/</​file>​
 +
 +==== Création d’un utilisateur 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, ​ créer plutôt l’utilisateur **openvpn**:​
 +<​file>​ groupadd openvpn
 + ​useradd -d /dev/null -g openvpn -s /bin/false openvpn
 +</​file>​
 +
 +
 +==== Configuration d’OpenVPN ====
 +
 +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, partir du fichier d’exemple **server.conf.gz**,​ qu’il faut donc décompresser et mettre en place dans **/​etc/​openvpn**:​
 +<​code>​cd /​usr/​share/​doc/​openvpn/​examples/​sample-config-files/​
 +gunzip server.conf.gz
 +cp server.conf /​etc/​openvpn/​ </​code>​
 +
 +Il suffit ensuite de l'​éditer et de l’adapter en fonction des besoins. ​
 +<​file>​ nano /​etc/​openvpn/​server.conf </​file>​
 +Voici par exemple le fichier de configuration à utiliser:
 +<​code>​
 +;Port en écoute utilisé pour la connexion VPN
 +;port 1194
 +
 +;Protocole utilisé (Le protocole udp est plus sécurisé que le tcp)
 +proto udp
 +
 +;Type d'​interface réseau virtuelle créée
 +dev tun
 +
 +;Nom des fichiers servant à l'​authentification des clients via OpenSSL
 +ca ca.crt
 +cert userv.crt ​    # certificat du serveur VPN
 +key userv.key ​     # clé du serveur VPN
 +dh dh1024.pem
 +
 +;Adresse du réseau virtuel (Le serveur aura l'​adresse 10.8.0.1)
 +server 10.8.0.0 255.255.255.0
 +
 +;Cette ligne ajoute sur le client la route du réseau du serveur
 +push "route 192.168.123.0 255.255.255.0"​
 +
 +;Ces lignes indiquent aux clients l'​adresse des serveur DNS et WINS
 +push "​dhcp-option DNS 192.168.123.254"​
 +push "​dhcp-option DOMAIN MonDomaine.com"​
 +push "​dhcp-option WINS 192.168.0.3"​
 +
 +# Cette ligne permet aux clients de voir les autres clients
 +;​client-to-client
 +
 +keepalive 10 120
 +
 +;Cette ligne active la compression
 +comp-lzo
 +
 +;Ces lignes indiquent un user et un group particulier pour le processus
 +user openvpn
 +group openvpn
 +
 +;Ces lignes permettent de rendre persistante la connexion
 +persist-key
 +persist-tun
 +
 +status openvpn-status.log
 +
 +;Cette ligne permet d'​indiquer le niveau de log souhaité (de 1 à 9)
 +verb 1
 +</​code>​
 +
 +Vérifier la redirection 1194 sur le routeur et la Box du côté du serveur OpenVPN.
 +
 +Ajouter une route statique openvpn en 10.8.0 vers le serveur ​
 +
 +==== Démarrage du serveur OpenVPN ====
 +
 +La commande suivante permet de démarrer ou redémarrer le serveur :
 +<​file>/​etc/​init.d/​openvpn restart </​file>​
 +
 +Ne pas hésiter à regarder dans les logs que tout c’est bien passé :
 +<​file>​tail -100 /​var/​log/​syslog </​file>​
 +
 +Bien vérifier également que le processus tourne sous l’utilisateur « openvpn »
 +
 +<​file>​ps aux | grep openvpn </​file>​
 +
 +Pour finir, si tout c’est bien passé, l’interface « tun0 » doit apparaître dans la configuration du réseau :
 +<​code>#​ 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)
 +</​code>​
 +
 +Et il doit même être possible de la pinguer :
 +<​file>​ping 10.8.0.1 </​file>​
 +
 +===== Installation Client Linux =====
 +
 +  * L’installation du client est identique à celle du serveur, car c’est le même logiciel qui fait office de serveur ou de client en fonction de sa configuration :
 +<​file>​sudo -s  ​
 +apt-get install openvpn openssl </​file>​
 +La dépendance liblzo.x pour la compression s'​installera automatiquement.
 +
 +  * Transmettre à partir du serveur le **certificat-racine**,​ le **certificat-client** et la **clé-client** et les placer dans **/​etc/​openvpn**. A partir du serveur, entrer:
 +<​file>​scp ~/​openvpn/​2.0/​keys/​{ca.crt,​client1.key,​client1.crt} <​login>​@<​IP_client>:/​etc/​openvpn/​ </​file>​
 +
 +  * Le fichier de configuration-client et la gestion des clés seront identiques pour un client Windows. Déplacer le fichier-exemple **client.conf** dans **/​etc/​openvpn/​**,​ l'​éditer et le paramétrer.
 +<​code>​cd /​usr/​share/​doc/​openvpn/​examples/​sample-config-files/​
 +cp client.conf /​etc/​openvpn/​
 +nano /​etc/​openvpn/​client.conf </​code>​
 +
 +  * Vérifier en particulier **dev** (tun ou tap), **proto** (udp ou tcp), les noms des **certificats** ​ (qui doivent être identiques à ceux créés par le serveur) et **comp-lzo** (sans changer "​client"​ à la première ligne, qui indique la fonction client).
 +
 +  * Au paragraphe **remote hostname/​port**,​ introduire une ligne 
 +<​code>​ remote <​ip_publique_distante>​ 1194 </​code>​
 +
 +==== Démarrage du client ====
 +
 +  * Pour démarrer le client après configuration,​ lancer
 +<​file>​cd /​etc/​openvpn && sudo openvpn client1.conf (si le fichier-client est client.conf) </​file>​
 +
 +  * Si on a plusieurs clients OpenVPN ou si on n'a pas besoin de lancer systématiquement OpenVPN au démarrage, il faut modifier le fichier **/​etc/​default/​openvpn** pour décommenter la ligne suivante:
 +<​code>​AUTOSTART="​none"​ </​code>​
 +On lance alors le client par la commande:
 +<​file>​sudo /​etc/​init.d/​openvpn start <​fichier_conf-client> ​  # en mettant le nom du fichier de configuration voulu (sans le .conf)</​file>​
 +
 +==== Accès des clients VPN à l’ensemble du réseau distant ====
 +
 +Avec la configuration précédente,​ les clients peuvent accéder au serveur OpenVPN, mais ils ne peuvent pas accéder au reste du réseau sur lequel est connecté le serveur OpenVPN.
 +
 +Pour permettre aux clients d’accéder au reste du réseau, il faut effectuer deux opérations :
 +  * Autoriser le serveur Linux à transmettre les paquets au reste du réseau.
 +
 +Pour cela, il faut activer le forwarding avec la commande suivante :
 +<​file>​ echo 1 > /​proc/​sys/​net/​ipv4/​ip_forward</​file>​
 +
 +Vérifier que le forwarding est bien activé :
 +<​file>​ cat /​proc/​sys/​net/​ipv4/​ip_forward</​file>​
 +
 +  * Indiquer aux autres postes du réseau la route vers le serveur OpenVPN
 +
 +**Linux**
 +
 +Pour ajouter une route sous Linux, il faut utiliser la commande suivante :
 +<​file>​ route add -net 10.8.0.0 netmask 255.255.255.0 gw 192.168.0.1 ​ </​file> ​              
 +Pour avoir la liste des routes sous Linux, entrer :
 +<​file>​ route</​file>​
 +Pour supprimer une route sous Linux, entrer :
 +<​file>​ route delete -net 10.8.0.0 netmask 255.255.255.0 gw 192.168.0.1 </​file>​
 +
 +**Windows**
 +
 +Si le serveur VPN est sur l’adresse 192.168.0.1,​ il faut ajouter une route manuellement sur chaque poste du réseau Windows avec la commande suivante:
 +<​file>​C:​\>​route add 10.8.0.0 mask 255.255.255.0 192.168.0.1</​file>​
 +La commande suivante, permet d’avoir la liste des routes :
 +<​file>​C:​\>​route print</​file>​
 +La commande suivante permet de supprimer une route :
 +<​file>​C:​\>​route delete 10.8.0.0 mask 255.255.255.0 192.168.0.1</​file>​
 +
 +**Remarque** : Pour éviter de devoir ajouter manuellement sur chaque poste du réseau une route, si c’est possible, il faut ajouter une route statique au niveau de la passerelle ou du routeur du réseau.
 +
 +==== Accéder aux autres postes connectés derrière un client VPN ====
 +
 +Avec la configuration précédente,​ le serveur OpenVPN peut accéder à l’adresse virtuelle du client, mais il ne peut pas accéder à l’adresse réelle et encore moins aux autres postes connectés derrière le client VPN.
 +
 +Pour permettre au serveur d’accéder aux autres postes connectés derrière un client VPN, il faut ajouter des routes dans la configuration d’OpenVPN:​
 +
 +Dans le fichier de configuration du serveur OpenVPN, il faut ajouter ces lignes :
 +<​code>​
 +client-config-dir ccd
 +route 192.168.0.0 255.255.255.0 ​
 +</​code>​
 +
 +La première ligne permet d’indiquer le sous-dossier de /​etc/​openvpn qui contiendra la configuration spécifique de chaque client (Remarque : Penser à créer ce dossier manuellement).
 +
 +La deuxième ligne permet d’ajouter la configuration du réseau d’un client.
 +
 +Ensuite, il faut créer un fichier dans le dossier **/​etc/​openvpn/​ccd** ayant le même nom que le certificat du client (ex : Client01) en entrant la ligne suivante :
 +<​code>​iroute 192.168.0.0 255.255.255.0 </​code>​
 +
 +Cette ligne permet d’indiquer le client connecté à ce réseau.
 +
 +Pour finir, il faut redémarrer le serveur et le client pour que les routes soient correctement prises en compte.
 +
 +A partir de ce moment, le serveur doit pouvoir accéder à tous les postes connectés au client VPN.
 +
 +
 +==== Révocation d’un certificat client ====
 +
 +Si le certificat d’un client à été volé ou si ce dernier n’est plus nécessaire,​ il est important de le révoquer pour qu’il ne puisse plus être utilisé.
 +
 +Pour révoquer un certificat, il faut disposer de celui-ci. Normalement,​ le dossier **/​usr/​share/​doc/​openvpn/​examples/​easy-rsa/​keys** contient tous les certificats créés.
 +
 +La commande suivante permet de révoquer un certificat :
 +<​code>​ cd /​usr/​share/​doc/​openvpn/​examples/​easy-rsa/​
 + . ./vars
 + ​./​revoke-crt Client01.crt ​
 +Using configuration from /​usr/​share/​doc/​openvpn/​examples/​easy-sa/​openssl.cnf
 +DEBUG[load_index]:​ unique_subject = "​yes"​
 +Revoking Certificate 16.
 +Data Base Updated </​code>​
 +
 +Cette commande permet également de révoquer un certificat et vérifie ensuite que cette révocation est effective :
 +<​code>​ ./​revoke-full Client01
 +Using configuration from /​usr/​share/​doc/​openvpn/​examples/​easy-
 +sa/​openssl.cnf
 +DEBUG[load_index]:​ unique_subject = "​yes"​
 +Revoking Certificate 17.
 +Data Base Updated
 +Using configuration from /​usr/​share/​doc/​openvpn/​examples/​easy-sa/​openssl.cnf
 +DEBUG[load_index]:​ unique_subject = "​yes"​
 +Client01.crt:​ /
 +=FR/​ST=France/​O=Mondomaine/​CN=Client01/​emailAddress=tony@domaine.com
 +error 23 at 0 depth lookup:​certificate revoked </​code>​
 +
 +**Remarque** : Avec ce script, il ne faut pas mettre l’extension **.crt** du certificat.
 +
 +A chaque révocation de certificat, son numéro est ajouté dans le fichier **keys/​crl.pem**. Ce fichier contient donc la liste des certificats révoqués. Après chaque révocation de certificat, il faut donc copier ce fichier dans « /​etc/​openvpn »
 +
 +La commande suivante permet de consulter la liste des certificats révoqués :
 +
 +<​file>​ openssl crl -in keys/​crl.pem -text</​file>​
 +
 +Il faut également ajouter cette ligne dans **etc/​openvpn/​server.conf** du serveur OpenVPN :
 +
 +<​code>​crl-verify crl.pem</​code>​
 +
 +Pour information,​ le fichier **keys/​index.txt** contient la liste des certificats créés et révoqués
 +
 +Pour finir et pour information,​ lors de la création d’un client, les fichiers suivants sont créés ou modifiés dans **keys/​crl.pem**:​
 +
 +
 +^Fichier ​ ^Description ​ ^
 +|01.pem ​ |Les deux premiers caractères de fichier correspondent au numéro d’ordre sous forme hexadécimale du certificat (01=Le premier certificat créé, 0A=Le dixième créé) |
 +|serial ​ |Contient le numéro du prochain certificat à créer ​ |
 +|LaCle.crt ​ |Certificat = Clé publique du client signée par le certificat du serveur.Le certificat permet de s’authentifier sur le serveur ​ |
 +|LaCle.csr ​ |Fichier temporaire utilisé pour la création du certificat. Ce fichier permet de générer des certificats (c’est une demande de certification ne nécessitant pas la clé privée) ​ |
 +|LaCle.key ​ |Clé privée du client. La clé permet de déchiffrer les données en provenance du serveur ​ |
 +|index.txt ​ |Contient la liste des clés créées et révoquées ​ |
 +|crl.pem ​ |Contient la liste des certificats révoqués ​ |
 +
 +
 +
 +
 +
 +
 +
 +===== Bibliographie =====
 +
 +http://​doc.ubuntu-fr.org/​openvpn
 +
 +https://​help.ubuntu.com/​community/​OpenVPN
 +
 +http://​www.coagul.org/​spip.php?​article422
 +
 +http://​openmaniak.com/​fr/​openvpn_tutorial.php
 +
 +http://​www.moroblog.info/​Tutoriel-OpenVPN.html
 +
 +http://​cox07.free.fr/​tutoriaux.html (pour Windows)
 +
 +http://​www.system-linux.eu/​index.php?​category/​VPN
 +
 +http://​www.openvpn.net/​index.php/​open-source/​documentation/​howto.html#​examples
 +
 +http://​www.thebakershome.net/​openvpn_tutorial
 +
 +http://​www.openvpn.net/​index.php/​open-source/​documentation/​miscellaneous/​76-ethernet-bridging.html
 +
 +http://​sysadmin.cyklodev.com/​installation-et-configuration
openvpn.txt · Last modified: 2020/06/24 14:16 by guy