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。
身份链路
oauth2-proxy 是 OIDC 反向代理。未登录的请求重定向到 IdP,登录成功后,oauth2-proxy 把身份写入请求头转给网关。网关本身不实现登录,只信任这些请求头。
信任成立有两个前提。网关只在代理链内部可达,所有 /api/* 请求必须携带 RST_GATEWAY_SHARED_SECRET。oauth2-proxy 用会话中已验证的身份覆盖这些请求头,客户端无法伪造。
链路与协议无关。任何能注入身份头的前置代理都可以替换 oauth2-proxy,SAML 和 LDAP 通过这种方式支持。
对接 IdP
前提条件
- 企业版许可。
- IdP 支持 OIDC。
步骤
-
在 IdP 中注册机密客户端(confidential client),回调 URI 为
https://<域名>/oauth2/callback。记录 client ID、client secret 和 issuer URL。 -
在
.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 -
在
.env中把 IdP 组映射到角色:RST_RBAC_ADMIN_GROUPS=soc-admins RST_RBAC_ANALYST_GROUPS=soc-l1,soc-l2 RST_RBAC_VIEWER_GROUPS=auditors -
执行
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_SECRET | IdP 的 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 |