====== OpenVPN ====== ===== Présentation ===== OpenVPN est une solution de connexion VPN basée sur les librairies OpenSSL, transportée sur les protocoles TCP/UDP (donc non filtrée par les Firewall contrairement à IpSec). ===== Mise en place sous Debian 9 ===== La démarche suivante est appuyée sur un article de Linux Magazine assez ancien et sur la source http://damiengustave.fr/mise-en-place-dun-vpn-avec-openvpn-2-3-et-easy-rsa-3/ (de 2014, en trouver une plus récente). ==== Prérequis : paramétrage réseau du serveur ==== Pour que le serveur VPN puisse autoriser le passage du flux du réseau virtuel vers le réseau local, on doit lui activer quelques options et paramètres : * Permettre le routage entre les réseaux : dans le fichier **///etc/sysctl.conf//** # Décommenter la directive pour conserver le paramétrage à chaque redémarrage net.ipv4.ip_forward=1 * Définir les règles de filtrage autorisant les échanges (exemple avec //iptables//) #autorise l'écoute sur le port iptables -A INPUT -i -p udp -m udp --dport -j ACCEPT #autorise le routage via l'interface tunnel virtuelle iptables -A FORWARD -i tun0 -o -j ACCEPT #réalise le NAt entre sur la carte réseau pour le réseau virtuel iptables -t nat -A POSTROUTING -o -j MASQUERADE iptables -t nat -A POSTROUTING -s -o -j MASQUERADE Pour récupérer les fichiers //easy-rsa//, on devra disposer du logiciel **//git//** : apt install git ==== Procédure ==== - Installer le paquetage **//openvpn//** - récupérer les sources de **//easy-rsa//** - générer l'infrastructure PKI et l'autorité - générer les éléments de sécurité côté serveur - générer les éléments de sécurité côté client - configurer le fichier **//server.conf//** - configurer le fichier **//client.conf//** ou **//client.ovpn//** ===== Mode opératoire ==== ==== Installation ==== Sous Debian, OpenVPN est référencé dans les dépôts. On peut donc se contenter de l'installer via le gestionnaire de paquetage : apt install openvpn On doit aussi récupérer les fichiers **//easy-rsa//** pour générer les éléments de sécurité. cd /etc/openvpn git clone https://github.com/OpenVPN/easy-rsa.git Les éléments de sécurité sont générés en s'appuyant sur un fichier **//vars//**. Un fichier exemple est fourni dans **//easy-rsa/easyrsa3/vars.example//**. On va donc en faire une copie: cd easy-rsa/easyrsa3 cp vars.example vars On peut l'éditer et porter les modifications nécessaires (ou l'utiliser tel quel). __Remarque__ : Il n'est plus nécessaire de "sourcer" le fichier à chaque action (ancienne commande //source vars// ou //. vars//. ==== Configuration des éléments de sécurité ==== Les éléments de sécurité concernent : * La garantie de l'identité (PKI et CA) * Les clé/certificat serveur (build-server-full, diffie-hellman, éventuellement authentification TLS) * Les clé/certificat client (buid-client-full) === Infrastructure de sécurité === L'infrastructure de sécurité permet de créer un //tiers// garantissant la validité des clés et certificat. __**Remarque**__ : L'autorité de sécurité n'est pas nécessairement sur le serveur VPN (on aura recours à un tiers externe pour des éléments garantis publiquement). Les commandes suivantes permettent de créer le tiers (PKI) et le certificat (CA) qui signera tous les couples clés/certificats ultérieurs : cd easy-rsa/easyrsa3 //se positionne dans le dossier des scripts si ce n'est déjà fait ./easyrsa init-pki //crée le dossier pki (et sous dossiers) pour le stockage des clés/certificats ./easyrsa build-ca //il vous sera demandé de fournir les informations de votre organisation //le fichier ca.crt sera généré dans le dossier pki === Éléments de sécurité du serveur === Le serveur doit disposer d'une clé privée (unique, jamais distribuée) et d'un certificat qui sera diffusé aux clients VPN pour établir la connexion. Une commande unique génère ces deux éléments ainsi qu'un fichier //.req// qui permettra l'importation des certificats auprès d'autres machines (si l'autorité est sur un serveur différent du VPN). ./easyrsa build-server-full Les fichiers sont générés dans les dossiers * **//pki/private//** pour les clés, * **//pki/issued//** pour les certificats * **//pki/req//** pour les fichiers d'importation de certificats On peut ajouter un niveau de sécurité en ajoutant la négociation **//diffie-hellman//** qui recalcule les clés d'échange à intervalle (temps, volume, nombre de requêtes) régulier. ./easyrsa gen-dh Le fichier généré est stocké dans le dossier **//pki//**. On peut ajouter un niveau de sécurité au tunnel en générant une clé secrète qui sera pré-partagée (connue des deux extrémités) et nécessaires à l'établissement des premiers échanges. openvpn --genkey --secret .key === Éléments de sécurité du client === Pour chaque client, on doit générer les trois fichiers (//key, crt et req//) qui permettront de le distinguer et d'établir une connexion. Chaque client recevra ses éléments personnels ainsi que les éléments de sécurité publics du serveur (ca, dh, tls). ./easyrsa build-client-full Les fichiers sont générés dans les dossiers * **//pki/private//** pour les clés, * **//pki/issued//** pour les certificats * **//pki/req//** pour les fichiers d'importation de certificats ==== Configuration du service sur le serveur OpenVPN ==== Le service OpenVPN utilise les fichiers de configuration contenus dans le dossier openvpn (ou ses sous-dossiers) Le fichier de configuration du serveur contient les éléments suivants : # Port protocole et interface port 1194 #port d'écoute du service. 1194 est la valeur IANA proto udp #udp est plus léger que TCP (mais risque de moindre qualité). TCP peut écrouler la liaison. dev tun #mode de fonctionnement (tunnel ici, il existe aussi tap) # fichiers de sécurité à prendre en compte ca /.crt cert /.crt key /.key dh /.pem # adressage du réseau virtuel server #Option si on souhaite reconnecter les clients avec la même IP en cas de déconnexion du serveur ifconfig-pool-persist ipp.txt #garde en cache des informations pour relancer en cas d'interruption persist-key persist-tun #permet de garder le contact entre les extrémités ou de détecter une déconnexion keepalive 10 120 #compression qui permet d'alléger le trafic #comp-lzo est une version obsolète compress lz4-v2 push "compress lz4-v2" #renvoie la propriété vers le client #restriction des droits du processus en exécution (sécurité) user nobody group nogroup #gestion des logs status openvpn-status.log verb 3 #la directive push route permet de rediriger le trafic du client dans le tunnel push "route " #exemple push "route 192.168.0.0 255.255.0.0" # option à utiliser si on veut rediriger tout le trafic du client dans le tunnel (lui reconfigure sa passerelle) push "redirect-gateway def1 bypass-dhcp" # réaffecte les valeurs du serveur DNS connu par le client push "dhcp-option DNS " push "dhcp-option DNS " #option si on veut autoriser les échanges directs entre les clients client-to-client #option si on veut permettre plusieurs connexions avec un même certificat client duplicate-cn # à utiliser si on a généré le secret tls-auth /.key 0 #algorithme d'encryption cipher BF-CBC #Blowfish, le plus basique ; cipher AES-128-CBC #AES ;cipher DES-EDE3-CBC #triple-DES * Test du fichier.conf aller dans /etc/openvpn lancer la commande openvpn .conf Si tous fonctionne bien il vous demande un password entrez le mot de passe PEM crée précédemment. Il vous demandera d'utiliser la commande ensuite entrez le mot de passe PEM une seconde fois. ===== Paramétrage du client ===== Le poste client doit disposer des éléments suivants : * Certificat de l'autorité de certification (ca.crt en général) * Paramètre de sécurité Diffie-Hellman (fichier .pem) * Clé secrète pré-partagée (ta.key généralement) * Clé privée du client générée précédemment (.key) * Certificat du client généré précédemment (.crt) * Fichier de configuration //.ovpn// ou //.conf// Le fichier de configuration du client comportera les éléments suivants : __Remarque__ : Le nom du fichier .conf ou .ovpn correspondra au nom de la connexion dans le logiciel #indique le mode d'exécution du logiciel : ici en mode client client #interface virtuelle pour la communication : ici en mode tunnel dev tun #protocole d'échange : doit être le même que pour le serveur proto udp #informations du serveur VPN remote #mode d'établissement de la connexion resolv-retry infinite nobind #éléments de conservation de la connexion persist-key persist-tun #éléments de sécurité : tout ce qui est utilisé côté serveur doit l'être ici aussi ca .crt dh .pem #tls-auth .key #éléments de sécurité propre au client cert .crt key .key #Compression et affichage verb 3 compress lz4-v2 pull