在SAML协议出现之前,传统Web应用系统单点登录大都通过Cookie来实现,但由于浏览器的安全限制,只有同一个域名下的系统才可以共享Cookie,在云计算大行其道的今天, 该方案无法解决像SaaS这种跨多个域名系统之间的认证和授权问题,于是SAML协议应运而生。

SAML(Security Assertion Markup Language)安全断言标记语言,是一个基于XML的、用于实现不同业务实体(即系统或服务)之间,交换安全信息(例如认证信息、授权信息、主体属性信息等)的标准协议。SAML协议是由OASIS组织最早在2002年被提出,已经经历了1.0、1.1、2.0三个版本。目前国内外的主流云服务平台、SaaS应用以及一些常见软件系统,例如阿里云、AWS、Saleforce、Jira、Confluence、Sonarqube等,都支持通过SAML协议实现单点登录。

SAML协议中的参与者

通常情况下,不同业务系统之间,进行一次完整的SAML交互,会涉及三个参与者:

1. Asserting Party,即断言签发方,是签发断言的业务系统

2. Relying Party,即断言依赖方,是消费断言的业务系统

3. User,即用户,一般通过Web浏览器与两个业务系统进行交互

SAML协议可以应用于多种不同的业务场景,在一些业务场景中,SAML会定义不同的角色,各个业务系统在不同的场景中可以扮演不同的角色。以Web单点登录场景为例,在该场景下,SAML协议中定义了IdP(Identity Provider)和 SP(Service Provider)两种角色。

SAML协议中的基本概念

在整个SAML协议框架体系中,会涉及到以下几个基本概念:Assertions、Protocols、Bindings、Profiles、Metadata、Authentication Context。

Assertions即断言,是安全信息的载体,通常由断言签发者、主体(Subject)、关于该主体的一组声明(Statements)以及声明生效的条件(Conditions)四部分构成。SAML协议定义了以下三种类型的声明:

认证声明:Authentication Statements,用于描述主体在什么时间通过什么方式被认证通过。

属性声明:Attribute Statements ,用于描述主体的其它属性信息,比如主体的姓名、昵称、主体隶属的组织信息等。

授权声明:Authorization Decision Statements 用于描述是否允许主体执行某种操作。

下图是一个断言的具体样例,该断言是由 https://idp.example.com 在 2022-01-28 10:12:49 签发,其受众是 http://sp.example.com ,并且断言仅在 2022-01-28 10:12:49 到 2022-01-28 10:18:49 时间内有效;断言中声明了当前主体“zhang_san”在 2022-01-28 10:13:49通过账密方式被认证通过,并且该主体的昵称为“张三”,邮箱为“zhang_san@example.com”。

Protocols消息协议,可以简单的理解为SAML报文格式,即两个不同系统之间在通过SAML协议进行交互时,请求和响应报文的具体规范。

Bindings用于定义SAML消息报文如何通过底层传输协议进行传输,例如:支持通过哪些协议进行传输?通过这些协议进行传输时,应该将请求\响应报文放在协议的什么位置、哪些参数中?SAML2.0中,定义了六种Bidings,其中最常用的四种如下:

HTTP Redirect Binding:定义了 SAML 协议消息如何通过 HTTP 302 跳转方式进行传输。

HTTP POST Binding: 定义了 SAML 协议消息如何通过 base64 编码后,以Form表单方式进行传输。

HTTP Artifact Binding: 定义了SAML artifact 如何通过HTTP协议进行传输。

SAML URI Binding: 定义了如何从URI中提取SAML断言。

Profiles 定义了具体的业务场景的交互流程和约束,通过将Assertions、Protocols、Bindings的有机组合,实现具体用例场景需求目标。SAML2.0中,定义8个场景,其中最常用的就是以下两个场景:

Web Browser SSO Profile: 定义了业务系统之间如何利用Web浏览器, 通过HTTP Redirect Biding、HTTP POST Binding、HTTP Artifact Binding三种方式,实现认证请求、SAML响应和断言的发送与接收,最终实现单点登录。

Single Logout Profile: 定义了业务系统之间如何利用Web浏览器, 通过HTTP Redirect Biding、HTTP POST Binding、HTTP Artifact Binding三种方式,实现退出请求及响应的发送与接收,最终实现单点登出。

Metadata 定义了SAML协议参与者之间描述、共享配置信息的规范。以Web单点登录场景为例,Metadata里可以声明当前系统的以下信息:当前系统的标识信息、支持扮演的角色(IDP或SP或二者兼备)、支持的签名方式以及签名私钥对应的X.509证书、支持的主体标识格式以及主体的属性、支持的SAML Bindings等;如果当前系统扮演的是IDP角色,还可以包含单点登录发起的URL地址等;如果当前系统扮演的是SP角色,还可以包含断言消费地址等。

Authentication Context认证信息上下文。在某些特殊场景下,SP需要依据当前主体(Subject)在IdP中的认证方式和强度,来决定是否接收断言。SP也可以在请求中声明,要求IdP通过指定的方式来认证用户。Authentication Context 就是用来描述不同的认证方式信息。

SAML协议的安全设计

SAML协议通过以下策略来保证交互的安全性:

1、为保证消息的完整性和机密性,建议通过HTTPS协议进行消息传输,并且SSL版本建议在SSL3.0或者TLS1.0及以上。

