🔑 OpenVPN — déploiement et double authentification

Bloc 2 Module 2.1 BTS SIO SISR Séance 2 — 3h30
FormationBTS SIO option SISR — IRIS Mediaschool
BlocB2 — Réseaux et sécurité
ModuleM2.1 — Infrastructure réseau
CompétenceB2.2 / Lien B3.4
Durée3h30
PrérequisAvoir 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), comprendre push routes et 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
DirectiveRôle
tls-cryptProtè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.soActive 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>
💡 Info

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
💡 Bonnes pratiques PKI

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

ModeDirectiveAvantagesInconvé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
💡 Décision PME — InnovatTech

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 openvpn installé.

É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.conf complet et commenté.
  • 5 profils .ovpn fonctionnels pour alice, bob, claire, david, emilie.
  • Fichier /etc/openvpn/oath.users avec 5 entrées et preuve de génération (oathtool montrant 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 tun0 et 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.

💡 Question de vérification

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

  1. Quelle directive OpenVPN active le mode tunnel Layer 3 ?
  2. À quoi sert tls-crypt par rapport à tls-auth ?
  3. Quelle commande easy-rsa génère la PKI initiale (répertoire pki/) ?
  4. En full-tunnel, quelle directive est poussée aux clients pour rediriger tout le trafic ?
  5. Quel fichier PAM configure la vérification TOTP avec pam_oath pour OpenVPN ?
📝 Afficher les corrections
  1. dev tun — Cette directive crée une interface TUN (réseau virtuel de couche 3) et transporte des paquets IP, à la différence de dev tap (couche 2 / pont).
  2. tls-crypt chiffre et authentifie le handshake TLS — Contrairement à tls-auth qui ajoute seulement un HMAC, tls-crypt chiffre entièrement les paquets de contrôle, rendant le serveur moins visible et protégeant contre les attaques par injection.
  3. ./easyrsa init-pki — Cette commande initialise le répertoire pki/ et prépare la structure easy-rsa avant toute génération de certificats.
  4. 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.
  5. /etc/pam.d/openvpn — Ce fichier PAM est référencé par le plugin openvpn-plugin-auth-pam.so et contient la règle pam_oath.so pointant vers /etc/openvpn/oath.users pour valider les codes TOTP.
💡 À retenir

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.

← C2.1.6 Séance 1 — IPsec et IKEv2 C2.2.1 Séance 1 — Admin Linux comptes et SSH →