Configuración de Autenticación OIDC#
Esta guía explica cómo configurar la autenticación OpenID Connect (OIDC) utilizando Google como proveedor de identidad y el servidor web Angie con scripting Lua.
La implementación protege endpoints internos con autenticación OAuth2/OIDC y demuestra una forma de restringir el acceso basándose en dominios de correo electrónico. Este es solo un ejemplo de enfoque; puede implementar el control de acceso como prefiera, como mantener listas de usuarios específicos permitidos, verificar la pertenencia a un dominio o atributos de grupo en la respuesta del proveedor, o utilizar claims personalizados de su sistema IAM privado.
Truco
Esta implementación de OIDC proporciona una base para la autenticación pero debe adaptarse para uso en producción con medidas de seguridad adecuadas, monitoreo y cumplimiento de las políticas de seguridad de su organización.
Arquitectura#
La configuración de OIDC sugerida aquí consiste en:
Angie - con soporte de módulo Lua para procesamiento OIDC
lua-resty-openidc - Biblioteca Lua de OpenResty para autenticación OIDC
Google OAuth2 - Proveedor de identidad para autenticación de usuarios
Docker Compose - Utilizado en este ejemplo solo para inicio rápido; use el enfoque de despliegue que prefiera en producción
Requisitos Previos#
Antes de configurar la autenticación OIDC, asegúrese de tener:
Servidor web Angie con soporte del módulo Lua
Docker y Docker Compose (para despliegue)
Un proyecto en Google Cloud Console
Credenciales OAuth2 de Google
Configuración de Google OAuth2#
Para configurar Google como su proveedor OIDC:
Navegue a la Google Cloud Console
Cree un nuevo proyecto o seleccione uno existente
Configure la pantalla de consentimiento OAuth para su proyecto (Externa o Interna) y publíquela para que los usuarios puedan autenticarse
Cree credenciales OAuth2:
Tipo de aplicación: Aplicación web
URIs de redirección autorizadas:
http://localhost/auth/callback
Guarde su
client_idyclient_secretpara la configuración
Nota
Los servicios estándar de Google Identity ya soportan OIDC; no se requiere la API heredada de Google+. Habilite APIs adicionales de Google solo si su aplicación necesita sus datos.
Configuración Inicial#
Comencemos con los archivos de configuración necesarios para la configuración de OIDC. El despliegue de Docker utiliza el siguiente archivo de configuración: Esta configuración hace lo siguiente: Utiliza la imagen templated de Angie con soporte del módulo Lua Carga el módulo Lua para funcionalidad OIDC Mapea el puerto 80 para acceso HTTP Monta archivos de configuración desde el directorio local Para una demostración plug-and-play,
descargue el Cree un script de autenticación OIDC
que maneje la lógica de autenticación utilizando la biblioteca Parámetros de configuración: Configure Angie con los bloques location necesarios
para la autenticación OIDC. Para proteger recursos con autenticación OIDC: Esta configuración hace lo siguiente: Protege la ruta Redirige las solicitudes autenticadas a la API interna
en Configure los endpoints del flujo OAuth2: Funciones de los endpoints: Configure el acceso restringido a la API interna: Esto proporciona: Acceso a la API de estado de Angie Acceso solo desde localhost (127.0.0.1) Protección OIDC cuando se accede a través de Configuración de Docker Compose#
services:
angie:
image: docker.angie.software/angie:templated
environment:
ANGIE_LOAD_MODULES: "lua"
ports:
- 80:80
volumes:
- ./files/etc/angie/http.d:/etc/angie/http.d
paquete de inicio rápido OIDC,
establezca su client_id y client_secret en files/etc/angie/http.d/oidc.lua,
y todo funcionará de inmediato.Script de Autenticación OIDC#
lua-resty-openidc:access_by_lua_block {
local res, err = require("resty.openidc").authenticate({
redirect_uri = "http://localhost/auth/callback",
discovery = "https://accounts.google.com/.well-known/openid-configuration",
logout_path = "/auth/logout",
redirect_after_logout_uri = "/auth/logged-out",
revoke_tokens_on_logout = true,
client_id = "YOUR_CLIENT_ID",
client_secret = "YOUR_CLIENT_SECRET"
})
}
redirect_uri: URL de callback después de autenticación exitosadiscovery: Endpoint de descubrimiento OIDC de Googlelogout_path: Ruta para cierre de sesión del usuarioredirect_after_logout_uri: Destino de redirección después del cierre de sesiónrevoke_tokens_on_logout: Revocar tokens al cerrar sesión por seguridadclient_id y client_secret: Sus credenciales OAuth2 de GoogleConfiguración de Angie#
Recursos Protegidos#
location /internal/ {
include /etc/angie/http.d/oidc.lua;
proxy_pass http://127.0.0.1/status/;
}
/internal/ con autenticación OIDC/status/Endpoints de Autenticación#
location /auth/callback {
include /etc/angie/http.d/oidc.lua;
}
location /auth/logout {
include /etc/angie/http.d/oidc.lua;
}
location /auth/logged-out {
default_type text/plain;
return 200 "Ha cerrado sesión. ¡Adiós!";
}
/auth/callback: Maneja el callback OAuth2 de Google/auth/logout: Inicia el cierre de sesión del usuario/auth/logged-out: Página de destino después del cierre de sesión exitosoAcceso a la API Interna#
location /status/ {
api /status/;
allow 127.0.0.1;
deny all;
}
/internal/
Pasos de Despliegue#
Siga estos pasos para desplegar la autenticación OIDC: Actualice las credenciales OAuth2 en su script Lua OIDC: Reemplace los valores de marcador de posición en Inicie los servicios de Docker: Verifique el despliegue: Navegue a Debería ser redirigido a Google para autenticación Después del inicio de sesión exitoso, accederá al contenido protegidoActualización de Configuración#
oidc.lua:client_id con su ID de cliente OAuth2 de Googleclient_secret con su secreto de cliente OAuth2 de GoogleInicio del Servicio#
$ docker-compose up -d
http://localhost/internal/
Configuración de Seguridad#
Restricción de Dominio de Correo Electrónico#
Implemente validación de dominio para restringir el acceso por dominio de correo electrónico:
if not string.match(res.user.email, "gmail.com$") then
ngx.exit(ngx.HTTP_FORBIDDEN)
end
Para entornos de producción, considere lo siguiente:
Reemplazar
gmail.comcon el dominio de su organizaciónImplementar una lista blanca de direcciones de correo electrónico permitidas
Agregar control de acceso basado en roles
Gestión de Tokens#
La implementación de OIDC incluye características de seguridad:
Los tokens se revocan automáticamente al cerrar sesión (
revoke_tokens_on_logout = true)Las sesiones son gestionadas de forma segura por la biblioteca lua-resty-openidc
Todos los flujos de autenticación siguen las mejores prácticas de seguridad OAuth2/OIDC
Advertencia
Para despliegues en producción:
Utilice siempre HTTPS para callbacks OAuth2
Almacene los secretos de cliente de forma segura, nunca en control de versiones
Implemente políticas adecuadas de tiempo de espera y renovación de sesiones
Monitoree los registros de autenticación para eventos de seguridad
Flujo de Autenticación#
El flujo de autenticación OIDC sigue los procedimientos estándar OAuth2/OIDC:
El usuario accede a una URL protegida (por ejemplo,
http://localhost/internal/)Si no está autenticado, el usuario es redirigido a Google OAuth2
El usuario se autentica con credenciales de Google
Google redirige de vuelta a
/auth/callbackcon código de autorizaciónEl servidor intercambia el código por token de acceso y token de ID
La información del usuario es validada (incluyendo verificación de dominio de correo electrónico)
Se concede al usuario acceso al recurso protegido
El proceso de cierre de sesión asegura la terminación segura de la sesión:
El usuario navega a
http://localhost/auth/logoutLos tokens se revocan en el endpoint OAuth2 de Google
Los datos de sesión local se eliminan
El usuario es redirigido a
/auth/logged-out
Configuración Avanzada#
Para restringir el acceso a un dominio de organización específico:
if not string.match(res.user.email, "yourcompany.com$") then
ngx.exit(ngx.HTTP_FORBIDDEN)
end
Para organizaciones con múltiples dominios permitidos:
local allowed_domains = {"company1.com", "company2.com", "gmail.com"}
local email_valid = false
for _, domain in ipairs(allowed_domains) do
if string.match(res.user.email, domain .. "$") then
email_valid = true
break
end
end
if not email_valid then
ngx.exit(ngx.HTTP_FORBIDDEN)
end
Acceso a Información del Usuario#
Acceda a claims adicionales del usuario desde el proveedor OIDC:
-- Acceder a información básica del usuario
local user_email = res.user.email
local user_name = res.user.name
local user_picture = res.user.picture
-- Registrar información del usuario
ngx.log(ngx.INFO, "Usuario autenticado: ", user_email)
Advertencia
Para despliegues en producción:
Utilice siempre HTTPS para callbacks OAuth2
Almacene los secretos de cliente de forma segura, nunca en control de versiones
Implemente políticas adecuadas de tiempo de espera y renovación de sesiones
Monitoree los registros de autenticación para eventos de seguridad
Flujo de Autenticación#
El flujo de autenticación OIDC sigue los procedimientos estándar OAuth2/OIDC:
El usuario accede a una URL protegida (por ejemplo,
http://localhost/internal/)Si no está autenticado, el usuario es redirigido a Google OAuth2
El usuario se autentica con credenciales de Google
Google redirige de vuelta a
/auth/callbackcon código de autorizaciónEl servidor intercambia el código por token de acceso y token de ID
La información del usuario es validada (incluyendo verificación de dominio de correo electrónico)
Se concede al usuario acceso al recurso protegido
El proceso de cierre de sesión asegura la terminación segura de la sesión:
El usuario navega a
http://localhost/auth/logoutLos tokens se revocan en el endpoint OAuth2 de Google
Los datos de sesión local se eliminan
El usuario es redirigido a
/auth/logged-out
Configuración Avanzada#
Para restringir el acceso a un dominio de organización específico:
if not string.match(res.user.email, "suempresa.com$") then
ngx.exit(ngx.HTTP_FORBIDDEN)
end
Para organizaciones con múltiples dominios permitidos:
local allowed_domains = {"empresa1.com", "empresa2.com", "gmail.com"}
local email_valid = false
for _, domain in ipairs(allowed_domains) do
if string.match(res.user.email, domain .. "$") then
email_valid = true
break
end
end
if not email_valid then
ngx.exit(ngx.HTTP_FORBIDDEN)
end
Acceso a Información del Usuario#
Acceda a claims adicionales del usuario desde el proveedor OIDC:
-- Acceder a información del usuario desde el token de ID
local user_name = res.user.name
local user_picture = res.user.picture
local user_locale = res.user.locale
local user_email = res.user.email
Estos valores se pueden utilizar para registro, personalización o decisiones adicionales de control de acceso.