转载自:http://blog.csdn.net/peterwanghao/article/details/4271813
目前越来越多的系统通过Web服务、门户和集成化应用程序彼此链接,为解决信息孤岛的问题单点登录的需求越来越紧迫。当前比较普遍的方式是采取集中式身份管理,这样做的好处是简化用户管理,把对访问控制的管理从本地的多个应用系统转移到管理中心,用户数据可以通过Web服务非常方便的访问。
这样做存在一个问题就是各系统失去了对用户数据的所有权,特别是在企业间应用的单点访问。而且,随着互联网规模的不断增长,把一个用户的所有信息全部收集到一个地方,即不可能也不需要。SAML规范的建立就是为了解决这一问题,它通过联合识别、验证和授权的形式允许企业建立自己所有和控制的数据,并能够以结构化的、受控的方式与协作企业共享这些数据。
安全性断言标记语言(Security Assertion Markup Language,SAML)是由结构化信息标准促进组织(OASIS)建立的一套安全标准。是基于XML(可扩展标记语言)面向Web服务的架构,用于在网络间交换安全信息。目前,SAML已经有3个版本,分别是2002年11月份的1.0版本、2003年9月份的1.1版本和2005年3月份的2.0版本。
SAML目标是让多个应用间实现联邦身份(IdentityFederation),提起联邦,大家可以想象一下欧盟,欧盟国家之间的公民都具有一个联邦身份,比如Peter是法国公民,John是比利时公民,这两个公民的身份都能够互相被共享。
在联邦环境中,通常包括三个角色:
u 主题(Subject)— 与身份信息相关的用户。
u 信任方(ServiceProvider)— 提供服务的一方,利用身份信息决定允许访问什么。
u 断言方(IdentityProvider)— 用于提供对主题的身份信息的正确的断言,类似一个公证机构。
在联邦环境下,任何需要授权访问的服务都需要知道服务请求方的身份主题信息(Subject),服务提供方(ServiceProvider)不负责审核用户的身份信息,但它依赖于1个甚至多个IdentityProvider提供的断言来完成此任务。当然,前提条件是建立信任关系(即 ServiceProvider要信任IdnetityProvider)。
什么是断言呢?断言可以看作是我们信赖的权威机构对用户作出的一种判断,而且我们相信这种判断。断言提供主体所执行的验证、主体属性、是否允许主体访问特定资源的授权决策等信息。一组断言组成一个主体的配置文件。配置文件中的断言可能来自不同的组织。
断言有三种类型:
* 验证断言:验证断言处理主体在特定时刻、特定机制下的身份验证。
* 属性断言:属性断言提供联系特定属性与给定主体的一种机制。
* 授权决策断言:授权决策断言管理给定主体访问资源的权限。
总体说来,SAML是两台服务器需要共享认证信息时使用的协议规范。需要强调的是SAML不负责验证,只负责传输被验证的信息。
SAML断言的基本格式相同,主要要素如下([必需]表明所有实例中都必须有,[可选]表明该要素为可选)。
(1) Version[必需]
断言的版本号。目前,SAML已经有3个版本,分别是2002年11月份的1.0版本、2003年9月份的1.1版本和2005年3月份的2.0版本。
(2) ID[必需]
一个断言的ID号。实体在选择ID号时,必须考虑到实体本身或其他实体也有可能选择相同的ID号,这样的相同不应该带来很大的麻烦。如果一个数据对象拥有了一个ID号,那么它应该有且只有唯一的ID号。
(3) IssueInstant [必需]
主体颁发该断言时的时间。在SAML规范中只有一种时间格式,即UTC时间。
(4) <Issuer> [必需]
断言的颁发者。
(5) <ds:Signature>[可选]
使用XML签名对断言进行的签名,这样可以保护断言的完整性,同时可以验证断言的颁发者。
(6) <Subject>[可选]
断言的颁发对象。
(7) <Conditions>[可选]
断言有效的一些条件限制。验证断言有效性时,必须验证所有的条件(详细的条件描述和验证细节请参考SAML标准文档)。
(8) <Advice>[可选]
忠告:是对断言很温和的条件限制,在验证时可以被忽略,或者在验证过程中验证者即使不理解也不影响断言的有效性。但是严格的条件限制下必须均验证有效,才能够保证断言的有效性。
(9) <Statement>
这是为了扩展SAML断言类型而设置的,用户可以通过声明来添加自己的断言类型。
(10) <AuthnStatement>
身份验证声明。
(11) <AuthzDecisionStatement>
授权决策声明。
(12) <AttributeStatement>
属性声明。
身份验证断言是由某一个权威颁发的,断言某一主体在某一特定时间已经通过了身份验证。因此在身份验证断言中,主体元素<subject>和身份验证声明元素<AuthnStatement>是两个主要元素。
属性断言是由某一个权威颁发的关于某主体拥有某些属性的声明,在一个属性断言中可以拥有一个或者多个属性的声明,因此属性断言中的主体元素<subject>和属性声明元素<AttributeStatement>是两个主要元素。
授权决策断言表明断言中主体请求操作某种资源的结果,在该断言中使用URI来描述相应的资源。在授权决策断言中的主体元素<subject>和授权决策声明元素<AuthzDecisionStatement>是两个主要元素。
SAML协议包括多种类型,它使用简单的请求/应答方式。SAML协议的基本类型如下:
(1) 断言查询和请求协议
断言查询和请求协议用来查询已有断言的有效性,或者通过主体或声明类型请求有关的断言。
(2) 身份验证(Authentication)请求协议
一个参与者(Participant)可能是一个代理、程序或者其他实体,需要得到一个关于身份验证的声明时,它可以使用身份验证请求协议向身份验证权威发送身份验证请求,在响应中包括了一个或者多个身份验证的声明。在SAML中,支持身份验证请求协议的权威也成为身份提供者(Identity Provider),本协议在SSO中应用非常广泛。
(3) 假影解析(Artifact Resolution)协议
假影解析协议提供了一种使用SAML绑定传输SAML消息的机制,在传输过程中只需使用请求和响应引用,而不需要使用其实际值。SAML请求和响应消息都可以通过引用得到。消息的发送者在发送消息的时候并不需要将所有的请求消息都转换为SAML绑定协议所要求的数据,而只需要发送一小段数据,称为“ 假影”;接收者能够根据假影使用其他绑定协议进行解析,得到原始的消息内容。
(4) 名字标识符管理协议
一个身份提供者为一个参与者提供一个名字标识符后可能需要修改这个名字标识符的值或结构,或者不再使用参与者的名字标识符。这时,需要使用名字标识符管理协议通知相关的服务提供者。
服务提供者在需要使用名字标识符时,也可以使用名字标识符管理协议来注册或者更改自己的名字标识符。
(5) 单点注销协议
单点注销协议提供了一种在一个地方注销会话,同时终止多个会话的机制。
(6) 名字标识符映射协议
当一个实体和一个身份提供者共享一个参与者的标识符时,该实体可以通过这个共享的标识符向身份提供者请求参与者的名字标识符。
根据 Service Provider( 以下简称 SP) 和 Identity Provider( 以下简称 IDP) 的交互方式, SAML 可以分为以下两种模式:一种是 SP 拉方式,一种是 IDP 推方式。
在 SAML 中,最重要的环节是 SP 如何获取对 Subject 的断言, SP 拉方式是 SP 主动到 IDP 去了解 Subject 的身份断言,而 IDP 推方式则是 IDP 主动把 Subject 的身份断言通过某种途径告诉 SP 。
1、SAML 的 POST/Artifact Bindings 方式(即 SP 拉方式)
该方式的主要特点是, SP 获得客户端的凭证 ( 是 IDP 对 Subject 的一种身份认可 ) 之后,主动请求 IDP 对 Subject 的凭证的断言。如下图所示: Subject 是根据凭证去访问 SP 的。凭证代表了 Subject 的身份。
现在,让我们看看 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、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 提供该服务。
SAML 定义了一个 XML 签名(XML Signature)元素以标识认证中心。该元素可以包含一个带有公钥、到期日和使用策略的 X509 证书。XML 签名还包含签名值本身,签名值是由认证中心为元素内容生成的。可以使用 X509 证书中权威机构的公钥信息来验证签名。这样能够保证信息的安全性、有效性和完整性。
重放攻击可用于造成数据完整性问题以及拒绝服务攻击。SAML 提供了避免重放攻击的保护。SAML 要求在传输断言和消息时使用 SSL 加密,以专门防止断言被拦截。此外,SAML 提供了数字签名机制,该机制使断言具有有效时间范围,以防止断言以后被重播。
使用IP地址避免DNS欺骗。
使用安全超文本传输协议(HTTPS)和SSL/TLS,消除HTTP链接攻击。
SAML的设计特别关注了灵活性。遇到标准尚未涵盖的需求时可扩展。SAML支持很多方式的扩展,包括断言和协议。
u 可修改断言Schema和协议Schema进行扩展;
u 通过使用带有专有命名空间的元素和属性作为可插入的扩展点来进行扩展;
u 通过定义一些基于URI的标识进行扩展。
u SAML标准&协议
http://www.searchsoa.com.cn/showContent_1601.htm
u Web服务安全
http://book.51cto.com/art/200712/62793.htm
u 揭开SAML的神秘面纱
http://industry.ccidnet.com/art/3089/20060213/427115_1.html