Zurück zur Startseite

OpenVPN + Keycloak: OAuth2-Einrichtung

Das Material beschreibt die Integration von OpenVPN mit Keycloak über das openvpn-auth-oauth2-Plugin für zentralisierte Authentifizierung. Serverkonfigurationen, nginx-proxy und Client auf Ubuntu 24.04 werden bereitgestellt. Geeignet für skalierbare Installationen mit Nutzerwachstum.

VPN-Einrichtung mit Keycloak und OpenVPN-Plugin
Advertisement 728x90

OpenVPN mit Keycloak über openvpn-auth-oauth2 integrieren

Bisher basierte der Zugriff auf Ressourcen in einer geschützten Umgebung auf Yandex Cloud auf einer selbst gehosteten OpenVPN-Lösung mit PAM-Authentifizierung. Mit wachsender Benutzerzahl wurde die Integration mit Keycloak notwendig. Das openvpn-auth-oauth2-Plugin ermöglicht die OAuth2-Authentifizierung über Keycloak und ist für Debian-basierte sowie RedHat-Systeme geeignet.

Die Installation unter Ubuntu 24.04 LTS erfolgt direkt aus dem Projekt-Repository:

curl -L https://raw.githubusercontent.com/jkroepke/openvpn-auth-oauth2/refs/heads/main/packaging/apt/openvpn-auth-oauth2.sources | sudo tee /etc/apt/sources.list.d/openvpn-auth-oauth2.sources
sudo apt update
sudo apt install openvpn-auth-oauth2

Erstellen eines Clients in Keycloak

In Keycloak einen neuen Client für das Plugin erstellen:

Google AdInline article slot
  • Client-ID festlegen: openvpn-auth-oauth2.
  • Client-Authentifizierung: EIN.
  • Standard-Flow aktivieren: EIN.
  • Zugriffstyp: confidential.

Kopieren Sie den Client-Geheimnis – es wird für die Konfiguration benötigt.

Konfiguration des openvpn-auth-oauth2-Plugins

Hauptkonfigurationsdatei: /etc/openvpn-auth-oauth2/config.yaml. Minimale funktionstüchtige Konfiguration:

http:
  baseurl: "https://vpn.yourdomain.com"
  listen: ":9000"
  secret: "your_secret_password"
oauth2:
  issuer: "https://keycloak.yourdomain/realms/securerealm"
  client:
    id: "openvpn-auth-oauth2"
    secret: "your_secret_from_keycloak_client"
openvpn:
  addr: "unix:///run/openvpn/server.sock"
  password: "your_secret_password"

Parameter:

Google AdInline article slot
  • baseurl: Domain für den OAuth2-Endpunkt, über nginx auf Port 9000 weitergeleitet.
  • listen: Dienstport.
  • secret: Schlüssel zur Cookie-Verschlüsselung (16/24/32 Zeichen).
  • issuer: Keycloak-URL mit Realm.
  • client.id/secret: Client-Zugangsdaten aus Keycloak.
  • openvpn.addr/password: Socket und Passwort für OpenVPN.

Konfiguration des OpenVPN-Servers

Erstellen Sie die Datei /etc/openvpn/server/server-keycloak.conf:

port 56890
management /run/openvpn/server.sock unix /etc/openvpn/password.txt
management-client-auth
auth-user-pass-optionals
auth-gen-token 28800 external-auth
proto udp
dev tun
ca /etc/openvpn/certs/ca.crt
cert /etc/openvpn/certs/server.crt
key /etc/openvpn/certs/server.key
dh /etc/openvpn/certs/dh.pem
server 10.212.245.0 255.255.255.0
client-config-dir /etc/openvpn/ccd
ifconfig-pool-persist /etc/openvpn/ipp.txt
push "route 10.167.0.0 255.255.0.0"
push "route 10.168.0.0 255.255.0.0"
push "route 10.169.0.0 255.255.0.0"
keepalive 10 120
cipher AES-256-GCM
max-clients 100
persist-tun
status /var/log/openvpn/openvpn-keycloak-status.log
verb 3

Wichtige Optionen für die Integration:

  • management ...: Unix-Socket für externe Steuerung.
  • management-client-auth: erlaubt externe Befehle.
  • auth-user-pass-optionals: erfordert keine Client-Anmeldedaten.
  • auth-gen-token 28800 external-auth: Token vom Plugin, TTL von 8 Stunden.

Dienst starten:

Google AdInline article slot
systemctl enable openvpn-server@server-keycloak --now

Proxying über nginx

Installieren Sie nginx und certbot für HTTPS. Konfigurationsdatei /etc/nginx/conf.d/vpn.yourdomain.com.conf:

server {
    server_name vpn.yourdomain.com;
    listen 80;
    listen [::]:80;
    access_log /var/log/nginx/vpn.yourdomain.com-access.log;
    error_log /var/log/nginx/vpn.yourdomain.com-error.log;

    location ^~ /.well-known/acme-challenge/ {
        default_type "text/plain";
        root /var/www/certbot;
    }

    location / {
        return 301 https://$host$request_uri;
    }
}

server {
    server_name vpn.yourdomain.com;
    listen 443 ssl;
    error_log /var/log/nginx/vpn.yourdomain.com-error.log;

    ssl_certificate /etc/letsencrypt/live/vpn.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/vpn.yourdomain.com/privkey.pem;

    location ^~ /.well-known/acme-challenge/ {
        default_type "text/plain";
        root /var/www/certbot;
    }

    location / {
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass http://localhost:9000;
    }
}

nginx neu laden: systemctl reload nginx.

Client-Konfiguration und Test

Client-.ovpn-Datei:

client
dev tun
proto udp
remote vpn.yourdomain.com 56890
nobind
persist-key
persist-tun
verb 3
<ca>
-----BEGIN CERTIFICATE-----
Hier Ihr CA-Zertifikat
-----END CERTIFICATE-----
</ca>
cipher AES-256-GCM

Importieren Sie die Datei in einen OpenVPN-Client (z. B. OpenVPN Access Server). Bei Verbindung wird der Browser zur Keycloak-Authentifizierung umgeleitet. Bei Erfolg:

  • Der Browser zeigt eine Bestätigung an.
  • Die VPN-Verbindung wird erfolgreich hergestellt.

Konsolenbasierte Clients unterstützen den Browser-Flow nicht – zusätzliche Anpassungen sind erforderlich.

Wichtige Erkenntnisse

  • Das openvpn-auth-oauth2-Plugin ersetzt PAM durch OAuth2 über Keycloak für skalierbare Authentifizierung.
  • Verwenden Sie Unix-Sockets für sichere OpenVPN-Steuerung.
  • Token-TTL: 28800 Sekunden (8 Stunden), anpassbar über auth-gen-token.
  • Ein nginx-Proxy ist zwingend für HTTPS und Let’s Encrypt-Integration.
  • Ideal für mittlere bis erfahrene DevOps-Engineer mit Fokus auf Konfiguration und Integration.

— Editorial Team

Advertisement 728x90

Weiterlesen