Guide des technologies

Configurer OpenVPN pour s'authentifier avec LinOTP

6 min read Sécurité VPN Mis à jour 02 Oct 2025
OpenVPN + LinOTP : guide d'authentification
OpenVPN + LinOTP : guide d'authentification

TL;DR

Ce guide explique pas à pas comment configurer OpenVPN pour s’authentifier auprès de LinOTP via un module PAM Python (pam_py_linotp). Vous obtiendrez une VPN nécessitant à la fois un certificat client et un code OTP (2FA), avec checklists, tests et conseils de sécurité pour la mise en production.

Introduction

Ce tutoriel montre comment intégrer LinOTP comme backend d’authentification pour OpenVPN. Le résultat : un accès VPN protégé par une authentification à deux facteurs (2FA) basée sur OTP, compatible avec différents types de tokens (applications smartphone, tokens matériels, SMS selon configuration LinOTP).

Définitions rapides:

  • LinOTP : serveur de gestion et validation d’OTP (One Time Password).
  • PAM : Pluggable Authentication Modules, cadre d’authentification de Linux.

Important : ce guide part du principe que vous maîtrisez les bases d’OpenVPN et que vous gérez les certificats (CA, server.crt, client.crt).

Prérequis

  • Distribution Linux avec accès root.
  • OpenVPN installé.
  • LinOTP installé ou accessible (localhost ou hôte distant).
  • Paquets de développement possibles si compilation nécessaire.

Notes : adaptez les commandes d’installation (apt/yum/pip) à votre distribution.

Vue d’ensemble de la méthode

  1. Installer LinOTP ou s’assurer qu’il est accessible via une URL (http(s)).
  2. Installer et configurer un module PAM Python (pam_py_linotp) sur le serveur OpenVPN.
  3. Ajouter une pile PAM réutilisable (common-linotp) pointant sur l’URL LinOTP.
  4. Configurer OpenVPN pour déléguer l’authentification au module PAM (openvpn-auth-pam).
  5. Tester avec un client disposant du certificat et d’un OTP valide.

Installer et configurer LinOTP

Vous pouvez installer LinOTP depuis les paquets Debian/Ubuntu, depuis PyPI ou depuis les sources. Pour un environnement de démonstration, l’installation via pip peut suffire (vérifiez la dernière version sur PyPI).

Astuce : pour des déploiements simples, hébergez LinOTP et OpenVPN sur la même machine. Pour la haute disponibilité, séparez-les et utilisez une connexion sécurisée (HTTPS) entre OpenVPN et LinOTP.

Configuration PAM pour LinOTP

Il existe plusieurs méthodes pour authentifier contre LinOTP : Web API, RADIUS, ou PAM. Ici nous utilisons un module PAM Python appelé pam_py_linotp, plus simple à déployer que la version C.

Étapes d’installation du module pam_py_linotp :

Exemples de commandes (conserver telles quelles si vous suivez le même paquet source) :

tar -ztf pam_py_linotp-0.1.tar.gz

cd pam_py_linotp-0.1/

sudo python setup.py install

Alternative (plus rapide) :

sudo pip install pam_py_linotp

Ou copier le module Python manuellement :

cp src/ pam_linotp.py /lib/security

Vous devez aussi installer libpam-python pour pouvoir charger des modules PAM écrits en Python :

sudo apt-get install libpam-python

ou

yum install libpam-python

Ensuite, créez un fichier d’authentification empilable que l’on pourra inclure dans d’autres services (ssh, gdm, kdm, openvpn). Par exemple :

auth    [success=1 default=ignore]      pam_python.so /lib/security/pam_linotp.py \  
     debug url=https://localhost/validate/check  
auth    requisite           pam_deny.so  
auth    required            pam_permit.so  

Remarques importantes :

  • Le premier argument après pam_python.so est le module Python installé/copied (ici /lib/security/pam_linotp.py).
  • La clé url= doit pointer vers le point d’API de validation LinOTP. Adaptez le protocole (http/https) et le port selon votre déploiement.
  • Si LinOTP est sur la même machine qu’OpenVPN, utilisez localhost; sinon mettez l’adresse IP ou le nom DNS.

Conservez ce fichier sous un nom réutilisable, par exemple /etc/pam.d/common-linotp.

Configurer OpenVPN pour utiliser PAM

Client configuration (client.ovpn) — adaptez servername et noms de certificats :

client  
dev tun  
proto udp  
remote your.server.com 1194  
resolv-retry infinite  
nobind  
persist-key  
persist-tun  
ca ca.crt  
cert client.crt  
key client.key  
comp-lzo  
verb 3  
auth-user-pass  

Serveur OpenVPN (server.conf) — adaptez les certificats et la plage IP :

port 1194  
proto udp  
dev tun  
ca ca.crt  
cert server.crt  
key server.key  
dh dh2048.pem  
server 192.168.42.0 255.255.255.0  
ifconfig-pool-persist ipp.txt  
keepalive 10 120  
comp-lzo  
persist-key  
persist-tun  
status openvpn-status.log  
verb 3  
plugin /usr/lib/openvpn/openvpn-auth-pam.so openvpn  

Enfin, éditez /etc/pam.d/openvpn pour inclure la pile common-linotp et permettre les sessions et comptes sans utilisateurs locaux :

@include common-linotp 
session    sufficient pam_permit.so
account    sufficient  pam_permit.so  

Explication : pam_permit.so pour session/account évite d’obliger la création de comptes locaux. L’authentification effective est déléguée à LinOTP via pam_py_linotp.

