OpenVPN 2.6 sur Debian 12 Bookworm
Vous pouvez peut-être vous demander pourquoi je fais un nouvelle article sur un autre service VPN alors que j'ai déjà fait celui sur WireGuard ... Alors voici quelque raison:
Pour commencer, OpenVPN est encore largement présent et utilisé dans les entreprise.
Ensuite, cela va nous permettre de faire un article dédié au comparatif des 2 solutions VPN.
Et pour finir j'aime bien installer des trucs 🤣
Prérequis:
- Un serveur avec une IP publique
- Un accès root / sudoer à celui-ci
Ajout du repository OpenVPN
Afin d'avoir les dernières nouveauté/version, nous allons utiliser le repository de la community OpenVPN. Et pas celle de Debian.
Nous resterons quand même sur les releases stable (on n'est pas fou 😛)
# Téléchargement des dépendances afin d'ajouter un répo APT
gael@lab-ovpn:~$ sudo apt-get update && sudo apt-get install curl gnupg
# Création du dossier keyrings (Déjà présent sur les releases recente)
gael@lab-ovpn:~$ sudo install -m 0755 -d /etc/apt/keyrings
# Téléchargement de la clé GPG
gael@lab-ovpn:~$ curl -fsSL https://swupdate.openvpn.net/repos/repo-public.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/openvpn-repo-public.gpg
# On donne les droits à tout le monde en lecture
gael@lab-ovpn:~$ sudo chmod a+r /etc/apt/keyrings/openvpn-repo-public.gpg
# On ajoute le répo apt stable
gael@lab-ovpn:~$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/openvpn-repo-public.gpg] https://build.openvpn.net/debian/openvpn/stable $(. /etc/os-release && echo "$VERSION_CODENAME") main" | sudo tee /etc/apt/sources.list.d/openvpn-aptrepo.list
deb [arch=amd64 signed-by=/etc/apt/keyrings/openvpn-repo-public.gpg] https://build.openvpn.net/debian/openvpn/stable bookworm main
# On met à jours la liste de nos répos et les ligne avec build.openvpn.net devraient apparaitres.
gael@lab-ovpn:~$ sudo apt-get update
Get:8 https://build.openvpn.net/debian/openvpn/stable bookworm InRelease [4412 B]
Get:9 https://build.openvpn.net/debian/openvpn/stable bookworm/main amd64 Packages [5162 B]
Création de la PKI
OpenVPN nécessite une PKI (Public Key Infrastructure). Une PKI en terme non technique est un organisme qui permet de fournir des certificats. On peut comparer cela à un Pays qui délivre des cartes d'identité.
Les certificats numériques sont des sortes de « pièces d'identité électroniques » qui permettent de vérifier l'authenticité d'une entité en ligne (comme un site web ou un utilisateur) et d'assurer le chiffrement des communications pour garantir la confidentialité.
Il y a des PKI publique que l'on utilise pour le chiffrement HTTPS par exemple, et des PKI privée (interne) que l'on utilise uniquement pour un usage interne car elle n'est pas reconnue à l'extérieur. N'importe qui peut créer une PKI interne. Pour OpenVPN elle va permettre de vérifier que nous somme bien l'émetteur du certificat avec lequel le client ce connecte sur notre infrastructure.
Easy-Rsa est un outil qui permet la création de manière simple d'une PKI.
# Installation de l'outils permettant de générer et manager une PKI
gael@lab-ovpn:~$ sudo apt-get install easy-rsa
# make-cadir va créer tous ce dont vous aurez besoin pour votre PKI
gael@lab-ovpn:~$ make-cadir openvpn-ca && cd ~/openvpn-ca
Dans ce dossier vous trouverez un fichier vars celui-ci permet la configuration de votre PKI. Nous allons modifier des variables dans ce fichier (il faudra les dé-commenter également)
# Les éléments ci dessous permettent de renseigner votre identité,
# vous pouvez mettre ce que vous souhaitez car seul vos usagés les verrons
set_var EASYRSA_REQ_COUNTRY "Fr"
set_var EASYRSA_REQ_PROVINCE "IdF"
set_var EASYRSA_REQ_CITY "Paris"
set_var EASYRSA_REQ_ORG "Inframinds"
set_var EASYRSA_REQ_EMAIL "me@inframinds.fr"
set_var EASYRSA_REQ_OU "Labs"
# Cette section concerne la cryptographie
# Nous choisissons l'algo ec au lieu de rsa
set_var EASYRSA_ALGO ec
set_var EASYRSA_CURVE secp384r1
set_var EASYRSA_DIGEST "sha512"
# Cette section concerne la validité des différents certificats
# Pour le root CA (celui qui va permettre de signer vos certiticat
# il faut une longue période, car s'il expire, cela impact tous les certificat
# généré via celui-ci.
set_var EASYRSA_CA_EXPIRE 3650
# Ici c'est la durée de validité des certificats clients (utilisateur)
# Il faut trouver le juste milieux entre un renouvellement fréquent et
# l'expérience utilisateur. J'ai choisi 2 ans.
set_var EASYRSA_CERT_EXPIRE 730
# Le certificat CRL permet d'avoir une liste de tous les certificats revoker (bloquer avant leur expiration).
# Depuis la version d'OpenVpn 2.4, si celui-ci n'est pas regénéré/actualisé avant le nombre de jour défini ci dessous
# alors le serveur OpenVPN bloquera toutes les connexions.
# Comme nous l'utilisons dans un cadre personnel/privé une grande valeur convient car nous revoquerons pas tous les jours des certificat.
set_var EASYRSA_CRL_DAYS 3650
EASYRSA_ALGO ec : Est connue pour offrir une sécurité comparable à des clés RSA plus longues avec des tailles de clés plus petites, ce qui peut être avantageux en termes de performances et de ressources. Cela permet aussi de ce séparer du paramètre Diffie-Hellman
Notre PKI est maintenant configurer, il va falloir la créer. Grâce à EASY-RSA, il suffit d'executer les commandes suivantes:
# Initialisation de la PKI
gael@lab-ovpn:~/openvpn-ca$ cd ~/openvpn-ca
gael@lab-ovpn:~/openvpn-ca$ ./easyrsa init-pki
* Notice:
init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is:
* /home/gael/openvpn-ca/pki
# Génération du ROOT CA (la paire certificat/clé permettant de d'authenfier et signer les clients)
# Nous ne mettrons pas de mot de passe sur la clé afin de simplifier la création de certificat
gael@lab-ovpn:~/openvpn-ca$ ./easyrsa build-ca nopass
* Notice:
Using Easy-RSA configuration from: /home/gael/openvpn-ca/vars
* WARNING:
Move your vars file to your PKI folder, where it is safe!
* Notice:
Using SSL: openssl OpenSSL 3.0.11 19 Sep 2023 (Library: OpenSSL 3.0.11 19 Sep 2023)
Using configuration from /home/gael/openvpn-ca/pki/7f12db8a/temp.c39738fc
-----
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.
-----
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:
* Notice:
CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/home/gael/openvpn-ca/pki/ca.crt
Vous pouvez laisser le CN tel quel ou définir un nom : "Inframinds VPN CA"
Le fichier ca.crt devra être copié sur tous les profils utilisateur et sur le serveur OpenVPN.
Le fichier ca.key est la clé privé avec laquelle notre PKI va signer nos certificats. Elle ne doit jamais être partagée. Si celle-ci est compromise, il faudra reconstruire votre PKI.
# Génération de notre certificat serveur signé par notre ROOT CA
# build-server-full va créer un certificat avec un common name "server"
# le server-full va permettre d'ajouter des métadatas d'utilisation dans le certificat
gael@lab-ovpn:~/openvpn-ca$ ./easyrsa build-server-full server nopass
* Notice:
Using Easy-RSA configuration from: /home/gael/openvpn-ca/vars
* WARNING:
Move your vars file to your PKI folder, where it is safe!
* Notice:
Using SSL: openssl OpenSSL 3.0.11 19 Sep 2023 (Library: OpenSSL 3.0.11 19 Sep 2023)
-----
* Notice:
Keypair and certificate request completed. Your files are:
req: /home/gael/openvpn-ca/pki/reqs/server.req
key: /home/gael/openvpn-ca/pki/private/server.key
You are about to sign the following certificate.
Please check over the details shown below for accuracy. Note that this request
has not been cryptographically verified. Please be sure it came from a trusted
source or that you have verified the request checksum with the sender.
Request subject, to be signed as a server certificate for 730 days:
subject=
commonName = server
Type the word 'yes' to continue, or any other input to abort.
Confirm request details: yes
Si vous avez défini EASYRSA_ALGO avec la valeur rsa dans le fichier de vars,(pour toute raison que ça soit) alors il vous faudra générer une clé Diffie Hellman.
# Génération du DH pour le mode RSA
gael@lab-ovpn:~/openvpn-ca$ ./easyrsa gen-dh
Si vous prévoyez de revoker des certificats, il faudra également générer le CRL (certificat revokation list).
Le CRL devra être généré à chaque fois qu'un certificat est révoqué... (Cf: https://openvpn.net/community-resources/revoking-certificates/)
# Génération du CRL
gael@lab-ovpn:~/openvpn-ca$ ./easyrsa gen-crl
Vous pouvez voir son contenu avec la commande
# Lecture du CRL
gael@lab-ovpn:~/openvpn-ca$ openssl crl -inform PEM -text -noout -in crl.pem
...
No Revoked Certificates.
...
Nous avons enfin toutes les clés, certificat nécessaire pour lancer notre serveur OpenVPN 🎉.
Installation et configuration du serveur
Nous pouvons maintenant installer le service OpenVPN 👏
# Installation via le repo APT community
gael@lab-ovpn:~/openvpn-ca$ sudo apt-get install openvpn
Le package OpenVPN vient également avec des outils permettant la génération d'une PSK (Clé partagé) qui rajoute de la sécurité, alors on ne va pas s'en priver 😉
# Génération de la PSK
gael@lab-ovpn:~/openvpn-ca$ sudo openvpn --genkey secret ta.key
On va copier toutes les clés et certificats nécessaire au fonctionnement d'OpenVPN dans le répertoire du service (/etc/openvpn/server)
# Copie des fichiers pour la configuration
# Copie du template de configuration
gael@lab-ovpn:~/openvpn-ca$ sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf /etc/openvpn/server/
# Copie des clés et certificats nécessaires
gael@lab-ovpn:~/openvpn-ca$ sudo cp /home/gael/openvpn-ca/pki/issued/server.crt /etc/openvpn/server/
gael@lab-ovpn:~/openvpn-ca$ sudo cp /home/gael/openvpn-ca/pki/private/server.key /etc/openvpn/server/
gael@lab-ovpn:~/openvpn-ca$ gael@lab-ovpn:~/openvpn-ca$ sudo cp /home/gael/openvpn-ca/pki/ca.crt /etc/openvpn/server/
gael@lab-ovpn:~/openvpn-ca$ sudo cp /home/gael/openvpn-ca/ta.key /etc/openvpn/server/
gael@lab-ovpn:~/openvpn-ca$ sudo cp /home/gael/openvpn-ca/pki/crl.pem /etc/openvpn/server/
Maintenant on va modifier le template que nous avons copié (/etc/openvpn/server/server.conf) pour construire notre propre fichier de configuration.
Il se peut que des paramètres ne soient pas présent dans le fichier de configuration, vous devrez donc les ajouter.
# Votre IP publique afin que le service écoute sur la bonnne interface
local 212.47.232.93
# Le port d'écoute (on laisse celui par défaut)
port 1194
# Le protocole d'écoute UDP est plus rapide, mais nécessite une connection stable
proto udp
dev tun
# Nos certificats/clés que nous avons copier dans le dossier server
ca ca.crt
cert server.crt
key server.key
# Comme nous utilisons EC comme algo, on passe Diffie-Hellman a none
dh none
# Nouvelle topologie réseau qui remplace net30 qui est deprecated
topology subnet
# Range réseau que nous utiliserons pour les clients VPN
server 10.8.0.0 255.255.255.0
# Fichier qui garde les config IP des clients
ifconfig-pool-persist /var/log/openvpn/ipp.txt
# Permet de changer la gateway par défaut du client
# cela permet de faire passer tout le traffic du client par le VPN
push "redirect-gateway def1 bypass-dhcp"
# On change de DNS pour ne pas utiliser celui de son FAI
push "dhcp-option DNS 1.1.1.1"
# Permet de vérifier si le client est toujours la.
keepalive 10 120
# Donne l'accès à la clé partagé au serveur
tls-crypt ta.key
# Algo utilisé pour le chiffrement
cipher AES-256-GCM
# Algo utilisé pour le controle d'intégrité
auth SHA256
# Permet de limiter les droits du service
user openvpn
group openvpn
persist-key
persist-tun
# Log
status /var/log/openvpn/openvpn-status.log
log /var/log/openvpn/openvpn.log
verb 3
# Nécessaire pour l'UDP, car on n'a pas de session, pour du procotol TCP il faudra passer le paramètre à 0
explicit-exit-notify 1
# Permet d'avoir de multiple client
mode server
# Accès à notre CRL
crl-verify crl.pem
# Vérifi que les clients ont un certificat de type client
remote-cert-tls client
Note 1: Certaine documentation active la compression. Après quelque recherche, j'en ai déduis que celle-ci n'était pas nécessaire car:
- Sur internet tout est déjà bien optimisé/compressé
- Cela entraine un risque de vulnérabilité VORRACLE ATTACK
Cf: https://community.openvpn.net/openvpn/wiki/Compression
Note 2: Les anciennes version d'OpenVPN utilisaient le user nobody et groupe nogroup comme utilisateur non privilégier. Ce n'est pas recommendé car ces utilisateurs sont également utilisé par d'autre programme. C'est pourquoi nous créons un utiliseur openvpn dédié.
# Création de l'utilisateur OpenVPN
gael@lab-ovpn:~/openvpn-ca$ sudo addgroup openvpn
gael@lab-ovpn:~/openvpn-ca$ sudo useradd -M --shell=/bin/false -g openvpn openvpn
Nous allons pouvoir démarrer notre serveur & activer le service 😄
# Activation du service OpenVPN et lancement
gael@lab-ovpn:~/openvpn-ca$ sudo systemctl enable openvpn-server@server.service
gael@lab-ovpn:~/openvpn-ca$ sudo systemctl start openvpn-server@server.service
# Vérification de l'état du service
gael@lab-ovpn:~/openvpn-ca$ sudo systemctl status openvpn-server@server
● openvpn-server@server.service - OpenVPN service for server
Loaded: loaded (/lib/systemd/system/openvpn-server@.service; enabled; preset: enabled)
Active: active (running) since Fri 2024-01-12 14:53:16 UTC; 3 days ago
Docs: man:openvpn(8)
https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage
https://community.openvpn.net/openvpn/wiki/HOWTO
Main PID: 77198 (openvpn)
Status: "Initialization Sequence Completed"
Tasks: 1 (limit: 2346)
Memory: 1.7M
CPU: 28.706s
CGroup: /system.slice/system-openvpn\x2dserver.slice/openvpn-server@server.service
└─77198 /usr/sbin/openvpn --status /run/openvpn-server/status-server.log --status-version 2 --suppress-timestamps --config server.conf
Jan 12 14:53:16 scw-prd-vpn-inframinds systemd[1]: Starting openvpn-server@server.service - OpenVPN service for server...
Jan 12 14:53:16 scw-prd-vpn-inframinds systemd[1]: Started openvpn-server@server.service - OpenVPN service for server.
Le mot server après @ est le nom du fichier de configuration dans le dossier /etc/openvpn/server/, cela permet d'avoir si besoin plusieurs services OpenVPN
Création d'un client
Pour nos clients, il va falloir faire à-peu-près les mêmes étape que pour la configuration du certificat serveur.
# Création d'un certificat client
gael@lab-ovpn:~$ cd ~/openvpn-ca
# client01 sera le utilisé comme Common Name
gael@lab-ovpn:~/openvpn-ca$ ./easyrsa build-client-full client01 nopass
# On valide avec Yes
Cela nous génère 2 fichiers important (la clé et le certificat du client):
- /home/gael/openvpn-ca/pki/issued/client01.crt
- /home/gael/openvpn-ca/pki/private/client01.key
Ensuite, nous allons créer un fichier de configuration unique pour notre client en se basant sur le modèle ci-dessous
# Nous somme client et l'on peut recupérer des éléments poussé par le serveur
client
# Mettre comme sur le fichier server.conf
dev tun
# Protocol pour communiquer avec le serveur
proto udp
# Liste de vos serveur VPN et port (Mettre le domaine ou l'IP publique)
remote <VOTRE_IP_PUBLIQUE> 1194
# Si plusieurs serveur sont défini on en choisi 1 au hasard.
remote-random
# Aucune idée de ce que ça fait
resolv-retry infinite
# N'utilise pas de port spécifique pour repondre
nobind
# On garde des état à travers les restart
persist-key
persist-tun
# On rajoute un controle pour s'assurer que le serveur de destination
# possède bien un certificat de type serveur
remote-cert-tls server
# On configure les même cipher que le serveur
cipher AES-256-GCM
auth SHA256
# Le niveau de log
verb 3
# Pour une configuration inline des certificats
key-direction 1
<ca>
...
</ca>
<cert>
...
</cert>
<key>
...
</key>
<tls-crypt>
...
</tls-crypt>
Vous devrez completer l'intérieur de chaque balise par le contenu des fichiers suivant:
- <ca></ca> : Le contenue du fichier /etc/openvpn/server/ca.crt
- <cert></cert> : Le contenue du fichier /home/gael/openvpn-ca/pki/issued/client01.crt
- <key></key> : Le contenue du fichier /home/gael/openvpn-ca/pki/private/client01.key
- <tls-crypt></tls-crypt> : Le contenue du fichier /etc/openvpn/server/ta.key
Vous noterez que pour chaque client, uniquement les champs cert & key seront différent (il faut en générer 1 paire par client), le reste ne changera pas.
Une fois votre fichier VPN créer, par exemple client01.ovpn. Il va falloir l'envoyer sur notre client...
Dans le cas d'un iPhone📱, il existe 2 solutions pour importer un certificat OpenVPN avec l'application (https://apps.apple.com/us/app/openvpn-connect-openvpn-app/id590379981)
- Par mail... ça veut dire que notre certificat qui doit être secret ne l'est pas pour notre fournisseur mail...
- Via transfert depuis un PC c'est la manière la plus sécurisé
On est maintenant connecté à notre serveur OpenVPN et nous possédons l'ip 10.8.0.2.
A ce point de l'article, votre client ne doit pas avoir accès à internet si le VPN est actif et c'est NORMAL. En effet il reste une partie configuration sur le serveur afin de permettre l'accès à Internet pour vos clients.
Configuration du NAT
Bon pour cette partie, je n'ai pas réinventé la roue, j'ai copier/coller ce que j'avais fait dans l'article https://inframinds.fr/securiser-votre-connexion-avec-wireguard-vpn/#configuration-du-nat en adaptant les 2 / 3 changements
Le Nat et l'IP forward, permet de configurer notre serveur comme un Routeur/une BOX. Le NAT permet à plusieurs appareils d'un réseau local (nos clients VPN) de partager une seule adresse IP publique (l'IP publique de notre serveur), facilitant ainsi leur accès à Internet et renforçant la sécurité en masquant les adresses internes.
Par défaut, les serveurs Linux n'ont pas la fonction routage d'activé (Ni le NAT). Pour cela on va devoir l'activer:
# On active la fonction d'Ip forward pour l'IPv4 de façon persistante.
gael@lab-ovpn:~$ echo "net.ipv4.ip_forward=1" | sudo tee /etc/sysctl.d/50-ipv4-forward.conf
net.ipv4.ip_forward = 1
# On l'applique sur la configuration courante
gael@lab-ovpn:~$ sudo sysctl -p /etc/sysctl.d/50-ipv4-forward.conf
net.ipv4.ip_forward = 1
# On peut vérifier la valeur courante
gael@lab-ovpn:~$ sudo sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
Maintenant que le transfert de paquet entre interface est activé, on va devoir construire notre NAT. Pour cela nous allons utiliser Iptables, c'est un outil puissant permettant de contrôler et sécuriser les flux de données sur un système Linux en spécifiant des règles de pare-feu.
# On met la polique par défaut de refuser les packets que l'on doit forward
gael@lab-ovpn:~$ sudo iptables -P FORWARD DROP
# On créé une règle Nat autorisant notre réseau OpenVPN (10.8.0.0/24) a utiliser notre IP publique sur notre interface ens2
gael@lab-ovpn:~$ sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o ens2 -j MASQUERADE
# On autorise les nouvelles connexions initialisé par notre interface tun0 (openvpn) vers ens2 (internet via l'ip publique)
gael@lab-ovpn:~$ sudo iptables -A FORWARD -i tun0 -o ens2 -s 10.8.0.0/24 -m conntrack --ctstate NEW -j ACCEPT
# On autorise les réponses
gael@lab-ovpn:~$ sudo iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
Attention !
Les règles Iptables sont chargées en mémoire, si l'on restart le serveur elles sont perdu. Pour les rendre persistante, il faut installer un packet et les sauvegarder dans un fichier.
# On installe le packet
gael@lab-vpn:~$ sudo apt-get install iptables-persistent
# On sauvegarde les règles en cours dans un fichier qui est lu au démarrage.
gael@lab-vpn:~$ sudo iptables-save | sudo tee /etc/iptables/rules.v4
Vous devriez avoir maintenant accès à Internet depuis votre client iPhone 📱.
Pour vérifier que votre IP de sorti est bien celle de votre serveur, vous pouvez utiliser un site comme https://ipinfo.io/what-is-my-ip
A gauche l'IP publique de notre FAI comme nous somme en Wifi. A droite, l'IP publique de notre serveur.
Maintenant, votre connexion est chiffré entre votre client et votre serveur. C'est votre serveur qui fera les requêtes pour vous. Donc si vous avez un serveur en Pologne, l'IP de sortie sera en Pologne, c'est une méthode qui est utilisé pour by-passer des restrictions d'accès en fonction de l'IP source.
L'avantage de cela, c'est que ça vous permet d'avoir une connexion sécurisée lorsque vous êtes sur un points d'accès non sûre (Wifi publique dans les restaurants, aéroport, rue...). Chez vous si vous avez un abonnement internet cela ne change pas grands chose à part que votre FAI ne voit pas vos requête, mais votre hébergeur si. A voir en qui vous avez le plus confiance...
Dans le monde du travail, le VPN permet au client (PC/Téléphone) d'accéder au réseau de l'entreprise de manière sécurisé. Pas de router votre traffic internet.