SAML

SAML是OASIS制定的一种安全性断言标记语言,它用于在复杂的环境下交换用户的身份识别信息。在SAML诞生之前,如果想在Websphere、Weblogic和SunONE等之间实现SSO,我们必须分别实现一个适配层,来达成一种相互理解的协议,在该协议上,产品能够共享各自的用户认证/授权信息。SAML诞生之后,我们免去了这种烦恼。可以预计,将来大部分产品都可以实现基于SAML的联邦服务。

  事实上,SAML已经在很多商业/开源产品中得到实现,包括:

  IBM Tivoli Access Manager
  Weblogic
  Oblix NetPoint
  SunONE Identity Server
  Baltimore, SelectAccess
  Entegrity Solutions AssureAccess
  Internet2 OpenSAML
  Yale CAS 3
  Netegrity SiteMinder
  Sigaba Secure Messaging Solutions
  RSA Security ClearTrust
  VeriSign Trust Integration Toolkit
  Entrust GetAccess 7

  SAML背后是强大的商业联盟和开源联盟,尽管Microsoft迟迟未能在SAML2.0观点上达成一致,但它也正努力跟进SAML标准化过程,由此可见SAML协议已经是势在必行。

  1 SAML的基本概念

  理解SAML的概念很重要,个人认为SAML协议的原理跟CAS/Kerberos很类似,理解上不存在困难,但SAML引入了一些新的概念名词,因此要先把握清楚这些概念。

  断言,这个在SAML的”A”,是整个SAML协议中出现的最多的字眼,我们可以将断言看作是一种判断,并且我们相信这种判断,因此,做出断言的一方必须被信赖。校验来自断言方的断言必须通过一些手段,比如数字签名,以确保断言的确实来自断言方。

  SAML目标是让多个应用间实现联邦身份(IdentityFederation),提起联邦,大家可以想象一下欧盟,欧盟国家之间的公民都具有一个联邦身份,比如Peter是法国公民,John是比利时公民,这两个公民的身份都能够互相被共享,恰好,张三是一个中国公民,但他能像Peter和Jhhn那样随意进入欧盟国家,显然不能,因为它不具有欧盟联邦身份。

  理解了联邦的概念,我们就可以回到SAML上,SAML解决了联邦环境中如何识别身份信息共享的标准化问题,比如,法国的Peter进入比利时,他如何证明自己的身份呢?

  SAML就是为了解决这个问题。

  在联邦环境中,通常有下面的3种实体:

  Subject主题):Subject是SAML实体中的第一个重要的概念,Subject包括了User、Entity、Workstation等能够象征一个参与信息交换的实体。

  RelyingParty信任方):SAML中的ServiceProvider角色,也就是提供服务的一方。

  AssertingParty断言方):SAML中的IdentityProvider角色,用于提供对主题的身份信息的正确的断言,类似一个公证机构。

  我们看看联邦环境的一个场景:

  假设有一个Peter(Subject)的法国公民,他需要访问比利时(ServiceProvider),他在比利时机场被要求提供身份信息,Peter提供了欧盟(Federation)的通行证件,随即,这个通行证件在比利时机场被审核,或通过计算机送到欧盟身份认证中心(IdentityProvider),该中心有一个由所有欧盟国家共同建立的公民数据库,中心审核了Peter的身份信息,并断言“Yes,HeisPeterFromFrance”,于是,Peter得到礼貌的回应“欢迎光临比利时”。

  如果你将欧盟看作是一个联邦环境,你会发现上面的场景跟在联邦环境应用SAML很相似。

  在联邦环境下,任何需要授权访问的服务都需要知道服务请求方的身份主题信息(Whoareyou),服务提供方(ServiceProvider)不负责审核用户的身份信息,但它依赖于1个甚至多个IdentityProvider来完成此任务,见下图。

  1个IdnetityProvider可以被多个ServiceProvider共享,当然,共享的前提是建立信任关系(即ServiceProvider要信任IdnetityProvider),就好比如,如果比利时(ServiceProvider)需要开放对欧盟国家成员访问,它信任欧盟的IdnetityProvider,它信任欧盟的IdnetityProvider的任何判断,包括”HeisPeterFromFrance”。至于是否让Peter入境,那是受权限策略的控制(注意SAML同样对Authorization断言做了标准化,此处,我们仅仅关注Authentication)。

 

  2 SAML 的 2 种典型模式

  在协议的角度, SAML 原理非常类似 CAS 和 Kerberos , CAS 协议依赖于 CAS Server , Kerberos 依赖于 KDC ,而 SAML 则依赖于 Identity Provider 。

  根据 Service Provider( 以下简称 SP) 和 Identity Provider( 以下简称 IDP) 的交互方式, SAML 可以分为以下几种模式:一种是 SP 拉方式,一种是 IDP 推方式。

  在 SAML 中,最重要的环节是 SP 如何获取对 Subject 的断言, SP 拉方式是 SP 主动到 IDP 去了解 Subject 的身份断言,而 IDP 推方式则是 IDP 主动把 Subject 的身份断言通过某种途径告诉 SP 。

  2.1 SAML 的 POST/Artifact Bindings 方式(即 SP 拉方式)

  该方式的主要特点是, SP 获得客户端的凭证 ( 是 IDP 对 Subject 的一种身份认可 ) 之后,主动请求 IDP 对 Subject 的凭证的断言。如下图所示: Subject 是根据凭证去访问 SP 的。凭证代表了 Subject 的身份,它类似于“来自 IDP 证明:我就是 Peter ,法国公民”。
