Skip to main content

企业 SSO

分析师用企业账号登录:Caddy → oauth2-proxy → 你的 IdP(Entra ID / Okta / Keycloak / AD 域)。角色由 IdP 组映射,审计追溯到人。

默认形态是网关自带的密码登录 + 用户页管账号。有 IdP 的企业改用 docker-compose.sso.yml:账号由 IdP 说了算,网关不再管密码。两条路不要同时开

架构

SSO 链路

oauth2-proxy 是成熟的 OIDC 反向代理:未登录的请求重定向到 IdP,登录成功后把身份作为请求头注入给网关。网关自己不实现登录,只信任这些头。信任成立的前提是网关只在代理链内部可达(所有 /api/* 必须带 RST_GATEWAY_SHARED_SECRET),而 oauth2-proxy 会用会话里的已验证身份覆盖这些头,客户端伪造不了。

协议无关:换任何一个会注入身份头的前置代理,就能支持 SAML / LDAP。

对接你的 IdP

在 IdP 注册应用

机密客户端(confidential client),回调 URI https://<域名>/oauth2/callback。拿到 client_idclient_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=auditors

IdP 的 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_SECRETIdP 的 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_ENFORCEtrue 时缺身份的 /api/* 直接 401,防止代理配置漏注入身份头
RST_SSO_USER_HEADER / RST_SSO_GROUPS_HEADER可选,换前置代理时覆盖身份头名

传统 AD 域

分析师用 AD / LDAP 域账号登录:在 Keycloak 里做用户联邦对接目录,登录时 LDAP 绑定校验,再正常出 OIDC 给 oauth2-proxy。微软 AD 的关键字段:vendor=adconnectionUrl=ldaps://dc.corp.local:636usernameLDAPAttribute=sAMAccountNameuuidLDAPAttribute=objectGUIDuserObjectClasses=person, organizationalPerson, userbindDn 用一个服务账号。再加一个 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 里。

本页内容