Integrace OpenVPN s Keycloak přes plugin openvpn-auth-oauth2
Dříve se pro přístup k prostředkům v zabezpečeném prostředí na platformě Yandex Cloud používal samostatný OpenVPN server s ověřováním prostřednictvím PAM. S rostoucím počtem uživatelů byla potřeba integrace s Keycloakem. Plugin openvpn-auth-oauth2 umožňuje ověření pomocí OAuth2 přes Keycloak a podporuje systémy podobné Debianu i RedHat.
Instalace na Ubuntu 24.04 LTS probíhá přímo z repozitáře projektu:
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
Vytvoření klienta v Keycloaku
V Keycloaku vytvořte nového klienta pro plugin:
- Zadejte ID klienta:
openvpn-auth-oauth2. - Zapněte ověřování klienta: ANO.
- Aktivujte standardní tok: ANO.
- Vyberte typ přístupu: důvěrný (confidential).
Zkopírujte tajný klíč klienta – bude potřeba při konfiguraci.
Konfigurace pluginu openvpn-auth-oauth2
Hlavní konfigurační soubor: /etc/openvpn-auth-oauth2/config.yaml. Minimální funkční konfigurace:
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"
Parametry:
baseurl: doména pro OAuth2 endpoint, přesměrovávaná přes nginx na port 9000.listen: port služby.secret: šifrovací klíč pro cookies (16/24/32 znaků).issuer: URL Keycloaku s realm.client.id/secret: údaje klienta z Keycloaku.openvpn.addr/password: soket a heslo pro OpenVPN.
Konfigurace OpenVPN serveru
Vytvořte soubor /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
Klíčové volby pro integraci:
management ...: Unix soket pro externí řízení.management-client-auth: povoluje externí příkazy.auth-user-pass-optionals: nepožaduje uživatelské jméno a heslo od klienta.auth-gen-token 28800 external-auth: token z pluginu, TTL 8 hodin.
Spusťte službu:
systemctl enable openvpn-server@server-keycloak --now
Proxy přes nginx
Nainstalujte nginx a certbot pro HTTPS. Konfigurace /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;
}
}
Restartujte nginx: systemctl reload nginx.
Klientská konfigurace a testování
Klientský soubor .ovpn:
client
dev tun
proto udp
remote vpn.yourdomain.com 56890
nobind
persist-key
persist-tun
verb 3
<ca>
-----BEGIN CERTIFICATE-----
Zde je váš CA certifikát
-----END CERTIFICATE-----
</ca>
cipher AES-256-GCM
Importujte do klienta OpenVPN (např. openvpn-access). Při připojení se otevře stránka Keycloaku pro ověření. Po úspěchu:
- Prohlížeč zobrazí potvrzení.
- VPN se připojí.
Konzoloví klienti nepodporují prohlížečový tok – vyžaduje se rozšíření.
Co je důležité
- Plugin openvpn-auth-oauth2 nahrazuje PAM ověřování OAuth2 s Keycloakem pro škálovatelné ověřování.
- Použijte Unix soket pro bezpečné řízení OpenVPN.
- TTL tokenu: 28800 sekund (8 hodin), upravitelné v
auth-gen-token. - Proxy přes nginx je nezbytné pro HTTPS a Let's Encrypt.
- Ideální pro DevOps střední a pokročilé úrovně: zaměřeno na konfigurace a integrace.
— Editorial Team
Zatím žádné komentáře.