跳到主要内容

SSO

分析师用企业账号登录。Caddy 经 oauth2-proxy 对接客户 IdP(Entra ID、Okta、Keycloak、AD 域),角色由 IdP 组映射。

默认部署使用网关自带的密码登录,账号在 用户 页管理。有 IdP 的企业改用 docker-compose.sso.yml,账号由 IdP 管理,网关不保存密码。两种方式不能同时启用,启用 SSO 后 RST_USER_DB_URL 不生效。

SSO 属于企业版功能。已激活的许可不含该功能时,网关忽略 SSO 配置,回到自带登录,并在日志中记录 sso_oidc_not_entitled。

身份链路

SSO 链路

oauth2-proxy 是 OIDC 反向代理。未登录的请求重定向到 IdP,登录成功后,oauth2-proxy 把身份写入请求头转给网关。网关本身不实现登录,只信任这些请求头。

信任成立有两个前提。网关只在代理链内部可达,所有 /api/* 请求必须携带 RST_GATEWAY_SHARED_SECRET。oauth2-proxy 用会话中已验证的身份覆盖这些请求头,客户端无法伪造。

链路与协议无关。任何能注入身份头的前置代理都可以替换 oauth2-proxy,SAML 和 LDAP 通过这种方式支持。

对接 IdP

前提条件

  • 企业版许可。
  • IdP 支持 OIDC。

步骤

  1. 在 IdP 中注册机密客户端(confidential client),回调 URI 为 https://<域名>/oauth2/callback。记录 client ID、client secret 和 issuer URL。

  2. 在 .env 中填写 IdP 和代理参数:

    OIDC_ISSUER_URL=https://login.microsoftonline.com/<tenant>/v2.0
    OIDC_CLIENT_ID=<client id>
    OIDC_CLIENT_SECRET=<client secret>
    OAUTH2_PROXY_SKIP_OIDC_DISCOVERY=false
    OAUTH2_PROXY_COOKIE_SECRET=<openssl rand -base64 32>
    OAUTH2_PROXY_REDIRECT_URL=https://<域名>/oauth2/callback
    OAUTH2_PROXY_COOKIE_SECURE=true
    OAUTH2_PROXY_REVERSE_PROXY=true
    CADDY_SITE_ADDRESS=<域名>
    RST_GATEWAY_SHARED_SECRET=<openssl rand -hex 32>
    RST_SSO_ENABLED=true
    RST_SSO_ENFORCE=true
  3. 在 .env 中把 IdP 组映射到角色:

    RST_RBAC_ADMIN_GROUPS=soc-admins
    RST_RBAC_ANALYST_GROUPS=soc-l1,soc-l2
    RST_RBAC_VIEWER_GROUPS=auditors
  4. 执行 sudo ./deploy.sh,认证方式选择 2,或执行 docker compose -f docker-compose.sso.yml up -d。

访问 https://<域名> 时跳转到 IdP 登录页。登录后,页面右上角显示当前用户。

IdP 的 groups claim 随身份传入网关。用户属于多个组时取最高角色。不属于任何映射组的用户没有角色,可以执行写操作,但不能管理。需要只读时,把对应组写入 RST_RBAC_VIEWER_GROUPS。

对接 AD 域

分析师用 AD 或 LDAP 域账号登录时,在 Keycloak 中配置用户联邦。Keycloak 在登录时通过 LDAP 绑定校验账号,再以 OIDC 交给 oauth2-proxy。

微软 AD 的关键参数如下,bindDn 使用一个服务账号:

vendor=ad
connectionUrl=ldaps://dc.corp.local:636
usernameLDAPAttribute=sAMAccountName
uuidLDAPAttribute=objectGUID
userObjectClasses=person, organizationalPerson, user

再添加一个 group-ldap-mapper,把 AD 安全组映射进 groups claim,用于角色映射。

docker-compose.sso.yml 中的 --profile bundled-idp(Keycloak 与 OpenLDAP)是测试环境,生产部署不使用。

SSO 下的账号

  • 审计事件的 user 字段记录 SSO 身份。
  • 登出经过 /oauth2/sign_out。
  • 账号 页不提供修改密码,密码由 IdP 管理。

变量

变量说明
OIDC_ISSUER_URL、OIDC_CLIENT_ID、OIDC_CLIENT_SECRETIdP 的 issuer 和客户端凭据
OAUTH2_PROXY_SKIP_OIDC_DISCOVERY对接真实 IdP 时设为 false。compose 中的默认值 true 只用于测试环境
OAUTH2_PROXY_COOKIE_SECRET会话 cookie 的加密密钥
OAUTH2_PROXY_REDIRECT_URL必须与 IdP 中注册的回调 URI 一致
RST_SSO_ENABLED前端显示当前用户和登出入口
RST_SSO_ENFORCE为 true 时,不带身份的 /api/* 请求直接返回 401,防止代理漏传身份头
RST_SSO_USER_HEADER、RST_SSO_GROUPS_HEADER可选。更换前置代理时覆盖身份头名称
RST_SSO_LOGOUT_URL可选。登出地址,默认 /oauth2/sign_out

本页内容