OpenVPN mit LinOTP: Zwei-Faktor-Authentifizierung einrichten
Diese Anleitung zeigt Schritt für Schritt, wie Sie OpenVPN so konfigurieren, dass sich Benutzer gegen einen LinOTP-Backend authentifizieren. Sie erreichen damit VPN-Verbindungen mit Zwei-Faktor-Authentifizierung (Client-Zertifikat + OTP). Enthalten: PAM-Integration, OpenVPN- und Client-Konfiguration, alternative Ansätze und Troubleshooting.
Einführung
In dieser Anleitung lernen Sie, wie OpenVPN Benutzer mithilfe von LinOTP authentifiziert. LinOTP verwaltet OTP-Token (One-Time Passwords) — etwa Hardware-Token, Apps auf Smartphones oder SMS/Email-basierte Token. Durch Kombination von Client-Zertifikat und OTP entsteht eine starke Zwei-Faktor-Authentifizierung.
Kurze Definition: LinOTP ist ein Open-Source-Back-End zur Verwaltung und Validierung von OTP-Tokens über Web-API oder PAM.
Wichtig: Diese Anleitung eignet sich sowohl für kleine Installationen als auch für Umgebungen mit vielen Nutzern und unterschiedlichen Token-Typen.
Übersicht der Schritte
- LinOTP installieren und konfigurieren
- PAM-Integration mit pam_py_linotp einrichten
- OpenVPN so konfigurieren, dass PAM-Abfragen ausgeführt werden
- Client-Konfiguration anpassen und testen
LinOTP einrichten
Zuerst installieren Sie LinOTP. Es gibt Debian/Ubuntu-Pakete oder Installation über PyPI für eine schnelle Demo-Umgebung. Wählen Sie die Methode, die zu Ihrer Produktions-/Testumgebung passt.
Hinweis: Sie können LinOTP und OpenVPN auf derselben Maschine betreiben, um Netzwerkkomplexität gering zu halten.
PAM für LinOTP konfigurieren
Es gibt mehrere Optionen, gegen LinOTP zu authentifizieren: Web-API, RADIUS oder PAM-Module. Für direkte Integration auf dem OpenVPN-Host ist PAM häufig die einfachste Wahl.
LinOTP stellt ein pam_linotp in C bereit, das in den Authentifizierungsmodulen enthalten ist. Wenn Sie jedoch das Kompilieren und zusätzliche Entwicklungs-Pakete vermeiden wollen, eignet sich das Python-basierte Modul pam_py_linotp.
Installieren Sie pam_py_linotp auf dem OpenVPN-Server:
Sie können das Archiv herunterladen, entpacken und installieren:
tar -ztf pam_py_linotp-0.1.tar.gz
cd pam_py_linotp-0.1/
sudo python setup.py install
Oder schneller mit pip:
sudo pip install pam_py_linotp
Alternativ können Sie die einzelne Python-Datei kopieren:
cd pam_py_linotp-0.1/
cp src/ pam_linotp.py /lib/securityUm dieses Python-PAM-Modul zu benutzen, benötigen Sie libpam-python. Installieren Sie es entsprechend Ihrer Distribution:
sudo apt-get install libpam-python
oder
yum install libpam-python
Damit PAM-Anfragen für mehrere Dienste einheitlich sind, legen wir eine stapelbare Authentifizierungsdatei an, z. B. common-linotp:
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
Wichtig: Der erste Parameter nach pam_python.so ist das Python-Modul, das Sie installiert oder kopiert haben. Ersetzen Sie die URL durch die Adresse Ihres LinOTP-Servers. Wenn LinOTP auf demselben Host läuft, können Sie “localhost” verwenden. Passen Sie Protokoll (https/http) und Port entsprechend an.
Diese Datei (common-linotp) kann später in PAM-Definitionen wie /etc/pam.d/openvpn eingebunden werden.
OpenVPN mit PAM einrichten
Client-seitig erstellen oder bearbeiten Sie Ihre client.ovpn so:
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
Passen Sie Servername und Zertifikatdateien an.
Auf dem OpenVPN-Server bearbeiten Sie server.conf:
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
Passen Sie Zertifikate und IP-Pool an Ihre Umgebung an.
Dann erstellen bzw. bearbeiten Sie /etc/pam.d/openvpn und fügen Sie Folgendes ein:
@include common-linotp
session sufficient pam_permit.so
account sufficient pam_permit.so
Die session- und account-Zeilen nutzen pam_permit.so, damit keine lokalen Systemkonten für VPN-Benutzer auf dem OpenVPN-Server erforderlich sind. Die Authentifizierung erfolgt rein über LinOTP (und optional zusätzliche Prüfungen wie Client-Zertifikat).
Wenn ein Benutzer das korrekte OTP (und optional einen PIN) eingibt und das Client-Zertifikat gültig ist, wird die VPN-Verbindung hergestellt.
Wann diese Lösung nicht ideal ist
- Wenn Sie bereits eine RADIUS-Infrastruktur haben, ist RADIUS-Integration oft skalierbarer.
- Für sehr große Installationen mit mehreren Standorten kann ein dediziertes Authentifizierungs-Gateway sinnvoller sein.
- Wenn Sie keine Möglichkeit haben, Python-PAM-Module zu installieren (z. B. restriktive Distributionen), sind alternative Wege nötig.
Alternative Ansätze
- LinOTP über RADIUS betreiben: LinOTP kann RADIUS sprechen und so in bestehende RADIUS-basierte Umgebungen integriert werden.
- Direkte Web-API-Anfragen aus einem eigenen Auth-Plugin von OpenVPN: Entwickeln Sie ein kleines Plugin, das die LinOTP-Validate-API nutzt.
- Verwenden des nativen C pam_linotp, wenn Sie Performance oder strikte Systemintegration benötigen.
Minimal-Methode (Kurz-Checkliste)
- LinOTP-Server installieren und erreichbar machen
- pam_py_linotp installieren oder pam_linotp kopieren
- libpam-python installieren
- common-linotp anlegen und URL anpassen
- OpenVPN server.conf plugin-Zeile setzen
- /etc/pam.d/openvpn mit @include common-linotp versehen
- Client-Konfiguration mit auth-user-pass aktivieren
- Verbindung testen
Rollenspezifische Checkliste
- Administrator (LinOTP): Benutzer und Token bereitstellen, API-Endpoint überwachen.
- OpenVPN-Admin: PAM-Module installieren, OpenVPN-Konfiguration anpassen, Client-Zertifikate verwalten.
- Endbenutzer: Client-Zertifikat, VPN-Client-Konfiguration, korrekte Eingabe von OTP/PIN.
Sicherheitsempfehlungen
- Nutzen Sie HTTPS für die Kommunikation zwischen PAM-Modul und LinOTP-Server.
- Absichern des LinOTP-Servers (Firewall, Zugangsbeschränkungen, regelmäßige Updates).
- Mindest-Schlüsselgröße für DH und Zertifikate (z. B. dh2048.pem oder besser).
- Logging so konfigurieren, dass keine sensiblen OTP-Werte in Klartext landen.
- Überlegen Sie zusätzliche Härtungsmaßnahmen: SELinux/AppArmor-Profile, Beschränkung von Netzwerkzugriffen.
Troubleshooting (häufige Probleme)
- Fehler beim Laden von pam_python.so: Stellen Sie sicher, dass libpam-python installiert ist und die Pfade korrekt sind.
- Keine Verbindung: Prüfen Sie server.conf, Firewall/Port 1194, und dass das Plugin korrekt geladen wird.
- OTP-Validierung schlägt fehl: Prüfen Sie LinOTP-Logs, API-URL, Zertifikate und Uhrzeiten (Zeitabweichungen bei Token können OTP-Fehler verursachen).
- Client fragt nicht nach Benutzer/Passwort: Stellen Sie sicher, dass “auth-user-pass” in der .ovpn vorhanden ist.
Akzeptanzkriterien
- Ein Client mit gültigem Client-Zertifikat und korrektem OTP stellt erfolgreich eine VPN-Verbindung her.
- Ein Client ohne gültiges Zertifikat oder falschem OTP wird abgewiesen.
- Keine lokalen Systemkonten müssen für VPN-Benutzer auf dem OpenVPN-Host angelegt werden.
Kurze Glossarzeile
- OTP: Einmalpasswort, kurzlebiges Passwort für Zwei-Faktor-Authentifizierung.
- PAM: Pluggable Authentication Modules, modulare Authentifizierungsschicht in Unix/Linux.
- LinOTP: Back-End zur Verwaltung und Validierung von OTP-Tokens.
FAQ
Funktioniert das mit mobilen OTP-Apps wie Google Authenticator?
Ja. LinOTP unterstützt Zeitbasierte OTP (TOTP), die von mobilen Apps erzeugt werden.
Kann ich RADIUS statt PAM verwenden?
Ja. LinOTP kann in RADIUS-Setups integriert werden und ist eine gute Alternative für zentralisierte Authentifizierung.
Muss LinOTP und OpenVPN auf derselben Maschine laufen?
Nein. Es funktioniert auch verteilt; auf demselben Host reduziert es jedoch Netzwerkkomplexität.
Zusammenfassung
- Diese Anleitung beschreibt die Integration von OpenVPN mit LinOTP über PAM (pam_py_linotp).
- Vorteile: zentrale Verwaltung von OTPs, Kombination mit Client-Zertifikaten für starke Authentifizierung.
- Alternativen wie RADIUS oder direkte API-Integrationen existieren und können je nach Umgebung besser passen.
Wichtig: Testen Sie Änderungen in einer Testumgebung, bevor Sie in Produktion gehen. Prüfen Sie Logs und Absicherung Ihres LinOTP- und OpenVPN-Servers regelmäßig.
Ähnliche Materialien
Podman auf Debian 11 installieren und nutzen
Apt-Pinning: Kurze Einführung für Debian
FSR 4 in jedem Spiel mit OptiScaler
DansGuardian + Squid (NTLM) auf Debian Etch installieren
App-Installationsfehler auf SD-Karte (Error -18) beheben