Technologieführer

OpenVPN mit LinOTP: Zwei-Faktor-Authentifizierung einrichten

5 min read Sicherheit Aktualisiert 02 Oct 2025
OpenVPN mit LinOTP: Zwei-Faktor-Authentifizierung
OpenVPN mit LinOTP: Zwei-Faktor-Authentifizierung

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/security

Um 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.

Autor
Redaktion

Ähnliche Materialien

Podman auf Debian 11 installieren und nutzen
DevOps

Podman auf Debian 11 installieren und nutzen

Apt-Pinning: Kurze Einführung für Debian
Systemadministration

Apt-Pinning: Kurze Einführung für Debian

FSR 4 in jedem Spiel mit OptiScaler
Grafikkarten

FSR 4 in jedem Spiel mit OptiScaler

DansGuardian + Squid (NTLM) auf Debian Etch installieren
Netzwerk

DansGuardian + Squid (NTLM) auf Debian Etch installieren

App-Installationsfehler auf SD-Karte (Error -18) beheben
Android

App-Installationsfehler auf SD-Karte (Error -18) beheben

Netzwerkordner mit KNetAttach in KDE
Linux Netzwerk

Netzwerkordner mit KNetAttach in KDE