现在,让我们看看 SP 拉方式是如何进行的:

  Subject 访问 SP 的受保护资源, SP 发现 Subject 的请求中没有包含任何的授权信息,于是它重定向用户访问 IDP.



  协议执行:
  1,Subject 向 IDP 请求凭证 ( 方式是提交用户名 / 密码 )
  2,IDP 通过验证 Subject 提供的信息,来确定是否提供凭证给 Subject
  3,假如 Subject 的验证信息正确,他将获取 IDP 的凭证以及将服务请求同时提交给 SP 。
  4,SP 接受到 Subject 的凭证,它是提供服务之前必须验证次凭证,于是,它产生了一个 SAML 请求,要求 IDP 对凭证断言
  5,凭证是 IDP 产生的,它当然知道凭证的内容,于是它回应一个 SAML 断言给 SP
  6,SP 信任 IDP 的 SAML 断言,它会根据断言结果确定是否为 Subject 提供服务。

  2.2 SAML 的 Redirect/POST Bindings 方式 ( 即 IDP 推方式 )

  该方式的主要特点是, IDP 交给 Subject 的不是凭证,而是断言。

  过程如下图所示:



  1,Subject 访问 SP 的授权服务, SP 重定向 Subject 到 IDP 获取断言。
  2,IDP 会要求 Subject 提供能够证明它自己身份的手段 (Password , X.509 证书等 )
  3,Subject 向 IDP 提供了自己的帐号密码。
  4,IDP 验证密码之后,会重订向 Subject 到原来的 SP 。
  5,SP 校验 IDP 的断言 ( 注意, IDP 会对自己的断言签名, SP 信任 IDP 的证书,因此,通过校验签名,能够确信从 Subject 过来的断言确实来自 IDP 的断言 ) 。
  6,如果签名正确, SP 将向 Subject 提供该服务。

出处: http://www.blogjava.net/security/archive/2006/10/02/sso_in_action.html

