🔑 OpenVPN — déploiement et double authentification
| Formation | BTS SIO option SISR — IRIS Mediaschool |
|---|---|
| Bloc | B2 — Réseaux et sécurité |
| Module | M2.1 — Infrastructure réseau |
| Compétence | B2.2 / Lien B3.4 |
| Durée | 3h30 |
| Prérequis | Avoir complété la Séance 1 (IPsec et IKEv2) |
🎯 Introduction
L'explosion du télétravail en 2020 a mis en lumière un grand nombre de VPN mal configurés : le split-tunnel, souvent configuré pour économiser de la bande passante, a exposé des ressources internes en contournant les contrôles de sécurité centralisés. Une bonne architecture d'accès distant doit garantir confidentialité, authentification forte et vérifiabilité opérationnelle. Cette séance montre comment déployer OpenVPN (PKI avec easy‑rsa) et ajouter une couche d'authentification TOTP via pam_oath.
🎯 Objectifs
- Déployer un serveur OpenVPN sur
debian-srv01(192.168.10.10) avec PKI générée par easy-rsa3. - Produire des profils client
.ovpn(mode tun / layer 3), comprendrepush routeset config split/full-tunnel. - Ajouter une authentification forte TOTP (
pam_oath) et vérifier opérationnellement un tunnel (ip route,route print,tcpdump).
📖 1. Principes OpenVPN et TLS mutual auth
OpenVPN utilise TLS pour authentifier serveur et clients (mutual TLS). Une PKI est utilisée : une CA signe le certificat du serveur et ceux des clients ; la confiance est basée sur la CA.
Les modes importants :
dev tun: mode tunnel (Layer 3), crée une interface TUN pour transporter des paquets IP.dev tap: mode pont (Layer 2), utile pour protocoles non-IP ou diffusion, mais plus lourd.
Configuration serveur (server.conf)
# /etc/openvpn/server.conf (extrait)
port 1194
proto udp
dev tun
ca /etc/openvpn/pki/ca.crt
cert /etc/openvpn/pki/issued/server.crt
key /etc/openvpn/pki/private/server.key
dh /etc/openvpn/pki/dh.pem
tls-crypt /etc/openvpn/pki/ta.key
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist /var/log/openvpn/ipp.txt
push "route 192.168.10.0 255.255.255.0" # accès au réseau interne
; # push "redirect-gateway def1" # décommenter pour full-tunnel
keepalive 10 120
persist-key
persist-tun
cipher AES-256-GCM
auth SHA256
user nobody
group nogroup
verb 3
plugin /usr/lib/openvpn/plugins/openvpn-plugin-auth-pam.so openvpn
| Directive | Rôle |
|---|---|
tls-crypt | Protège le handshake TLS contre les injections et rend le serveur moins visible (tls-auth pour HMAC statique uniquement) |
push "route ..." | Envoie les routes internes aux clients — split-tunnel : réseaux d'entreprise uniquement |
push "redirect-gateway def1" | Full-tunnel : redirige tout le trafic client via le VPN |
persist-key / persist-tun | Évitent la perte d'interface/clé lors d'un redémarrage du service |
plugin ... auth-pam.so | Active l'authentification PAM (second facteur TOTP) |
Configuration client (client.ovpn)
client
dev tun
proto udp
remote 91.208.45.12 1194
resolv-retry infinite
nobind
persist-key
persist-tun
cipher AES-256-GCM
auth SHA256
remote-cert-tls server
auth-user-pass # demande user/password -> utile pour 2FA
verb 3
<ca>
# insérer ca.crt
</ca>
<cert>
# insérer client.crt
</cert>
<key>
# insérer client.key
</key>
key-direction 1
<tls-crypt>
# insérer ta.key
</tls-crypt>
La directive auth-user-pass côté client déclenche la demande d'identifiants lors de la connexion. Côté serveur, le plugin PAM valide ces identifiants via le fichier /etc/pam.d/openvpn et vérifie le code TOTP.
📖 2. Génération PKI avec easy-rsa3
Sur debian-srv01 (192.168.10.10) :
# Installer OpenVPN & easy-rsa
$ sudo apt update
$ sudo apt install -y openvpn easy-rsa
# Initialiser easy-rsa
$ make-cadir /etc/openvpn/easy-rsa
$ cd /etc/openvpn/easy-rsa
$ ./easyrsa init-pki
$ ./easyrsa build-ca nopass # ou sans nopass pour protéger la CA par mot de passe
# Créer les certificats serveur
$ ./easyrsa gen-req server nopass
$ ./easyrsa sign-req server server
$ ./easyrsa gen-dh
$ openvpn --genkey --secret ta.key # clé TLS-CRYPT
# Créer certificats clients (répéter pour 5 télétravailleurs)
$ ./easyrsa gen-req alice nopass
$ ./easyrsa sign-req client alice
# Récupérer : pki/issued/alice.crt pki/private/alice.key pki/ca.crt ta.key
# Déployer les fichiers sous /etc/openvpn/pki/ et configurer server.conf
$ sudo systemctl enable --now openvpn@server
Protéger pki/private/* avec des droits 600. Utiliser une CRL (Certificate Revocation List) pour révoquer des certificats clients compromis. Automatiser la génération des profils .ovpn regroupant certs et clés en un seul fichier.
📖 3. Split-tunnel vs Full-tunnel — sécurité et performances
| Mode | Directive | Avantages | Inconvénients |
|---|---|---|---|
| Split-tunnel | push "route 192.168.10.0 255.255.255.0" |
Moins de charge serveur, latence réduite pour le trafic internet local | Trafic local non filtré, risque si le poste est compromis |
| Full-tunnel | push "redirect-gateway def1" |
Centralisation de la sécurité, inspection et filtrage complets | Consomme la bande passante serveur, impact latence |
Privilégier le split-tunnel si la bande passante est limitée, mais documenter précisément les ressources exposées et exiger des contrôles endpoints (EDR, filtrage local).
🛠️ Travaux Pratiques (60 min)
Contexte
Vous êtes administrateurs d'InnovatTech. debian-srv01 (192.168.10.10) doit offrir un accès distant OpenVPN aux 5 télétravailleurs : alice, bob, claire, david, emilie. Le serveur devra utiliser PKI easy-rsa, fournir des profils .ovpn, et exiger un second facteur TOTP via pam_oath.
Prérequis techniques
- VM
debian-srv01(Debian 12) avec IP 192.168.10.10, accès root. - Paquets :
openvpn,easy-rsa,libpam-oath,oathtool. - Client Linux avec
openvpninstallé.
Étape 1 — Installation et PKI
# Sur debian-srv01
sudo apt update && sudo apt install -y openvpn easy-rsa libpam-oath oathtool
make-cadir /etc/openvpn/easy-rsa
cd /etc/openvpn/easy-rsa
./easyrsa init-pki
./easyrsa build-ca nopass
./easyrsa gen-req server nopass
./easyrsa sign-req server server
./easyrsa gen-dh
openvpn --genkey --secret ta.key
# Créer clients (répéter pour chaque télétravailleur)
./easyrsa gen-req alice nopass
./easyrsa sign-req client alice
Copiez pki/issued/*.crt, pki/private/*.key, pki/ca.crt, ta.key sous /etc/openvpn/pki/ puis adaptez /etc/openvpn/server.conf.
Étape 2 — Configurer PAM + pam_oath pour TOTP
# Générer fichier users OATH
sudo touch /etc/openvpn/oath.users
sudo chown root:root /etc/openvpn/oath.users
sudo chmod 600 /etc/openvpn/oath.users
# Générer une secret base32 et ajouter alice
SECRET=$(head -c 100 /dev/urandom | base32 | tr -dc 'A-Z2-7' | head -c 32)
echo "TOTP/T30/6 alice - $SECRET" | sudo tee -a /etc/openvpn/oath.users
# Répéter pour bob, claire, david, emilie
# Tester le TOTP localement
oathtool --totp -b $SECRET
Créer /etc/pam.d/openvpn :
# /etc/pam.d/openvpn
auth required pam_oath.so usersfile=/etc/openvpn/oath.users window=30 digits=6
account required pam_unix.so
Activer le plugin PAM dans server.conf (déjà présent dans l'extrait de la section 1) :
plugin /usr/lib/openvpn/plugins/openvpn-plugin-auth-pam.so openvpn
# Les clients devront utiliser 'auth-user-pass' et fournir :
# username et le code TOTP (ex: alice + 6-digit code)
Étape 3 — Construire les profils .ovpn
Pour chaque utilisateur, créer un fichier alice.ovpn intégrant les blocs <ca>, <cert>, <key>, <tls-crypt> et la directive auth-user-pass. Assurer la distribution sécurisée (SCP, clés USB chiffrées ou gestionnaire de secrets interne).
Étape 4 — Test depuis un client Linux
# Sur client Linux
$ sudo openvpn --config alice.ovpn
# Entrer username: alice
# Entrer password: <code TOTP 6 chiffres>
# Vérifications
$ ip addr show tun0
$ ip route
$ ping -c 3 192.168.10.5 # serveur interne
$ sudo tcpdump -i tun0 -n -vv
Sur Windows : importer le .ovpn dans OpenVPN GUI et vérifier route print pour les routes poussées.
Livrable attendu
- Fichier
/etc/openvpn/server.confcomplet et commenté. - 5 profils
.ovpnfonctionnels pour alice, bob, claire, david, emilie. - Fichier
/etc/openvpn/oath.usersavec 5 entrées et preuve de génération (oathtoolmontrant des codes valides). - Journal de connexion montrant un client connecté (
journalctl -u openvpn@server).
Critères de réussite
- ☐ Le client Linux obtient une interface
tun0et une route vers 192.168.10.0/24. - ☐ Le journal serveur montre l'authentification TLS réussie et la validation PAM/TOTP.
- ☐ Les 5 profils clients se connectent et accèdent aux ressources internes autorisées.
📖 Vérification avancée et diagnostics
Côté client Linux
# Interface tunnel
$ ip addr show tun0
# Table de routage
$ ip route show
# Capture de paquets sur l'interface TUN
$ sudo tcpdump -i tun0 -n -vv
Côté client Windows
PS> route print
PS> ipconfig /all # vérifier DNS et interface virtuelle
Côté serveur
# Logs OpenVPN
$ sudo journalctl -u openvpn@server -e
# Trafic UDP vers le port 1194
$ sudo tcpdump -i eth0 udp port 1194 -n -vv
📝 Synthèse de séance
Cette séance a montré le déploiement complet d'un serveur OpenVPN basé sur PKI et marqué les points critiques : choix entre split/full-tunnel, persistance des tun/key, et l'ajout d'une seconde couche d'authentification avec pam_oath pour TOTP. L'approche combinant certificats (TLS mutual) + TOTP via PAM fournit une authentification à deux facteurs robuste pour l'accès distant.
En une phrase, expliquez la différence opérationnelle entre push "route 192.168.10.0 255.255.255.0" et push "redirect-gateway def1".
📝 QCM — Testez vos connaissances
- Quelle directive OpenVPN active le mode tunnel Layer 3 ?
- À quoi sert
tls-cryptpar rapport àtls-auth? - Quelle commande easy-rsa génère la PKI initiale (répertoire
pki/) ? - En full-tunnel, quelle directive est poussée aux clients pour rediriger tout le trafic ?
- Quel fichier PAM configure la vérification TOTP avec
pam_oathpour OpenVPN ?
📝 Afficher les corrections
dev tun— Cette directive crée une interface TUN (réseau virtuel de couche 3) et transporte des paquets IP, à la différence dedev tap(couche 2 / pont).tls-cryptchiffre et authentifie le handshake TLS — Contrairement àtls-authqui ajoute seulement un HMAC,tls-cryptchiffre entièrement les paquets de contrôle, rendant le serveur moins visible et protégeant contre les attaques par injection../easyrsa init-pki— Cette commande initialise le répertoirepki/et prépare la structure easy-rsa avant toute génération de certificats.push "redirect-gateway def1"— Cette directive ordonne au client de rediriger tout son trafic (y compris internet) via le tunnel VPN, ce qui constitue un full-tunnel./etc/pam.d/openvpn— Ce fichier PAM est référencé par le pluginopenvpn-plugin-auth-pam.soet contient la règlepam_oath.sopointant vers/etc/openvpn/oath.userspour valider les codes TOTP.
OpenVPN s'appuie sur une PKI (easy-rsa) pour le mutual TLS. Le choix split vs full-tunnel est un arbitrage sécurité/performance. L'ajout de pam_oath et oathtool permet un second facteur TOTP sans infrastructure supplémentaire. Toujours vérifier l'établissement du tunnel avec ip route, tcpdump et les logs journalctl.
