Volver al inicio

OpenVPN + Keycloak: configuración OAuth2

El material describe la integración de OpenVPN con Keycloak mediante el plugin openvpn-auth-oauth2 para autenticación centralizada. Se proporcionan configuraciones del servidor, nginx-proxy y cliente en Ubuntu 24.04. Adecuado para instalaciones escalables con crecimiento de usuarios.

Configuración de VPN con Keycloak y plugin de OpenVPN
Advertisement 728x90

Integración de OpenVPN con Keycloak mediante el plugin openvpn-auth-oauth2

Antes, el acceso a recursos en un entorno protegido en Yandex Cloud dependía de una instalación autogestionada de OpenVPN con autenticación PAM. A medida que creció el número de usuarios, se hizo necesario integrar Keycloak. El plugin openvpn-auth-oauth2 permite autenticación OAuth2 a través de Keycloak y es compatible con sistemas basados en Debian y RedHat.

La instalación en Ubuntu 24.04 LTS se realiza directamente desde el repositorio del proyecto:

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

Creación de un cliente en Keycloak

En Keycloak, crea un nuevo cliente para el plugin:

Google AdInline article slot
  • Establece el ID de cliente: openvpn-auth-oauth2.
  • Activa la autenticación del cliente: ON.
  • Activa el flujo estándar: ON.
  • Establece el tipo de acceso: confidencial.

Copia el secreto del cliente — será necesario para la configuración.

Configuración del plugin openvpn-auth-oauth2

Archivo de configuración principal: /etc/openvpn-auth-oauth2/config.yaml. Configuración mínima funcional:

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"

Parámetros:

Google AdInline article slot
  • baseurl: dominio para el punto final OAuth2, proxyado mediante nginx en el puerto 9000.
  • listen: puerto del servicio.
  • secret: clave de cifrado de cookies (16/24/32 caracteres).
  • issuer: URL de Keycloak con el realm.
  • client.id/secret: credenciales del cliente desde Keycloak.
  • openvpn.addr/password: socket y contraseña para OpenVPN.

Configuración del servidor OpenVPN

Crea el archivo /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

Opciones clave para la integración:

  • management ...: socket Unix para control externo.
  • management-client-auth: permite comandos externos.
  • auth-user-pass-optionals: no requiere usuario/contraseña del cliente.
  • auth-gen-token 28800 external-auth: token generado por el plugin, TTL de 8 horas.

Inicia el servicio:

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

Proxy con nginx

Instala nginx y certbot para HTTPS. Archivo de configuración /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;
    }
}

Recarga nginx: systemctl reload nginx.

Configuración y pruebas del cliente

Archivo .ovpn del cliente:

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

Importa en un cliente OpenVPN (por ejemplo, OpenVPN Access Server). Al conectarse, el navegador redirigirá a Keycloak para autenticarse. Tras éxito:

  • El navegador muestra confirmación.
  • La conexión VPN se establece correctamente.

Los clientes solo por consola no soportan el flujo del navegador — se requiere personalización adicional.

Conclusiones clave

  • El plugin openvpn-auth-oauth2 reemplaza PAM por OAuth2 a través de Keycloak para una autenticación escalable.
  • Usa sockets Unix para gestión segura de OpenVPN.
  • TTL del token: 28800 segundos (8 horas), ajustable mediante auth-gen-token.
  • El proxy con nginx es obligatorio para HTTPS y la integración con Let’s Encrypt.
  • Ideal para ingenieros DevOps intermedios a senior enfocados en configuraciones e integraciones.

— Editorial Team

Advertisement 728x90

Leer después