<think>好的,用户之前让我介绍了OAuth 2.0,现在又要求介绍SAML协议。我需要先确定用户的需求。可能用户是在学习身份验证和授权相关的协议,或者是需要为项目选择合适的安全方案。用户可能对OAuth和SAML的区别不太清楚,所以需要对比两者的不同,或者用户想深入了解SAML的具体细节。 首先,我应该回忆SAML的基本概念,核心组成部分,以及它的应用场景。SAML是基于XML的标准,主要用于单点登录(SSO),这一点和OAuth不同,OAuth主要用于授权,而SAML侧重身份认证。需要明确两者的区别,避免用户混淆。 接下来,用户可能需要了解SAML的工作流程,比如SP和IdP的角色,以及断言(Assertion)的类型。这里需要结构清晰,分步骤解释。同时,用户可能关心SAML的安全性,比如签名和加密机制,以及常见的漏洞和防护措施。 另外,用户可能想了解SAML的实际应用案例,比如企业内部的SSO系统,或者与OAuth的联合使用场景。这时候举一些例子会有帮助,比如使用SAML的公司或服务。 还需要注意用户的技术背景。如果用户是开发人员,可能需要更详细的技术细节,比如XML结构、绑定方式(HTTP POST/Redirect)。如果是管理人员,可能更关注应用场景和优势。 在回答结构上,可以按照核心概念、工作流程、安全机制、与OAuth的对比、应用案例和常见问题来组织。同时,使用之前用户接受的格式,比如分点、代码块、公式等,保持一致性。 需要检查是否有遗漏的关键点,比如SAML的版本差异(2.0是最常用的),或者与其他协议如OpenID Connect的关系。另外,可能用户会问到SAML的优缺点,比如XML的复杂性是否影响性能,或者在现代应用中的使用情况。 最后,确保语言简洁明了,避免过于技术化的术语,但必要时给出解释。保持回答的深度,但不过于冗长,帮助用户全面理解SAML协议。</think>$$SAML\ 协议框架$$ **SAML**(Security Assertion Markup Language)是一种基于**XML**的开放标准,专为实现跨域**单点登录(SSO)**和身份联合而设计。以下是深度解析: --- ### 一、核心目标与特性 1. **核心问题解决** $$ \exists \text{多系统} \Rightarrow \text{用户需重复登录} \Rightarrow \text{SAML提供:} \forall \text{系统} \Rightarrow \text{一次认证} $$ - 实现**身份提供者(IdP)**与**服务提供者(SP)**间的信任传递 2. **关键特性** ```markdown - XML数据格式(SAML 2.0为主流) - 支持HTTP POST/Redirect绑定 - 强依赖数字签名(防篡改) - 适用于企业级SSO(如Office 365登录) ``` --- ### 二、协议角色定义 1. **三大参与方** $$ \begin{cases} \text{主体 (Principal)} & \text{(用户)} \\ \text{身份提供者 (Identity Provider, IdP)} & \text{(如AD FS)} \\ \text{服务提供者 (Service Provider, SP)} & \text{(如Salesforce)} \end{cases} $$ 2. **断言(Assertion)结构** ```xml <!-- SAML断言示例 --> <saml:Assertion ID="_a75ad..." IssueInstant="2023-08-20T09:30:00Z"> <saml:Issuer>https://idp.example.com</saml:Issuer> <saml:Subject> <saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">user@example.com</saml:NameID> </saml:Subject> <saml:Conditions NotBefore="2023-08-20T09:30:00Z" NotOnOrAfter="2023-08-20T09:35:00Z"/> <saml:AuthnStatement AuthnInstant="2023-08-20T09:28:00Z"> <saml:AuthnContext> <saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:Password</saml:AuthnContextClassRef> </saml:AuthnContext> </saml:AuthnStatement> </saml:Assertion> ``` - **断言类型**:认证声明、属性声明、授权决策 --- ### 三、标准交互流程(Web SSO) ```mermaid sequenceDiagram participant User as 用户 participant SP as 服务提供者 participant IdP as 身份提供者 User->>SP: 请求访问资源 SP->>User: 生成SAML请求 + 重定向到IdP User->>IdP: 提交认证(如AD凭证) IdP->>User: 生成SAML响应(含签名断言) User->>SP: 提交SAML响应 SP->>SP: 验证签名/时效性/颁发会话Cookie SP->>User: 授权访问资源 ``` --- ### 四、关键安全机制 1. **XML数字签名** - 签名流程: $$ \text{断言哈希} \rightarrow \text{私钥加密} \rightarrow \text{XML签名块} $$ ```xml <ds:Signature> <ds:SignedInfo>...</ds:SignedInfo> <ds:SignatureValue>MEUCIQD...</ds:SignatureValue> <ds:KeyInfo><ds:X509Data>...</ds:X509Data></ds:KeyInfo> </ds:Signature> ``` 2. **防御措施** ```markdown - 强制HTTPS传输 - 断言时效控制(NotBefore/NotOnOrAfter) - 防范重放攻击(ID唯一性校验) - SP严格验证IdP证书链 ``` --- ### 五、与OAuth 2.0对比 | 维度 | SAML 2.0 | OAuth 2.0 | |--------------------|-----------------------------------|-------------------------------------| | **核心目标** | 身份认证与SSO | 资源访问授权 | | **数据格式** | XML | JSON | | **传输协议** | 基于HTTP/SOAP | 基于HTTPS/RESTful | | **典型场景** | 企业内网SSO | 移动应用/API授权 | | **令牌类型** | SAML断言(长期有效) | Access Token(短期) | | **现代扩展** | SAML+WS-Federation | OpenID Connect | > **联合使用案例**: > $$ \text{企业SSO} \Rightarrow \text{SAML认证} \rightarrow \text{OAuth授权API访问} $$ > 如:先用SAML登录Azure AD,再获取OAuth令牌调用Microsoft Graph API --- ### 六、典型应用场景 1. **企业级SSO** - 微软AD FS配置SAML: ```powershell # 创建信赖方信任 Add-ADFSRelyingPartyTrust -Name "Salesforce" -MetadataUrl "https://login.salesforce.com/.xml" ``` 2. **跨域身份联合** - 高校联盟登录系统(如InCommon Federation) - 政府机构间身份互认 3. **云服务集成** - AWS IAM SAML配置: ```json { "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Principal": {"Federated": "arn:aws:iam::123456789012:saml-provider/MySAMLProvider"}, "Action": "sts:AssumeRoleWithSAML", "Condition": {"StringEquals": {"SAML:aud": "https://signin.aws.amazon.com/saml"}} }] } ``` --- ### 七、常见漏洞与缓解 1. **XML签名包装攻击** - 攻击原理: $$ \exists \text{恶意XML} \land \text{有效签名} \Rightarrow \text{SP误解析错误节点} $$ - 防护方案: ```markdown - 启用严格XML解析(禁用外部实体) - 校验断言位置与签名范围一致性 ``` 2. **断言重放攻击** - 防御措施: $$ \forall \text{断言ID} \Rightarrow \text{记录} \land \text{时效检查} $$ 3. **证书管理风险** - 最佳实践: ```markdown - IdP私钥存储HSM中 - SP定期轮换信任证书 - 禁用SHA-1算法 ``` --- ### 八、协议演进与替代方案 1. **SAML 2.0局限** ```markdown - XML处理复杂度高 - 移动端支持较弱 - 无法直接用于REST API ``` 2. **现代替代方案** - **OpenID Connect**:基于OAuth 2.0的身份层 $$ \text{OIDC} \approx \text{JSON Web Token} + \text{标准化声明} $$ - **WS-Federation**:微软主导的SOAP方案 --- SAML仍广泛用于企业级SSO场景,但新系统设计建议优先评估OIDC。实施时需重点关注**XML安全解析**和**证书生命周期管理**,推荐使用经过审计的库(如Spring Security SAML、OneLogin工具包)。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值