2、针对包含断言的响应信息,断言签发方应通过PKI技术,对响应报文和断言进行签名,对敏感信息进行加密。SAML既支持对断言进行签名、也支持对整个响应进行签名。断言消费方在接收到断言后,通常需要按照如下逻辑进行验证:

  • 从响应中提取签名信息,依据签名信息中指定的算法、使用签名信息中指定的验签证书,对原文和签名值进行验证;如果验证不通过,应该丢弃断言,并返回错误。

  • 对验签证书进行验证,这里通常有两种验证方式:

公钥匹配,该模式下无需关心证书的有效性,即从断言中指定的验签证书提取公钥,检查该公钥与系统配置的验签公钥一致,如果不一致,则应该丢弃断言,并返回错误。

基于证书链进行验证,包括:验签证书是否处于有效期、验签证书是否与系统配置的证书一致或者由系统配置的证书所签发、验签证书是否被吊销,三者任何一项验证不通过,则应该丢弃断言,并返回错误。

3、时效性验证,断言中通常会包含一组验证条件,如上文断言示例图中的 Conditions 节点,通常会声明断言的有效期起止时间(NotBefore和NotOnOrAfter),断言依赖方需要将本地时间换算成UTC时间,并检查换算后的时间是否在要求的时间范围内;如果超出范围,则可以丢弃断言,返回错误。

4、防重放攻击,在Web单点登录场景下,通常会分为SP发起和IdP发起两种模式:

在SP发起模式下,SP请求IdP时,通常会传递 RelayState 参数,IdP 完成用户认证后,须回传 RelayState 参数,并且参数值必须与请求中的参数值一致,SP系统可以使用 RelayState 参数来维护状态和防止重放攻击。

在IdP发起模式下,IdP签发的断言和响应中,会包含一个ID参数,例如上文断言示例图中的断言ID为:


aaaac7vafvdyubckqo4vj6q7xx34jrgkjqppvci
,该ID是全局唯一的,SP可以通过该字段来防止重放攻击,例如:断言消费后将ID值
aaaac7vafvdyubckqo4vj6q7xx34jrgkjqppvci 存入缓存中,缓存期限超过断言的有效期截止日期即可,后续收到断言后,可以检查缓存中是否已经存在相同的ID,如果存在则可以认为是重放攻击,返回错误。

由于只有在SP发起模式下,IdP和SP之间才可以交互 RelayState 参数,如果SP同时支持两种模式的单点登录,建议通过后者实现重放攻击。

5、其它验证策略:

系统标识验证(可选):断言中通常会包含断言的签发者,如上文断言示例图中的 Issuer 节点声明的颁发者为:

https://idp.example.com ;包含断言的受众 如上文断言示例图中的 AudienceRestriction节点,声明的断言的受众为:

http://sp.example.com ;断言依赖方可以检查颁发者标识是否与本系统配置的一致,受众是否与本系统声明的标识一致。

请求ID匹配验证(可选):适用于SP发起的单点登录场景,SP请求IdP时,请求报文中会包含一个 ID 信息,Idp在签发响应和断言时,可以在响应和断言中增加 “InResponseTo”属性,该属性应该与请求ID保持一致,断言依赖方在接收到断言后,可以检查断言中是否包含该属性,如果包含则可以根据该属性值,在当前会话(或者缓存、数据库或其他方式)查找请求并进行验证。

SAML协议的用户隐私设计

目前国内外对于用户隐私保护的要求,已经越来越规范和严格,SAML通过以下机制来满足用户隐私的需求,使用户有能力掌控其身份数据,在不同的之间的共享和使用,避免不恰当的关联:

SAML协议支持使用“化名”在IdP和SP之间进行身份交互,并且针对不同的SP,使用不同的“化名”,这个“化名”我们可以理解为钉钉中的 openId,当然SAML也支持不同的SP之间使用同一个“化名”,类似于钉钉中的 userId。

SAML协议支持使用一次性的或者临时的身份在IdP和SP之间身份交互。

SAML协议支持在IdP和SP之间,传递用户对某些行为的授权许可信息。

阿里云IDaaS是领先的云端集中式身份管理服务,目前平台已经集成了逾百种应用,均是通过SAML协议来实现,包括但不限于Saleforce、Jira、Confluence、Sonarqube、Jenkins、简道云等。其中与简道云的对接实例可点击详阅《阿里云IDaaS对接实例》,IDaaS更多信息请点击《应用身份服务IDaaS》,关于SAML标准协议更多干货,请持续关注小编之后的内容哦。

关于九州云腾

北京九州云腾科技有限公司(简称:九州云腾)是一家专门针对云计算与移动应用的下一代统一身份认证解决方案提供商,同时提供衍生的零信任安全产品及解决方案。2019年11月,九州云腾被阿里云全资收购,现为集团全资子公司,保持独立品牌继续运营。

九州云腾提供针对内部员工(EIAM)、外部会员(CIAM)、市民/法人(数字政府)等各类场景下的统一身份管理解决方案;以及针对特定身份认证场景下的安全认证(短信认证、号码认证、FIDO、Webauth),满足等保合规需求的双因素认证方案。并基于泛身份理念,打造符合零信任理念的身份定义边界SDP、API安全认证网关等产品,助力企业构建以身份为边界的新的安全体系。客户覆盖政府、金融、制造、互联网、能源、教育、地产、医疗等多个行业。

成立多年,九州云腾获得多项国内外荣誉。2021年,IDaaS产品进入Gartner AM魔力象限,是第一家也是唯一家进入魔力象限的中国厂商,同年作为亚太地区唯一厂商入围Forrester报告,实现了中国厂商的零突破。

举报/反馈

九州云腾

99获赞 25粉丝
用身份重新定义网络边界
北京九州云腾科技有限公司官方账号
关注
0
0
收藏
分享