【IT168 信息化】
由于作为服务软件的越来越多,更多的机构开始倾向于面向服务架构(SOA),这种环境往往是攻击者的主要目标。这种趋势要求特别设计的技术解决安全性问题,接下来我将描述由安全性断言标志语言(SAML)阐释的方法。
SAML是在OASIS指导下开发的标准。OASIS管理一系列广泛的标准,这些标准和XML以及像WS-*和SGML这样的Web服务有关。SAML这如其首字母缩略词所显示的那样,通过XML或者HTML标识语言强制执行安全性,使其成为广泛安全方案的一部分。
使用SAML的最新领域包括由自由联盟计划开发的单一登录计划,本质上和开发ID项目很相似——例如通过WS-Security在基于SOAP服务中使用的通用领域。理解SAML的关键是要理解其断言机制,该断言机制是语言的基石。列表1-1展示了一个SAML断言。
<saml:Assertion xmlns:saml=a urn:oasis:names:tc:SAML:2.0:assertiona
Version="2.0"
IssueInstant="2008-10-15T12:00:00Z">
<saml:Issuer Format=urn:oasis:names:SAML:2.0:nameid-format:entity>
http://www.acme.org
</saml:Issuer>
<saml:Subject>
<saml:NameID
Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">
j.smith@acme.org
</saml:NameID>
</saml:Subject>
<saml:Conditions
NotBefore="2008-10-15T12:00:00Z"
NotOnOrAfter="2008-10-15T12:10:00Z">
</saml:Conditions>
<saml:AuthnStatement
AuthnInstant="2008-10-15T12:00:00Z" SessionIndex="67775277772">
<saml:AuthnContext>
<saml:AuthnContextClassRef>
urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport
</saml:AuthnContextClassRef>
</saml:AuthnContext>
</saml:AuthnStatement>
</saml:Assertion>
在最后一个列表中,你可以看到,SAML断言包含了很多安全语句,这些语句都和一个主题有关。一个断言的价值可以体现在各个方面,范围从基本要素(例如就某个主题做出断言的人)延伸到更为细致的话题(例如一个断言的时间有效的和日期,甚至还包括令断言更为严格的附加条件)。
SAML当局a(提供断言方)和SAML依赖方(要求断言)之间交换断言。依照交换的性质,第三方或者“被断言方”也会参与进来。第三方满足单一登录方案,在该方案中“被断言方”是一个企图访问资源的终端用户,主管SAML当局和SAML依赖方交换。对于其它SAML交换来说,“被断言方”不过是组成SAML依赖方的应用逻辑。
要想将SAML融入到SOA安全方案,主要取决于其平台中立性。例如早期SAML断言<NameSubject>中的<NameID>要素。在这个实例中,断言是通过电子邮箱做出的,但是这只是其中的一种情况。SAML同样也支持像X.509或者Kerberos这样的身份,这在企业设置中是很常见的,因此这些身份可以在一个特定的平台中屏蔽应用程序。
把这个相同的情况看做是单一注册方法;而不是将程序a“和用户a”锁定到电子邮件地址,基于SAML的架构准许“被断言方”提供凭证,例如数字签名证书(X.509)或者Kerberos,准许安全策略建立在更为广阔的或者已经存在的安全基础设施中。
实际上最主要的安全性问题“这一方真是其所宣称的那样吗?”,是通过SAML来回答的,而不是通过某一个特定平台来回答的,这些平台总有特有的方法断言(例如超时值设定的,失败的条件)。SAML会将这个断言过程标准化。
我们再看一下含有SOAP服务的案例场景,列表1-2展示了一个嵌入在SOAP请求中的SAML代码片段。
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope
xmlns:env=a http://www.w3.org/2003/05/soap/envelope/a >
<env:Body>
<samlp:AttributeQuery
xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
ID="aaf23196-1773-2113-474a-fe114412ab72"
Version="2.0"
IssueInstant="2008-10-15T20:31:40Z">
<saml:Issuer>http://example.sp.com</saml:Issuer>
<saml:Subject>
<saml:NameID
Format="urn:oasis:names:tc:SAML:1.1:nameid-format:X509SubjectName">
C=US, O=TECHTARGET-TEST, OU=User, CN=jsmith@acme.org
</saml:NameID>
</saml:Subject>
<saml:Attribute
NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"
Name="urn:oid:2.5.4.42"
FriendlyName="givenName">
</saml:Attribute>
</samlp:AttributeQuery>
</env:Body>
</env:Envelope>
注意<NameID>值现在指向了X.509值。此外在客户服务器SOAP交换过程中还要执行安全性检查,但是因为断言是建立在SAML基础之上的,这需要松耦合和切换邮箱地址或者kerberos的功能(如果需要的话),这也是SOA最主要的目标。
那么在哪里SAML会融入到Open-ID,自由联盟和Web服务中呢?在每个应用程序栈a“markup a”底部,都会有SAML运行。因此你不可能在这样的项目中看到有明确提到这方面的内容,这些项目都是整体的办法解决安全性问题。但是SAML的颗粒度使其功能变得更为强大,可以处理各种各样涉及云计算的安全隐患。
目前有许多开放源SAML实施,进一步扩展了SAML的用途,远远超出了之前我们所说的那个项目。所以如果你的SOA项目也需要具有松耦合特性的安全检查,考虑一下SAML吧,它和XML一样,可以解决分布式系统安全问题。