用途
本技能为部署在 Kubernetes 集群上的应用提供 Azure AD(Entra ID)OAuth2/OIDC 单点登录(SSO)集成的完整指导,包括通过 Azure AD 组限制访问。适用于需要统一身份认证、按组授权、集中管理密钥的场景。
支持的应用
技能列出了以下应用及其对应的 Provider、重定向 URI 模式和组同步支持情况:
- DefectDojo:Provider 为 azuread-tenant-oauth2,重定向 URI 模式 /complete/azuread-tenant-oauth2/,支持组同步
- Grafana:Provider 为 azuread,重定向 URI 模式 /login/azuread,支持组同步
- ArgoCD:Provider 为 microsoft (Dex),重定向 URI 模式 /api/dex/callback,支持组同步
- Harbor:Provider 为 oidc,重定向 URI 模式 /c/oidc/callback,支持组同步
- SonarQube:Provider 为 saml 或 oidc,重定向 URI 模式 /oauth2/callback/saml,支持组同步
- OAuth2 Proxy:Provider 为 azure,重定向 URI 模式 /oauth2/callback,支持组同步
- Keycloak:Provider 为 oidc,重定向 URI 模式 /realms/{realm}/broker/azure/endpoint,支持组同步
访问控制决策
技能给出一个决策逻辑:如果希望租户内所有人访问,设置 appRoleAssignmentRequired=false;如果只允许特定组访问,设置 appRoleAssignmentRequired=true,并将组分配到企业应用。
实施流程
技能将实施分为四个阶段:
- Azure AD 应用注册:使用 az ad app create 创建应用注册,指定显示名称、登录受众(AzureADMyOrg)和 Web 重定向 URI;获取租户 ID;使用 az ad app credential reset 创建客户端密钥。
- 启用组声明:使用 az ad app update 设置 groupMembershipClaims=SecurityGroup;添加 Group.Read.All 委派权限;执行管理员同意。
- 按组限制访问(关键步骤):获取服务主体对象 ID;设置 appRoleAssignmentRequired=true;获取用于限制访问的组 ID;通过 Microsoft Graph API 将组分配到应用。
- 将密钥存入 Key Vault:使用 az keyvault secret set 存储客户端密钥。
密钥管理
技能提供了 SecretProviderClass 模板,使用 Azure Key Vault 与 Secrets Store CSI Driver,通过托管标识读取密钥,并生成 Kubernetes Secret。同时给出 Pod 卷挂载的 volumes 与 volumeMounts 配置示例。
应用配置示例
技能为多个应用提供了配置片段:
- DefectDojo:通过 extraEnv 启用 SSO,设置客户端 ID、租户 ID、密钥引用,启用组同步与组过滤,并针对反向代理设置 DD_SECURE_PROXY_SSL_HEADER=True。
- Grafana:在 grafana.ini 中配置 auth.azuread,设置 client_id、client_secret、scopes、auth_url、token_url、allowed_groups 和 role_attribute_path。
- ArgoCD(通过 Dex):配置 dex.config 中的 microsoft 连接器,并在 rbac 中设置策略。
- Harbor:配置 core.oidc,设置 endpoint、clientId、clientSecret、scope、groupsClaim、adminGroup 和 autoOnboard。
故障排查
技能列出了常见错误码及解决方案:
- AADSTS50011:回复 URL 不匹配,检查重定向 URI 是否包含尾部斜杠
- AADSTS50105:用户未分配,将用户或组添加到企业应用分配
- AADSTS700016:应用未找到,检查客户端 ID 和租户 ID
- AADSTS7000218:密钥过期,在 Key Vault 中轮换密钥并重启 Pod
- AADSTS90102:无效 redirect_uri,检查反向代理场景下的 DD_SECURE_PROXY_SSL_HEADER=True
- AADSTS65001:未授予同意,运行 az ad app permission admin-consent
常见问题包括:反向代理后 Django 应用的 redirect_uri 格式错误(需将 DD_SECURE_PROXY_SSL_HEADER 设为 "True");组未同步(检查组声明、API 权限、组成员关系);密钥未从 Key Vault 同步(检查 SecretProviderClass、CSI 驱动 Pod、托管标识访问策略)。
技能还提供了诊断命令,如测试 OAuth 重定向、检查 Pod 环境变量、解码 JWT 令牌。
安全最佳实践
- 绝不硬编码密钥,始终使用 Key Vault + CSI Driver
- 使用托管标识,避免服务主体凭据
- 按组限制访问,启用 appRoleAssignmentRequired=true
- 轮换密钥,在过期前设置日历提醒
- 仅使用 HTTPS,所有重定向 URI 必须使用 HTTPS
- 单租户,内部应用绝不使用多租户
- 启用 Azure AD 登录日志进行审计
注意事项
技能列出若干易错点:组声明默认返回 objectId 而非名称,需启用 optionalClaims 并设置令牌版本 2;令牌作用域 https://graph.microsoft.com/.default 仅授予管理员同意的权限;OIDC 重定向 URI 要求精确匹配,尾部斜杠不匹配会返回 AADSTS50011;超过 200 个组的用户不会收到组声明(超限);应用令牌生命周期策略按应用设置,默认 1 小时,长时间批处理任务需处理 401 刷新。
限制
技能未提供具体的收费、价格或平台限制信息。部分环境参考中的租户 ID、托管标识客户端 ID 等以占位符形式给出,实际值需用户自行填写。