核心概念解析:身份提供商、服务提供商与协议家族
说实话,刚接触多云身份管理那会儿,我也被一堆缩写搞得头晕。IdP、SP、SAML、OIDC、SCIM……每个词背后都是一套协议,一套逻辑。但你别怕,这些东西说白了就是「怎么证明你是谁」和「怎么把证明传过去」的问题。
我习惯先画一张图,把几个核心角色的关系理清楚。你看下面这张结构图,基本就是多云身份体系的骨架。
身份提供商(IdP)—— 你是谁,我说了算
身份提供商,简称 IdP。它的职责很简单:存储用户身份信息,并负责认证。你想想看,你在公司里登录内部系统,输入密码后,是谁在验证你的密码?是 IdP。
常见的 IdP 有 Azure Active Directory、Okta、Keycloak,还有 Google 账号体系。我个人习惯把 IdP 理解成「数字世界的户籍管理处」。它不关心你要去哪,它只负责确认「你是你」。
关键点:在多云架构里,IdP 是信任的起点。所有云服务都信任 IdP 签发的身份断言。一旦 IdP 被攻破,所有云资源都危险。所以,IdP 的安全防护是第一优先级。
服务提供商(SP)—— 你要用啥,我给你
服务提供商,简称 SP。它提供用户想要访问的资源或功能。比如 AWS 控制台、GCP 的 Cloud Console、Salesforce、Slack,这些都是 SP。
SP 不负责认证用户,它只负责授权。它收到 IdP 发来的身份信息后,决定「这个用户能看哪些页面,能操作哪些资源」。
我记得有一次帮客户做 AWS 与 Okta 的集成,客户问:「为什么我在 AWS 里还要再建一遍用户?」我说:「不用。AWS 是 SP,它信任 Okta 这个 IdP。用户登录 Okta 后,直接跳转到 AWS 就行,AWS 不需要存密码。」
SAML 2.0 —— 老牌协议,稳如老狗
SAML 2.0 是 Security Assertion Markup Language 的缩写。说白了,它是一种基于 XML 的协议,用于在 IdP 和 SP 之间交换认证和授权数据。
SAML 2.0 的核心是「断言」(Assertion)。IdP 生成一个 XML 文档,里面写着「用户张三已通过认证,他有这些属性,他有这些权限」。SP 拿到这个 XML,验证签名,然后放行。
我的经验:SAML 2.0 在企业级应用里非常常见,尤其是那些老牌 SaaS 和内部系统。但它的 XML 解析比较重,配置起来也繁琐。我曾经花了一整天调试一个 SAML 签名不匹配的问题,最后发现是证书换行符格式不对。嗯,这种坑踩过一次就记住了。
SAML 2.0 的典型流程是这样的:
- 用户访问 SP(比如 AWS 控制台)
- SP 发现用户未登录,生成 SAML 请求,重定向到 IdP
- 用户在 IdP 输入凭证(密码、MFA 等)
- IdP 生成 SAML 断言,通过浏览器 POST 回 SP
- SP 验证断言签名,创建用户会话
OIDC / OAuth 2.0 —— 现代应用的首选
OAuth 2.0 是授权框架,OIDC(OpenID Connect)是在 OAuth 2.0 之上加了一层身份认证。很多人搞混这两个东西,我简单解释一下:
- OAuth 2.0:解决「我能让你做什么」的问题。比如你授权一个 App 访问你的 Google 日历,OAuth 2.0 负责颁发一个 Access ,App 拿着这个 去读日历。
- OIDC:解决「你是谁」的问题。它在 OAuth 2.0 的基础上加了一个 ID (JWT 格式),里面包含用户的身份信息。
我建议你在多云场景里优先考虑 OIDC。为什么?因为它是基于 JSON 的,比 SAML 的 XML 轻量得多,而且天然适配移动端和单页应用。AWS、GCP、Azure 都支持 OIDC 作为身份联邦的方式。
注意:OAuth 2.0 本身不提供身份认证。如果你只用 OAuth 2.0 而没有 OIDC,你无法确认用户到底是谁。很多安全漏洞就是因为只用了 OAuth 2.0 的 Access 来「假装」认证用户。切记,认证用 OIDC,授权用 OAuth 2.0。
SCIM —— 用户同步的自动化管道
SCIM 全称 System for Cross-domain Identity Management。它的作用是自动把用户从 IdP 同步到 SP。
你想想看,如果公司有 5000 人,每个人都要在 AWS、GCP、Salesforce、Slack 里手动建账号,那运维团队得疯掉。SCIM 就是解决这个问题的。
SCIM 2.0 定义了一组 RESTful API,IdP 可以通过这些 API 在 SP 上创建、更新、删除用户和组。比如:
// 创建用户的 SCIM 请求示例
POST /scim/v2/Users
Content-Type: application/scim+json
{
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
"userName": "zhangsan@company.com",
"name": {
"givenName": "张三",
"familyName": "张"
},
"emails": [{
"value": "zhangsan@company.com",
"type": "work",
"primary": true
}],
"active": true
}
SCIM 的好处是标准化。不管 SP 是 AWS 还是 Azure,只要它实现了 SCIM 端点,IdP 就可以用同一套逻辑去同步。我曾经帮客户把 Okta 和多个云服务对接,SCIM 配置好之后,用户入职、离职、转岗全部自动化,再也不用人工操作了。
核心要点:SAML/OIDC 解决「登录」问题,SCIM 解决「账号管理」问题。两者缺一不可。没有 SCIM,你只能手动建账号,然后靠 SAML 登录;没有 SAML/OIDC,你只能每朵云各建一套密码,用户记不住。
协议对比:一张表看懂
我把这几个协议的核心差异整理成了一张表,方便你对照:
| 协议 | 主要用途 | 数据格式 | 适用场景 | 我的评价 |
|---|---|---|---|---|
| SAML 2.0 | 企业级 SSO | XML | 老牌 SaaS、内部系统 | 稳定但重,配置繁琐 |
| OIDC | 身份认证 | JSON (JWT) | 现代应用、移动端、SPA | 轻量灵活,推荐首选 |
| OAuth 2.0 | 授权委托 | JSON () | API 授权、第三方访问 | 别用它做认证 |
| SCIM 2.0 | 用户同步 | JSON (REST) | 多云用户生命周期管理 | 自动化必备 |
避坑指南:我踩过的几个坑
讲完概念,我分享几个真实踩过的坑,希望能帮你省点时间。
- SAML 签名证书过期:我曾经在凌晨两点被电话叫醒,原因是 SAML 证书过期了,所有用户无法登录。从那以后,我养成了在证书到期前 30 天设置自动告警的习惯。
- OIDC 的 issuer 不匹配:有一次配置 AWS 与 Keycloak 的 OIDC 联邦,一直报错。查了半天,发现 Keycloak 的 issuer URL 末尾多了一个斜杠。嗯,一个斜杠,排查了两小时。
- SCIM 的批量操作限流:某次同步 1 万个用户到 Azure AD,结果 SCIM 请求被限流了。后来我加了指数退避重试逻辑,才搞定。大厂 API 都有限流,别硬来。
一个小建议:不管用 SAML 还是 OIDC,一定要在测试环境里完整走一遍流程。用 SAML 的话,可以用 samltool.io 解码断言看看内容;用 OIDC 的话,可以用 jwt.io 解码 ID 。亲眼看到 里的字段,比看文档直观得多。
好了,这一章的核心概念就这些。IdP 和 SP 是角色,SAML 和 OIDC 是认证协议,SCIM 是同步协议。把这几个东西搞清楚,后面搭建方案的时候就不会迷路。