7.1.3 目录服务:UDDI和DISCO

根据UDDI.org的定义,“统一描述、发现和集成(Universal Description,Discovery,and Integration,UDDI)是分布式的、基于Web的Web服务信息注册规范。UDDI也是这个规范可供公众访问的实现集合,允许企业注册它们所提供的Web服务的信息,使其他企业能够找到这些服务。”

图7-4说明了UDDI融入Web服务整体框架的方式。首先,Web服务提供者用合适的API(这个API一般取决于使用的工具箱)发布关于服务的信息。然后,Web服务消费者可以在UDDI目录中查找特定的服务,这将把消费者指向Web服务提供者中装入的相关WSDL文档。WSDL指出了连接和使用Web服务的方式,最终将消费者与其寻找的具体功能连接。尽管不是必需的,图7-4中的所有交互都可以在SOAP上发生(大部分情况下可能都这么实现)。

图7-4 UDDI、WSDL和Web服务之间的“发布、寻找、绑定”交互。所有箭头都代表SOAP通信

UDDI目录分为两类:公用的和私有的。公用的UDDI是公司用来向公众提供Web服务的。xmethods.net是公用UDDI目录的一个例子。

私有的UDDI目录一般是大型公司实现的,用于内部或者B2B使用。这些目录建立于公司内部通常只能由组织的员工或者合作伙伴访问。因为UDDI目录是许多公司提供Web服务的场所,查询尽可能多的目录,发现你评估的公司是否有开放的服务是很有用的。许多UDDI客户端可以用于搜索目录,我们常常使用SoapClient.com上的一个客户端。图7-5显示了对Amazon的UDDI搜索。

图7-5 SOAP客户端执行UDDI搜索

原始的UDDI查询如下:


POST /inquire HTTP/1.0
Content-Type: text/xml; charset=utf-8
SOAPAction: ""
Host: www.xmethods.net
Content-Length: 425
<?xml version="1.0" encoding="utf-8"?><soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/
XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><find_business
generic="2.0" xmlns="urn:uddiorg:api_v2"><findQualifiers><findQualifier
>orAllKeys
</findQualifier></findQualifiers><name xml:lang="en">amazon</name></
find_business></soap:Body></soap:Envelope>

在发布任何Web服务到UDDI之前都要经过深思熟虑。即使已经有了合适的验证,Web服务也开放了你的攻击面。如果你的公司有需要Web服务目录的合作伙伴,就要创建一个带有校验的私有UDDI。

注意  你绝不应通过隐藏来得到安全性,但是既实施安全又进行隐藏是无害的。

因为公用UDDI目录是公开的,找到它们并不困难,而且它们通常包含了无害的信息。私有UDDI目录则不同。

如果攻击者发现了一个私有UDDI,那么他就遇到了一座金矿,原因有二。第一,大部分私有UDDI目录提供了非常有趣的Web服务,能够侵入组织应用架构的核心。第二,因为处于内部,私有的UDDI假定“阻止”了外部访问,它们实施的安全控制很少,甚至常常连基本的验证都没有。

如果“发布”权限可用,公众就有能力在目录中创建或者编辑Web服务,常见的攻击可能是重命名现有Web服务或者创建一个Web服务器的精确副本,作为中间人,记录所有流量甚至实时操纵流量。

发现UDDI在大多数情况下相当简单。许多公司都有类似uddi.site.com的站点,访问它们的方法很简单,只需要向http://uddi.site.com/inquiry发送一个查询,发布则访问http://uddi.site.com/publish。其他常见的位置如表7-1所示。

表7-1 常见私有UDDI位置

DISCO

Web服务发现(Discovery of Web Services,DISCO)是一种Microsoft专利技术,存在于其.NET Server操作系统和其他.NET相关产品中。为了使用DISCO发布一个部署好的Web服务,只需要创建一个.disco文件,和其他服务相关的文件(如.asmx、.wsdl、.xsd和其他文件类型)一起放在Web服务的虚拟根目录(vroot)下。这个.disco文档是一个XML文档,包含指向描述Web服务的其他资源的链接,和包含接口契约的WSDL文件很相似。下面是一个简单的DISCO文件示例:


<disco:discovery
   xmlns:disco="http://schemas.xmlsoap.org/disco/"
   xmlns:scl="http://schemas.xmlsoap.org/disco/scl/">
   <!-- reference to other DISCO document -->
   <disco:discoveryRef
      ref="related-services/default.disco"/>
   <!-- reference to WSDL and documentation -->
   <scl:contractRef ref="stocks.asmx?wsdl"
      docRef="stocks.asmx"/>
</disco:discovery>

DISCO文件的主要元素是contractRef,这个元素有两个属性ref和docRef,指向给定Web服务的WSDL和文档文件。此外,discoveryRef元素可以把给定的DISCO文档链接到其他DISCO文档,创建一个跨越多台机器甚至多个组织的DISCO文档网络。因此,.disco文件常常为恶意的黑客提供有趣的珍贵信息。

在.NET Framework SDK中,Microsoft发布了一个disco.exe工具,连接到给定的DISCO文件,提取在指定URL发现的Web服务的信息(将输出写入到文件results.discomap),并且下载发现的所有.disco和.wsdl文件。它还能浏览整个网站寻找DISCO文件,将它们存储在指定的输出目录,语法如下:


C:\>disco /out:C:\output http://www.victim.com/service.asmx
Microsoft (R) Web Services Discovery Utility
[Microsoft (R) .NET Framework, Version 1.0.3705.0]
Copyright (C) Microsoft Corporation 1998-2001. All rights reserved.
Disco found documents at the following URLs:
http://www.victim.com/service.asmx?wsdl
http://www.victim.com/service.asmx?disco
The following files hold the content found at the corresponding URLs:
   C:\output\service.wsdl <- http://www. victim.com/service.asmx?wsdl
   C:\output\service.disco <- http://www. victim.com/service.asmx?disco
The file C:\output\results.discomap holds links to each of these files.

在大部分情况下,未来的客户可能不知道.disco文件的确切地址,所以DISCO在vroot的默认页面中提供了线索。如果vroot的默认页面是一个HTML文档,可以使用LINK标记将客户重定向到.disco文件:


<HTML>
      <HEAD>
            <link type='text/xml'
            rel='alternate'
            href='math.disco'/>
</HEAD>
...
</HTML>

如果vroot的默认页面是一个XML文档,你可以使用XML样式单处理指令完成同样的工作:


<?xml-stylesheet type="text/xml" alternate="yes"
   href="math.disco"?>
...

虽然DISCO可能为更广泛接受的UDDI规范所取代,但是因为它是更简单、更轻量级的Web服务发布手段,许多开发人员无疑仍会采用它。加上在广泛部署的Microsoft技术中的可用性,DISCO或者类似的产品可能会成为恶意黑客寻求Web服务信息的优质目标。