Quand l’utilisateur saisit un OTP (et éventuellement un PIN intégré), l’API LinOTP valide la combinaison. Si la validation réussit et que le certificat client est valable, la session VPN est établie.

Tests et critères d’acceptation

Critères d’acceptation minimaux :

  • L’utilisateur avec un certificat client valide et un OTP correct obtient la connexion VPN.
  • Un utilisateur sans certificat valide se voit refuser l’accès avant l’étape d’OTP.
  • Un utilisateur avec certificat valide mais OTP invalide se voit refuser l’accès.

Cas de test recommandés :

  • Connexion avec certificat et OTP valides → succès.
  • Connexion sans certificat (ou certificat invalidé) et OTP valide → échec.
  • Connexion avec certificat valide et OTP expiré/incorrect → échec.
  • Test de latence et comportement si LinOTP indisponible (voir runbook ci‑dessous).

Playbook d’installation (SOP rapide)

  1. Installer OpenVPN et générer CA + certificats.
  2. Installer LinOTP et créer un administrateur LinOTP.
  3. Installer libpam-python et pam_py_linotp (pip ou source).
  4. Créer /etc/pam.d/common-linotp en pointant vers l’URL LinOTP.
  5. Configurer /etc/pam.d/openvpn pour inclure common-linotp.
  6. Configurer server.conf pour charger plugin openvpn-auth-pam.
  7. Redémarrer OpenVPN et effectuer les tests clients.

Runbook d’incident et procédures de rollback

Scénario : LinOTP inaccessible → tous les utilisateurs ne peuvent plus s’authentifier. Actions :

  • Vérifier accessibilité réseau vers l’URL LinOTP (curl -kv https://linotp-host/validate/check).
  • Vérifier service LinOTP (systemctl status linotp ou logs applicatifs).
  • Basculer OpenVPN vers un mode d’authentification alternatif (si prévu), ou activer une règle de contournement temporaire en production après évaluation du risque. Rollback : rétablir l’ancien /etc/pam.d/openvpn ou tout mécanisme d’auth fallback testé.

Important : tout contournement doit être documenté et validé par l’équipe sécurité.

Checklist par rôle

Administrateur VPN:

  • Certificats CA/server/client valides
  • Plugin PAM installé et testé
  • Pare‑feu ouvert sur port UDP/TCP choisi

Administrateur LinOTP:

  • Utilisateurs inscrits et tokens assignés
  • Endpoint /validate/check fonctionnel
  • Sauvegardes et supervision en place

Utilisateur final:

  • Certificat client installé et importé
  • Application OTP ou token matériel prêt
  • Connaissance de la méthode de saisie (PIN+OTP si applicable)

Sécurité et durcissement

  • Forcer HTTPS entre OpenVPN et LinOTP. Ne laissez pas d’API LinOTP en clair.
  • Restreindre l’accès à l’endpoint LinOTP via pare‑feu ou réseau privé.
  • Activer le logging et la rotation des logs pour LinOTP et OpenVPN.
  • Mettre en place des SLI/SLO opérationnels pour LinOTP (disponibilité, latence des validations).

Compatibilité et migration

  • Debian/Ubuntu : utilisez apt pour libpam-python; pip peut être préférable pour pam_py_linotp.
  • RHEL/CentOS : yum/dnf pour paquets système; adaptez les chemins de modules PAM (/lib64 vs /lib).
  • Si vous migrez d’une solution RADIUS, envisagez d’activer un intermédiaire RADIUS↔LinOTP.

Cas où cette méthode peut échouer

  • LinOTP indisponible → échec d’authentification.
  • Versions incompatibles de libpam-python et Python système.
  • Chemins de modules PAM incorrects (/lib vs /lib64).

Diagramme de décision (sélection du mode d’authentification)

flowchart TD
  A[Besoin 2FA pour VPN?] -->|Oui| B[LinOTP disponible?]
  B -->|Oui| C[Utiliser pam_py_linotp]
  B -->|Non| D[Utiliser RADIUS ou MFA cloud]
  A -->|Non| E[Auth par certificats suffisant]

Mini-glossaire (1 ligne chacun)

  • OTP : mot de passe à usage unique, souvent généré par une app ou token.
  • PAM : cadre d’authentification modulaire sous Unix/Linux.
  • LinOTP : serveur de gestion et validation d’OTP.

Résumé final

Vous avez maintenant un chemin clair pour intégrer LinOTP à OpenVPN via PAM : installez pam_py_linotp, définissez une pile PAM réutilisable, configurez OpenVPN pour déléguer l’authentification, puis testez selon les critères donnés. Cette approche permet d’exiger à la fois un certificat client et un code OTP, renforçant ainsi la sécurité d’accès VPN.

Notes:

  • Ne publiez pas vos endpoints LinOTP sans protection.
  • Testez toujours les scénarios de panne pour éviter une coupure globale d’accès.
Auteur
Édition

Matériaux similaires

Surveiller disque dur Ubuntu — Philesight
Administration système

Surveiller disque dur Ubuntu — Philesight

Voir les publications aimées sur Instagram
Réseaux sociaux

Voir les publications aimées sur Instagram

Compte Facebook piraté : que faire
Sécurité en ligne

Compte Facebook piraté : que faire

Corriger 0x80070718 sur Windows 10
Support Windows

Corriger 0x80070718 sur Windows 10

Guide pour acheter et vendre des cryptos avec CoinDCX
Cryptomonnaie

Guide pour acheter et vendre des cryptos avec CoinDCX

Voir publications aimées sur Instagram — guide
Réseaux sociaux

Voir publications aimées sur Instagram — guide