SuperAPI AI 工具集

azure-ad-sso

安全与审计

查看项目

更新于 10-15 12:03

技能介绍

用途

本技能为部署在 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,并将组分配到企业应用。

实施流程

技能将实施分为四个阶段:

  1. Azure AD 应用注册:使用 az ad app create 创建应用注册,指定显示名称、登录受众(AzureADMyOrg)和 Web 重定向 URI;获取租户 ID;使用 az ad app credential reset 创建客户端密钥。
  2. 启用组声明:使用 az ad app update 设置 groupMembershipClaims=SecurityGroup;添加 Group.Read.All 委派权限;执行管理员同意。
  3. 按组限制访问(关键步骤):获取服务主体对象 ID;设置 appRoleAssignmentRequired=true;获取用于限制访问的组 ID;通过 Microsoft Graph API 将组分配到应用。
  4. 将密钥存入 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 等以占位符形式给出,实际值需用户自行填写。