SAML
SAML是一种XML框架用来交换安全信息,其中定义了按照安全规范所需要的通信的协议和格式。
SAML是一种中心化的认证机制,其定义了两种实体相互通信:
* Service Provider(SP): 向用户提供正式商业服务的实体,通常需要认证一个用户的身份(比如本次开发服务的员工管理系统,财务报销系统等);
* Identity Provider(IDP): 提供用户的身份鉴别方,用以确保用户是其所声明的身份(比如本次公司提供统一登录的sso方);
SAML的重要用途:
* 单点登录(SSO Single Sign-ON);
* 联合认证(Federated Identity);
* 在其他架构内使用SAML,比如WS-Security;
SAML在单点登录中大有用处:在*SAML*协议中,一旦用户身份被主网站*IDP*认证过后,该用户再去访问其他在主站注册过的应用*SP*时,都可以直接登录,而不用再输入身份和口令。
OPENSAML
OpenSAML是一个便于使用SAML消息的依赖库,其提供的主要功能包括:
1. 创建SAML消息;
2. 解析SAML对象并导出为XML格式;
3. 签名和加密;
4. 对SAML消息进行编码并传输。
目前*OpenSAML*库提供Java和C++实现的版本,需要注意的是OpenSAML虽然多应用用于*SSO*(单点登录)的开发中,
但是该库本身不提供任何身份识别和授权的功能,其只是实现对于SAML消息的相关操作而已。
SAML通过Web浏览器实现的协议流程
1. 用户尝试获得权限
流程首先从一个非认证的用户开始,该用户尝试从一个受保护的SP那里获得访问权限。某种方式的过滤器被设置在访问路径上来检测用户是否被授权。
这一部分其实并不是SAML协议里的内容,但是却决定了是否要被授权。
2. 用户被重定向到IDP
当访问路径上被设置的过滤器发现用户并非是被认证的,将会自动把用户从定向到IDP,以求验证用户的身份。
3. 用户被认证
在这一步里,用户被认证。注意这里并没任何涉及到SP的交互,在安全方式内,IDP对于认证用户有着全权责任。
4. 已认证的用户被从定向回SP
当用户被认证成功之后,用户会携带着SAML产物(SAML artifact)被从定向回SP。这样的SAML产物也可以说是认证信息的标识,因为认证信息中有敏感的信息不能直接通过浏览器传输,所以这里只是发送标识而已。
5. 要求认证信息
当收到SAML产物之后,SP将其发送回IDP,IDP依据SAML产物找到认证信息,并通过SAML产物响应(SAML Artifact Response)发送回SP
SAML相关定义
1. 断言(Assertions) 即信息
断言是在SAML中用来描述**认证**的对象,其中包括一个用户在什么时间、以什么方式被认证,同时还可以包括一些扩展信息,比如用户的Email地址和电话等等。
```
<saml2:Assertion>
<saml2:Issuer>IDP</saml2:Issuer>
<ds:Signatur>
<ds:SignedInfo>
<ds:CanonicalizationMethod/>
<ds:SignatureMethod/>
<ds:Reference>
<ds:Transforms>....</ds:Transforms>
<ds:DigestMethod/>
<ds:DigestValue>xxx</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>xxx</ds:SignatureValue>
<ds:KeyInfo><ds:X509Data><ds:X509Certificate>xxx</ds:X509Certificate></ds:X509Data></ds:KeyInfo>
</ds:Signature>
<saml2:Subject>
<saml2:NameID>zhang.san@abc.com</saml2:NameID>
<saml2:SubjectConfirmation>...</saml2:SubjectConfirmation>
</saml2:Subject>
<saml2:Conditions><saml2:AudienceRestriction>...</saml2:AudienceRestriction></saml2:Conditions>
<saml2:AuthnStatement><saml2:AuthnContext>...</saml2:AuthnContext></saml2:AuthnStatement>
<saml2:AttributeStatement>...</saml2:AttributeStatement>
</saml2:Assertion>
```
2. 协议(Protocol)即通信
协议规定如何执行不同的*行为*。这些行为被细化成一些列的Request和Response对象,而在这些请求和相应的对象中包含了*行为*所特别需要的信息。
比如,认证请求协议(AuthnRequest Protocol)就规定了一个SP如何请求去获得一个被认证的与用户。
```
<saml2p:AuthnRequest
AssertionConsumerServiceURL=http://xxxx
Destination="http://xxx"
ID="_52c9839568ff2e5a10456dfefaad0555"
IssueInstant="2020-05-11T02:37:05.469Z"
ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTPArtifact"
Version="2.0">
<saml2:Issuer>xxx</saml2:Issuer>
<saml2p:NameID
PolicyAllowCreate="true"
Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient"/>
<saml2p:RequestedAuthnContext Comparison="minimum">
<saml2:AuthnContextClassRef>
urn:oasis:names:tc:SAML:2.0:ac:classes:Password
</saml2:AuthnContextClassRef>
</saml2p:RequestedAuthnContext>
</saml2p:AuthnRequest>
```
3. 绑定(Binding)即传输
绑定定义了SAML信息如何使用通信协议被传输的。
其实SAML2.0中支持很多种绑定方式,如下都方式在OpenSAML中都有实现:
* SAML SOAP Binding (based on SOAP 1.1)
* Reverse SOAP (PAOS) Binding
* HTTP Redirect (GET) Binding
* HTTP POST Binding
* HTTP Artifact Binding
* SAML URI Binding
### 配置(Profiles) 即综合
配置定义了如何组织以上信息,并且在一个更高的层次上描述断言,协议和绑定如何被使用去解决一个具体情况。比如Web浏览器的SSO配置就描述了如何一个用户使用浏览器被认证。
### 元数据(MetaData)
SAML的元数据是配置数据,其包含关于SAML通信各方的信息,比如通信另一方的ID、Web Service的IP地址、所支持的绑定类型以及通信中实用的密钥等等。
> OpenSaml中提供了metadata provider来帮助构建和解读元数据。
google 和 火狐带有插件工具 SAML TRACER,在浏览器中添加一个窗口来显示SAML消息
本文作者:琉璃@涂鸦智能安全团队
漏洞悬赏计划:涂鸦智能安全响应中心(https://src.tuya.com)欢迎白帽子来探索。
招聘内推计划:涵盖安全开发、安全测试、代码审计、安全合规等所有方面的岗位,简历投递sec@tuya.com,请注明来源。