企业 SSO
分析师用企业账号登录:Caddy → oauth2-proxy → 你的 IdP(Entra ID / Okta / Keycloak / AD 域)。角色由 IdP 组映射,审计追溯到人。
默认形态是网关自带的密码登录 + 用户页管账号。有 IdP 的企业改用 docker-compose.sso.yml:账号由 IdP 说了算,网关不再管密码。两条路不要同时开。
架构
oauth2-proxy 是成熟的 OIDC 反向代理:未登录的请求重定向到 IdP,登录成功后把身份作为请求头注入给网关。网关自己不实现登录,只信任这些头。信任成立的前提是网关只在代理链内部可达(所有 /api/* 必须带 RST_GATEWAY_SHARED_SECRET),而 oauth2-proxy 会用会话里的已验证身份覆盖这些头,客户端伪造不了。
协议无关:换任何一个会注入身份头的前置代理,就能支持 SAML / LDAP。
对接你的 IdP
在 IdP 注册应用
机密客户端(confidential client),回调 URI https://<域名>/oauth2/callback。拿到 client_id、client_secret、issuer URL。
填 .env
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角色映射
RST_RBAC_ADMIN_GROUPS=soc-admins
RST_RBAC_ANALYST_GROUPS=soc-l1,soc-l2
RST_RBAC_VIEWER_GROUPS=auditorsIdP 的 groups claim 进入身份;一个人在多个组里取最高档。一个组都不在 = 不给角色(能写,不能管);要落实只读,把组写进 RST_RBAC_VIEWER_GROUPS。
启动
./deploy.sh 认证方式选 2 = SSO;或手动 docker compose -f docker-compose.sso.yml up -d(不带 --profile bundled-idp)。
关键变量
| 变量 | 说明 |
|---|---|
OIDC_ISSUER_URL / OIDC_CLIENT_ID / OIDC_CLIENT_SECRET | IdP 的 issuer 和客户端凭据 |
OAUTH2_PROXY_SKIP_OIDC_DISCOVERY | 真实 IdP 设 false;自带 Keycloak 演示用 true |
OAUTH2_PROXY_COOKIE_SECRET | 会话 cookie 加密密钥 |
OAUTH2_PROXY_REDIRECT_URL | 必须与 IdP 注册一致 |
RST_SSO_ENABLED | 前端显示当前用户 + 登出 |
RST_SSO_ENFORCE | true 时缺身份的 /api/* 直接 401,防止代理配置漏注入身份头 |
RST_SSO_USER_HEADER / RST_SSO_GROUPS_HEADER | 可选,换前置代理时覆盖身份头名 |
传统 AD 域
分析师用 AD / LDAP 域账号登录:在 Keycloak 里做用户联邦对接目录,登录时 LDAP 绑定校验,再正常出 OIDC 给 oauth2-proxy。微软 AD 的关键字段:vendor=ad、connectionUrl=ldaps://dc.corp.local:636、usernameLDAPAttribute=sAMAccountName、uuidLDAPAttribute=objectGUID、userObjectClasses=person, organizationalPerson, user、bindDn 用一个服务账号。再加一个 group-ldap-mapper 把 AD 安全组映射进 groups claim,就能做角色映射。
演示
交付包的 docker-compose.sso.yml 内置一个 Keycloak + OpenLDAP(--profile bundled-idp),开箱可演示:测试账号 analyst / analyst123(Keycloak 本地)、analyst.ldap / Ldap123!(LDAP 联邦)。它的 realm 是起步模板,client secret、redirectUris: ["*"]、sslRequired: none 都是演示值,投产前务必收紧或直接换成你的 IdP。
网关怎么用身份
- 审计事件的
user字段来自 SSO 身份,可信,追溯到人。 - 右上角显示当前用户,登出走
/oauth2/sign_out。 - 账号页不能改密码,密码在 IdP 里。