《SAML系列一》SAML概念
2020-12-16 16:45:06 Author: www.freebuf.com(查看原文) 阅读量:153 收藏

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>[email protected]</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)欢迎白帽子来探索。

招聘内推计划:涵盖安全开发、安全测试、代码审计、安全合规等所有方面的岗位,简历投递[email protected],请注明来源。


文章来源: https://www.freebuf.com/articles/web/258028.html
如有侵权请联系:admin#unsafe.sh