User Tools

Site Tools


informatique:logiciels:openvpn

This is an old revision of the document!


sécurité VPN

OpenVPN

OpenVPN est un logiciel libre multiplateforme permettant de créer un tunnel VPN chiffré TLS ce qui signifie qu'il utilise TCP ou UDP (niveau 4).

Ce mode opératoire décrit la mise en place d'un tunnel routé avec certificats entre un serveur Linux (Ubuntu ou Debian 8) plusieurs clients, peu importe leur système d'exploitation.

Avant de commencer il faut savoir qu'il existe 2 types de tunnels :

  • tunnel bridgé = il obtient une adresse IP dans le réseau grâce à une interface tap (c'est un pont réseau).
  • tunnel routé on utilise une interface tun qui définit son réseau propre ; le lien entre notre LAN et le tunnel se fera en routant les paquets (on obtient une IP dans un nouveau réseau).

… et 2 types d'authentification :

  • par pre-shared key (clé partagée) : ne permet qu'un seul client simultané, l'unique clé est connue à l'avance par le client et le serveur.
  • par certificat : plus long à mettre en place, l'authentification se fait par échange de certificat + vérification mutuelle. On utilise une CA (autorité de certification) pour valider les certificats des protagonistes. Dans ce cas, chacun (le CA, le serveur et chaque client) doit avoir une paire de c.. clés : une publique et une privée.

La méthode consiste à générer toutes les clés sur le serveur Linux (il jouera le rôle de CA) pour signer toutes les clés ; puis on installera ces clés sur chaque machine.

Générer les certificats

La première chose pour utiliser l'authentification par certificat est de générer la paire de clés de l'autorité de certification (CA). Ces clés seront utilisées pour certifier l'authenticité (signer) les clés publiques du serveur et des clients. Dans notre cas nous allons auto-signer les certificats sur le serveur, qui aura donc une double casquette (donc une double paire de clés) : serveur VPN + CA.

Nous allons voir comment générer des certificats sous Linux (mais c'est aussi faisable sous Windows avec les mêmes commandes), puis nous les importerons sur les clients. Les manips qui vont suivre se font en root.

Installation du paquet Openvpn sous Debian/Ubuntu :

aptitude install openvpn

OpenVPN contient des outils permettant de générer facilement des couples de clés. Ils sont situés dans le répertoire /usr/share/doc/openvpn/examples/easy-rsa/ (ou /usr/share/easy-rsa sous Debian 8 (jessie)) ; il est conseillé de les copier dans un autre endroit, /etc/openvpn/easy-rsa par exemple, afin qu'une éventuelle mise à jour du paquet n'efface pas tout ce que nous allons faire.

mkdir /etc/openvpn/eay-rsa
cp -R /usr/share/doc/openvpn/examples/easy-rsa/2.0/* /etc/openvpn/easy-rsa
 
# alternative pour Debian 8 :
cp -a /usr/share/eay-rsa /etc/openvpn
 
# puis dans tous les cas, aller dans le répertoire copié
cd /etc/openvpn/easy-rsa

Pour facilité notre travail, on va configurer des variables qui seront partagées par tous les certificats (et quo'n n'aura pas à ressaisir à chaque fois).

Pour cela, éditer le fichier vars et remplir (au moins) les champs suivants, dans l'idée :

export KEY_COUNTRY="FR"
export KEY_PROVINCE="FR"
export KEY_CITY="Paris"
export KEY_ORG="pteuz-corp"
export KEY_EMAIL="pteu@google.fr"
export KEY_OU="DSI"
 
# X509 Subject Field
export KEY_NAME="pteu"

Puis intégrer ces variables et supprimer les précédents éventuels certificats présents dans le répertoire keys : </code bash> source vars ./clean-all </code>

CA

Pour générer la paire de clé de la CA :

./build-ca

L'ensemble des paramètres demandés sera déjà rempli avec les variables saisie à l'étape précédente ; seul le Common Name est spécifique et doit être renseigné avec le nom de la machine.

Par sécurité il vaut mieux saisir un “Challenge password” pour utiliser le certificat, mais ce n'est pas obligatoire.

Si tout se passe bien, le répertoire keys est créé et contient les fichiers ca.crt, ca.key, index.txt et serial.

Serveur et client

On procède presque de la même façon pour générer les certificats du serveur et des clients :

./build-key-server server
./build-key client1

A chaque clé un prompt vous demande s'il faut signer les clés avec le CA ; il faut dire oui (“y”) !

Certificate is to be certified until Sep  2 15:10:41 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

Diffie Hellman

Maintenant il faut générer les paramètres Diffie Hellman qui permet l'échange de clés sécurisé lors de l'établissement du VPN :

./build-dh
 Generating DH parameters, 1024 bit long safe prime, generator 2
 This is going to take a long time
 .......+......................................................+.................
 [...]
 .................+.........+.+....+...................+.++*++*++*

(NB : maintenant c'est plutôt 2048 bits)

Fichiers générés

Les fichiers que l'on a générés :

ls keys/
01.pem  ca.key      dude.csr   index.txt.attr      serial      server.csr
02.pem  dh1024.pem  dude.key   index.txt.attr.old  serial.old  server.key
ca.crt  dude.crt    index.txt  index.txt.old       server.crt
  • les .key sont les clés privées donc secrètes
  • les .crt sont les certificats, publics
  • dh1024.pem (ou dh2048.pem) ce sont les paramètres Diffie-Hellman (échange de clé partagées lors de l'établissement du VPN)

Config serveur

Pour une machine Windows : se connecter en webUI

  • dans Services / VPN, dans “OpenVPN Daemon” cocher “Start OpenVPN=enable” et “Start type=Wan Up”
  • pour chaque textarea il faut copier la clé comme suivant (c'est-à-dire coller le contenu de chaque fichier cité) :
    • dans Public Server Cert mettre le certificat de la CA (ca.crt)
    • laisser le champ Certificate Revoke List vide
    • dans Public Client Cert copier la clé publique du serveur (server.crt)
    • dans Private Client Key copier la clé privée du serveur (server.key)
    • dans DH PEM copier les paramètres Diffie-Hellman (dh1024.pem)
    • dans OpenVPN Config mettre la configuration OpenVPN du serveur (voir plus bas)
    • laisser le champ OpenVPN TLS Auth vide

Pour une machine Linux on peut s'inspirer directement des modèles fournis par easy-rsa :

gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/server.conf

Le fichier de conf de base est très complet et contient des explication et des exemples pour chaque option ; je vous encourage à le parcourir. Les paramètres minimaux à retoucher sont :

# préciser où sont les certificats et DH
ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/server-cert.crt
key /etc/openvpn/easy-rsa/keys/server-cert.key
dh /etc/openvpn/easy-rsa/keys/dh2048.pem
 
# on modifie la passerelle du client pour faire passer tout son trafic dans le VPN
push "redirect-gateway def1 bypass-dhcp"
# on modifie le DNS du client par celui du serveur
push "dhcp-option DNS 8.8.8.8"
 
# on limite les risques en faisant tourner le deamon openvpn sous un utilisateur sans privilège
user nobody
group nogroup

D'autres paramètres intéressants :

# envoyer cette route aux clients (réseau de votre LAN)
push "route 192.168.2.0 255.255.255.0"
 
# le réseau utilisé pour les tunnels
# NB : OpenVPN utilise l'IP .1 du premier /30 pour son IP à lui
# les /30 suivants sont pour chaque tunnel
# ex : 192.168.3.4/30 pour le premier client, 192.168.3.8/30 pour le second, etc...
server 192.168.3.0 255.255.255.0
 
# spécification de l'algorithme de chiffrement
cipher AES-128-CBC
 
# activer la communication entre les clients
client-to-client
 
# limiter le nombre max de client simultanés
#max-clients 3
 
# activer la compression (à placer dans les confs clientes également)
comp-lzo
 
# augmenter ou diminuer le niveau de verbosité (de 0 à 15) pour debugger si ça monte pas !
#verb 4

Partie réseau

Pour transformer notre serveur en routeur, on doit également :

  • activer le routage
echo "1" > /proc/sys/net/ipv4/ip_forward
 
# pour pérenniser ce paramètre après le prochain reboot, il faut l'écrire dans /etc/sysctl.conf :
vi /etc/sysctl.conf
net.ipv4.ip_forward=1
  • activer le NAT pour le réseau du VPN (remplacer eth0 par l'interface réseau utilisée sur votre serveur)
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
  • si vous avez bidouiller iptables, penser à activer les règles de FORWARD qui vont bien ; dans mon cas :
# connexions ouvertes
iptables -A FORWARD -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
# web
iptables -A FORWARD -p tcp --sport 1024:65535 --dport 80 -j ACCEPT
iptables -A FORWARD -p tcp --sport 1024:65535 --dport 443 -j ACCEPT
# DNS
iptables -A FORWARD -p udp --sport 1024:65535 --dport 53 -j ACCEPT
iptables -A FORWARD -p udp --sport 53 --dport 1024:65535 -j ACCEPT
#icmp
iptables -A FORWARD -p icmp -j ACCEPT

Pour pérenniser cette config, on peut utiliser le paquet iptables-persistent :

apt remove ipmitool
apt install iptables-persistent
/etc/init.d/netfilter-persistent save

Config client

Dans un premier temps on doit installer le logiciel client openvpn, qui va dépendre de la plateforme. Puis on devra importer les certificats : ca.crt, client.crt et client.key.

Pour la configuration, là encore on va s'inspirer du modèle fourni par easy-rsa :

cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/

Le fichier de conf est très similaire à celui du serveur ; voici un exemple de conf pour une tablette (l'application client que j'utilise est OpenVPN Connect, à télécharger sur le Play Store) :

client
dev tun
proto udp
remote <IP_DU_SERVER> 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca /sdcard/Sync/Nexus9/openvpn/ca.crt
cert /sdcard/Sync/Nexus9/openvpn/nexus9.crt
key /sdcard/Sync/Nexus9/openvpn/nexus9.key
ns-cert-type server
comp-lzo
verb 3

NB : avec OpenVPN Connect, le fichier de conf doit être renommé pour avoir l'extension .ovpn, il n'accepte pas les .conf :/.

Conf avancée

Sur le serveur, on peut spécifier une configuration dédiée à un seul client en modifiant ainsi la conf :

# indique ou sont situes les fichiers dedies
client-config-dir /tmp/openvpn/ccd
#ccd-exclusive

Ensuite place la config dédiée dans fichier portant le nom du client (le Common Name de son certificat).

  • client-config-dir indique le répertoire contenant les fichiers nommés <common name> : le serveur utilisera le fichier idoine en récupérant ce champ dans le certificat du client. Par exemple pour configurer le client toto on créera un fichier /tmp/openvpn/ccd/toto. Ce dernier pourra contenir, par exemple :
ifconfig-push 192.168.3.10 192.168.3.9
push "route 192.168.2.0 255.255.255.0"

De cette façon on attribue au client toto l'IP 192.168.3.10 ; sa gateway (l'autre bout du tunnel) sera 192.168.3.9 (réseau 192.168.2.8/30) ; et on lui annoncera le réseau 192.168.2.0/24, atteingnable par VPN.

  • ccd-exclusive refuse les clients qui n'ont pas de fichier à leur nom dans le répertoire /tmp/openvpn/ccd.

Le driver TAP sous Windows impose l'utilisation d'un adressage en /30 (255.255.255.252) car c'est du point-à-point (2 IPs utilisables). Ainsi on ne peut utiliser les couples d'IPs suivantes (serveur/client) : (192.168.0.5,192.168.0.6), (9,10), (13,14), (17,18), etc… Sachant que, dans le cas d'un serveur sous DD-WRT, ce dernier ne permet par d'utiliser la première plage d'adresse, la 192.168.0.0/30 (de .0 à .3).

Explications :

  • créer une interco = un réseau /30 (255.255.255.252, 2 IPs possibles) avec une IP pour le serveur et une pour le client car le tunnel est point à point.

On peut couper la connexion si inactivité du client avec l'option –ping-restart <time>

route controls the routing from the kernel to the OpenVPN server (via the TUN interface) while iroute controls the routing from the OpenVPN server to the remote clients.

Divers

dev-node “nom_de_linterface_reseau” permet de spécifier quelle interface utiliser (elle doit être créée avec addtap). crl-verify crl.pem pour spécifier une liste de révocation

Liens

informatique/logiciels/openvpn.1460876677.txt.gz · Last modified: 2016/04/17 07:04 by pteu