本文目录导读:

单点登录(SSO)的安全配置是一个系统工程,需要在认证协议、令牌管理、传输安全、客户端/服务端等多个层面进行加固,以下是基于行业最佳实践的安全配置指南:
核心协议与令牌安全
这是SSO安全的基础,无论使用OAuth 2.0、OIDC、SAML还是CAS,都需要关注:
-
强制使用HTTPS(TLS 1.2+)
- 原因:所有令牌信息(如ID Token、Access Token、SAML Assertion)在传输过程中绝不能明文传输。
- 配置:SSO服务器(IdP)、客户端应用(SP)的回调地址(Redirect URI)、令牌端点(Token Endpoint)全部强制使用HTTPS,禁用不安全的TLS版本和弱密码套件。
-
令牌(Token)安全
- 使用JWT(JSON Web Token)并签名:推荐使用RS256(非对称加密)或HS256(对称加密,需严格保管密钥)。严禁使用
none算法签名。 - 设置短有效期:Access Token有效期建议15分钟-1小时;Refresh Token有效期建议7天-30天,但需配合轮换机制。
- 避免在URL中传递令牌:令牌应通过HTTP Header(如
Authorization: Bearer)或POST Body传输,绝对不要放在URL参数中,因为URL可能被日志、Referer头泄露。 - 绑定令牌到客户端:使用PKCE(Proof Key for Code Exchange,授权码证明密钥交换)流程,防止授权码被拦截后滥用。即使是不使用客户端的隐式授权流,也建议替换为带有PKCE的授权码流。
- Token Invalidation:实现令牌黑名单或提前失效机制(例如用户注销时)。
- 使用JWT(JSON Web Token)并签名:推荐使用RS256(非对称加密)或HS256(对称加密,需严格保管密钥)。严禁使用
-
SAML特定配置
- 验证断言(Assertion)签名:IdP必须对SAML Response进行签名,SP必须验证签名。
- 使用加密断言(可选但推荐):对于敏感信息,SP可以提供公钥,IdP对断言中的属性(如姓名、邮箱)进行加密。
- 设置Assertion Consumer Service URL白名单:SP只允许特定的ACS URL接收断言。
- 防止重放攻击:使用
Assertion中的NotBefore和NotOnOrAfter时间窗口(建议3-5分钟),并记录已使用的断言ID。
客户端与回调地址安全
-
严格注册回调地址(Redirect URI)
- 白名单机制:在IdP中只允许注册精确的回调URL(如
https://example.com/callback),避免使用通配符(如https://*.example.com/*或放松的路径匹配)。 - 防止开放重定向:IdP在用户授权后,必须验证
redirect_uri参数是否与注册的完全一致,并将用户引导至该地址,这能防止攻击者通过构造恶意URL劫持令牌。
- 白名单机制:在IdP中只允许注册精确的回调URL(如
-
防CSRF(跨站请求伪造)
- 使用State参数:在认证请求中启用
state参数,生成随机值并在回调时验证,这是OAuth 2.0/OIDC的标准防御手段。 - Nonce参数:在OIDC请求中,使用
nonce参数绑定ID Token到当前会话,防止令牌重放。
- 使用State参数:在认证请求中启用
-
客户端凭证安全
- 公共客户端(如SPA、移动App):不能存储
client_secret,必须使用PKCE。 - 机密客户端(如后端服务):
client_secret必须安全存储(如使用密钥管理服务、环境变量、Vault),绝不硬编码在代码中或版本控制内。
- 公共客户端(如SPA、移动App):不能存储
会话与登录态管理
-
IdP端会话管理
- 单点登出(SLO,Single Log Out):配置全局登出,用户登出IdP时,IdP应主动通知所有已登录的应用(SP)清除本地会话,这需要SP提供登出端点。
- 会话超时与空闲超时:IdP会话应设置过期时间(如8小时)和空闲超时(如30分钟无操作后要求重新输入密码)。
- 防止会话固定:用户成功认证后,必须生成全新的会话ID,并使旧的会话失效。
-
应用端(SP)会话管理
- 应用内独立会话:即使IdP会话有效,应用内的本地会话(如Cookie)也应独立管理,并遵循最小权限原则。
- Cookie安全属性:设置
HttpOnly(防止XSS读取)、Secure(仅HTTPS传输)、SameSite=Lax或Strict(防止CSRF)。
账户与权限控制
-
最小权限原则
- 属性释放(Attribute Release):IdP只向应用提供实现功能所必需的属性(如用户ID、角色)。不要随意释放身份证号、手机号等敏感信息。
- 应用注册权限:严格限制谁可以注册新的客户端应用。
-
访问控制策略(ABAC/RBAC)
- 不要在SSO层做细粒度的功能权限判断,SSO只负责“你是谁”(Authentication,认证),授权(Authorization)应交给业务应用,SSO验证用户成功,但应用可以拒绝该用户访问资源。
-
监控与审计
- 记录所有认证事件:包括成功/失败的登录、登出、令牌颁发、刷新、撤销。
- 记录前后端IP、User-Agent、时间戳、使用的客户端ID。
- 告警:对异常行为告警(如短时间内大量失败尝试、从异常地理位置的登录)。
高级安全配置(按需)
- 多因素认证(MFA):强制执行MFA(如TOTP、短信、生物识别),尤其是在高风险操作(如修改密码、支付)或敏感应用登录时。
- 风险自适应策略(Step-up Authentication):基于登录环境(IP、地理位置、设备指纹)动态调整认证强度,从常用设备登录无需MFA,从新设备登录需要MFA。
- 设备绑定:将SSO令牌与具体设备绑定(如使用设备指纹、公钥绑定),防止令牌被盗后在另一设备上使用。
- 定期轮换密钥:定期更换IdP的签名私钥、加密秘钥、应用的
client_secret。
总结检查清单
| 类别 | 关键检查项 | 危险配置示例 |
|---|---|---|
| 传输 | 强制HTTPS | 使用HTTP回调 |
| 令牌 | 签名算法(非none) |
短有效期 |
| 回调 | 精确的Redirect URI白名单 | 使用通配符 https://example.com/* |
| 客户端 | PKCE(公共客户端)、Secret保密(机密客户端) | SPA存储 client_secret |
| 会话 | 强制SLO | 上传宽泛的Cookie域 |
| 监控 | 日志记录 | 告警 |
最终建议:不要自行实现SSO协议栈(极其危险),优先选用成熟的、经过安全审计的框架或服务(如 Keycloak、Okta、Azure AD、Auth0、Casdoor、Spring Security + OIDC),配置时,默认拒绝所有非必要的权限和属性,并持续进行渗透测试。