Configurer OpenVPN pour s'authentifier avec LinOTP
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
- Installer LinOTP ou s’assurer qu’il est accessible via une URL (http(s)).
- Installer et configurer un module PAM Python (pam_py_linotp) sur le serveur OpenVPN.
- Ajouter une pile PAM réutilisable (common-linotp) pointant sur l’URL LinOTP.
- Configurer OpenVPN pour déléguer l’authentification au module PAM (openvpn-auth-pam).
- 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)
- Installer OpenVPN et générer CA + certificats.
- Installer LinOTP et créer un administrateur LinOTP.
- Installer libpam-python et pam_py_linotp (pip ou source).
- Créer /etc/pam.d/common-linotp en pointant vers l’URL LinOTP.
- Configurer /etc/pam.d/openvpn pour inclure common-linotp.
- Configurer server.conf pour charger plugin openvpn-auth-pam.
- 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.
Matériaux similaires
Surveiller disque dur Ubuntu — Philesight

Voir les publications aimées sur Instagram

Compte Facebook piraté : que faire

Corriger 0x80070718 sur Windows 10

Guide pour acheter et vendre des cryptos avec CoinDCX
