作者:William Markito Oliveira 和 Fabio Mazanatti
为您的 Web 服务提供安全的环境
2012 年 3 月发布
当安全性至关重要时,Oracle Enterprise Gateway (OEG) 和 Oracle Web Services Manager (OWSM) 就成为了 SOA 计划的两个中心点。本文介绍如何将这些产品与 Oracle Service Bus (OSB) 集成,从而为 Web 服务提供安全的环境。虽然这些产品可以做更多的事情,但本文的重点是身份验证,这是在保护公开的服务时需要迫切关注的一个问题。
本文假设读者具备以下方面的知识:
您还将需要:
您可以使用 Oracle SOA Suite 的虚拟机(SOA Suite 和 BPM Suite 11g 的预构建虚拟机)来节省一些时间。在这种情况下,您必须安装 Oracle Enterprise Gateway 和 Oracle Service Bus,从而新建一个具有上述配置的 Service Bus 域。
如果您要配置一个全新的 Oracle SOA Suite 安装,请按照 Oracle SOA Suite 快速入门指南文档中的说明进行操作,然后根据说明安装 OSB 并配置一个新域。对于此步骤,您可以使用 Oracle Service Bus for Developers 选项(上面的屏幕截图),以便节省一些内存和 CPU(Developer 选项仅创建一个服务器,而不是一个管理服务器和一个托管服务器)。
Oracle Enterprise Gateway 旨在跨域边界保护 SOA 部署,更具体地说,保护通过广域网进行的 Web 服务调用。为此,它提供一种简单的方法来保护(进行身份验证、自我检测等)并加速 XML 和其他类型的数据。Oracle Enterprise Gateway 提供了与许多身份和访问管理平台(更具体地,Oracle 身份管理解决方案)的丰富集成。
安装 OEG 的过程非常简单:创建产品的安装文件夹并将安装文件解压缩到其中:
m@anakin:/oracle/$ mkdir oeg11.1.1.5 m@anakin:/oracle/$ cd oeg11.1.1.5 m@anakin:/oracle/oeg11.1.1.5$ unzip /tmp/ofm_oeg_linux_11.1.1.5.0_disk1_1of1.zip Archive: ofm_oeg_linux_11.1.1.5.0_disk1_1of1.zip creating: Linux/ creating: Linux/32bit/ inflating: Linux/32bit/Oracle_Enterprise_Gateway_11_1_1_5_0_Linux.i386.tar.gz inflating: Linux/32bit/Oracle_Enterprise_Gateway_11_1_1_5_0_Linux.i386_Policy_Center.tar.gz inflating: Linux/32bit/Oracle_Enterprise_Gateway_11_1_1_5_0_Linux.i386_Policy_Studio.tar.gz inflating: Linux/32bit/Oracle_Enterprise_Gateway_11_1_1_5_0_Linux.i386_Service_Explorer.tar.gz inflating: Linux/32bit/Oracle_Enterprise_Gateway_11_1_1_5_0_Linux.i386_Service_Monitor.tar.gz inflating: Linux/32bit/quickstart.txt inflating: Linux/32bit/readme.txt creating: Linux/64bit/ inflating: Linux/64bit/Oracle_Enterprise_Gateway_11_1_1_5_0_Linux.x86_64.tar.gz inflating: Linux/64bit/Oracle_Enterprise_Gateway_11_1_1_5_0_Linux.x86_64_Policy_Center.tar.gz inflating: Linux/64bit/Oracle_Enterprise_Gateway_11_1_1_5_0_Linux.x86_64_Policy_Studio.tar.gz inflating: Linux/64bit/Oracle_Enterprise_Gateway_11_1_1_5_0_Linux.x86_64_Service_Explorer.tar.gz inflating: Linux/64bit/Oracle_Enterprise_Gateway_11_1_1_5_0_Linux.x86_64_Service_Monitor.tar.gz inflating: Linux/64bit/quickstart.txt inflating: Linux/64bit/readme.txt
本文使用 Linux 64 位操作系统,因此我们要解压缩与其相关的文件:
m@anakin:/oracle/oeg11.1.1.5$ cd ./Linux/64bit/ m@anakin:/oracle/oeg11.1.1.5/Linux/64bit$ ls -h Oracle_Enterprise_Gateway_11_1_1_5_0_Linux.x86_64_Policy_Center.tar.gz Oracle_Enterprise_Gateway_11_1_1_5_0_Linux.x86_64_Policy_Studio.tar.gz Oracle_Enterprise_Gateway_11_1_1_5_0_Linux.x86_64_Service_Explorer.tar.gz Oracle_Enterprise_Gateway_11_1_1_5_0_Linux.x86_64_Service_Monitor.tar.gz Oracle_Enterprise_Gateway_11_1_1_5_0_Linux.x86_64.tar.gz quickstart.txt readme.txt m@anakin:/oracle/oeg11.1.1.5/Linux/64bit$ for a in `ls -1 *.tar.gz`; do tar -zxvf $a; done
最后一个命令在当前文件夹中解压缩所有模块,为每个模块创建一个子文件夹。通过以下命令查看最终结果:
m@anakin:/oracle/oeg11.1.1.5/Linux/64bit$ find -maxdepth 1 -type d
.
./oegpolicystudio
./oegpolicycenter
./oegservicemonitor
./oegserviceexplorer
./enterprisegateway
这样就完成了安装。
现在,您需要运行以下 OEG 组件:
因此,从终端发出相应的命令:
m@anakin:/oracle/oeg11.1.1.5/Linux/64bit$ ./enterprisegateway/posix/bin/enterprisegateway & m@anakin:/oracle/oeg11.1.1.5/Linux/64bit$ ./oegpolicystudio/policystudio & m@anakin:/oracle/oeg11.1.1.5/Linux/64bit$ ./oegserviceexplorer/serviceexplorer &
发出这些命令之后,您可以通过浏览器访问以下地址以到达 Enterprise Gateway 管理界面:http://localhost:8090/。系统将要求您提供用户名和口令,默认情况下它们分别为 admin/changeme。
通过对服务使用者和后端应用程序之间的交互进行连接、协调和管理,Oracle Service Bus 在集成架构中虚拟化服务,从而将复杂脆弱的架构转变为敏捷的集成网络。
如前所述,我们将使用一个启用了 OWSM Extension 和 Enterprise Manager 的 Bus 域:
如果您尚未进行这些工作,请启动您的 Service Bus 域并登录到 Service Bus Console (/sbconsole) 导入基本项目。
<cus:getCustomer xmlns:cus="http://customer.ws.examples.oracle.com/">
<arg0>1</arg0>
</cus:getCustomer>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Header xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> </soap:Header> <soapenv:Body> <cus:getCustomerResponse xmlns:cus="http://customer.ws.examples.oracle.com/"> <!--Optional:--> <return xmlns:cus="http://www.example.org/Customer"> <cus:id>1</cus:id> <cus:firstname>Customer1</cus:firstname> <cus:lastname>Lastname1</cus:lastname> <cus:address> <cus:street>One Streeth</cus:street> <cus:country>One Country</cus:country> <cus:city>One City</cus:city> </cus:address> </return> </cus:getCustomerResponse> </soapenv:Body> </soapenv:Envelope>
在此场景中,某公司正在使用一种 SOA 方法,已经部署了一些服务并在生产中使用它们,对这些服务的访问仅限于内部使用者,并且未实施安全要求。
运行 OSB 的 Weblogic 实例使用默认的内部安全提供程序(嵌入式 LDAP),因为只需要基本的管理控制台身份验证/授权。
我们上面创建的 Customer 服务是通过 Oracle Service Bus 公开的一个接口。因此,基本访问示意图如下所示:
但现在出现了新的要求:必须使用标准互联网链路向我们的合作伙伴公开其中一些服务。为了能够这么做,安全官员要求所有外部接口必须实施某种访问强制措施。既然我们谈到了这个话题,还有一个要求,那就是即使内部接口也必须对用户进行身份验证。因此,我们的内部客户端必须相应地更改其调用。由于我们谈论的是内联网内部的系统到系统访问,因此现在只需确保调用方是“已知系统”就足够了。这代表了一种常见的场景,通常称为“系统到系统身份验证”,其中每个系统都有安全原则。
最后一个细节:收到来自合作伙伴的请求时,必须在网络外围的 DMZ 中执行身份验证,从而筛选掉无效请求。我们要查询的用户存储与公司存储相隔离,以便说明如何执行凭证替换。在实际场景中,用户存储通常是统一的。
为了完成这一目标,我们将利用 Oracle Service Bus 与 OWSM(Oracle 融合中间件的默认安全解决方案)的紧密集成,并且使用 OEG 作为合作伙伴请求的外部代理:
我们将通过以下行动实现该业务场景:
OEG 不仅可以对请求进行身份验证,还可以完成诸多其他任务,包括筛选请求以防范已知威胁(如防范拒绝服务、SQL 注入,扫描附件查找病毒)和高级路由等。但是,这些特性不在本文的讨论范围内。
通过此步骤,我们将在 OEG 中注册 OSB 服务,从而确保 OSB 和 OEG 之间的连接有效,确保通过 OEG 公开服务。不过,这里我们不会附加任何安全策略。
本节描述在 OEG 中注册 Web 服务的基本步骤。有关更多信息,请查看官方文档。
假定 Service Bus 和 OEG 像先前说明的那样已启用并运行,完成以下步骤:
左侧面板包含了代表 OEG 功能的多个项。此时,我们只需在 Web Service Repository 中注册一个新服务。
在左侧面板的 Services 选项中,您会在 Default Services 下看到新建的 CustomerService 接口。在对其进行测试之前,我们需要将更改部署到 Enterprise Gateway 服务器。为此,单击右上角的 Deploy 图标或按下键盘上的 F6:
部署过程结束后,通过 Web 浏览器访问 http://localhost:8080/Customer/CustomerService?WSDL,并确认我们在 OSB 中具有的同一 WSDL 现已在 OEG 下公开。
现在,我们对刚刚通过 OEG 公开的服务进行测试。为此,我们要使用 OEG 的 Service Explorer。
Service Explorer 是一个 Web 服务测试客户端,用于生成发送到 Enterprise Gateway 并返回到 Service Explorer 的测试消息。Service Explorer 既支持基于 SOAP 的调用又支持基于 REST 的调用,包括对多种安全方案(传输或消息级别)的支持,能够生成压力测试并执行测试用例方案。
要调用服务,在 Service Explorer 中完成以下步骤:
<?xml version="1.0"?> <env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"> <env:Header /> <env:Body> <cus:getCustomer xmlns:cus="http://customer.ws.examples.oracle.com/"> <arg0>1</arg0> </cus:getCustomer> </env:Body> </env:Envelope>
至此,我们有了一个简单的 Web 服务,它在 OSB 中发布,并通过 OEG 公开,没有附加安全性。接下来的步骤将其添加到服务的两个接口 — 首先是由 Service Bus 公开的内部端点,然后是由 OEG 发布的公共端点。
注:作为替代方案,您可以让 Service Explorer 创建基于 WSDL 的请求设置。以下步骤描述了此过程:
通过 Oracle Web Services Manager,可以将声明式策略的定义和存储应用于 Web 服务,从而通过可配置的代理实施和监视安全策略、管理策略和审计策略。
Web 服务安全性有多个方面(身份验证、授权、机密性、完整性),每个方面都有自己的标准,它们可以定义为服务策略,或者仅定义为普通策略。对于此业务场景,我们将使用简单的 WS-Security 用户名/令牌策略来强制只允许我们的系统知道的用户能够执行服务端点。为此,我们将使用 Weblogic 域中的默认用户。
有关如何使用不同领域或者配置 LDAP 或其他身份验证提供程序的更多详细信息,请查看本文结尾处的参考资料。
为了将 OWSM 策略应用于我们的 CustomerService,在 OSB 控制台中执行以下步骤:
<?xml version="1.0"?> <env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"> <env:Header> <wsse:Security xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-
secext-1.0.xsd" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-
1.0.xsd"> <wsse:UsernameToken> <Username>weblogic</Username> <Password>welcome1</Password> </wsse:UsernameToken> </wsse:Security> </env:Header> <env:Body> <cus:getCustomer xmlns:cus="http://customer.ws.examples.oracle.com/"> <arg0>1</arg0> </cus:getCustomer> </env:Body> </env:Envelope>
[OSB Security - OWSM:387253]Failed to initialize Owsm Credential Manager. Please validate the Keystore Configuration.……继续阅读这一节以配置 OWSM 密钥库。
上面显示的错误消息表明您没有为此 OWSM/Weblogic 域配置密钥库。您可以通过 Java keytool 命令行应用程序完成这一任务,但我们要向您展示一种很好的替代方法,那就是使用 OEG 的 Service Explorer 创建新的密钥库和证书。在这个 GUI 中,您可以打开现有的密钥库以查看、添加和更改其条目。
使用 Service Explorer,执行以下步骤:
现在,我们有了一个正确配置的密钥库,但我们还必须在 Weblogic 中配置它,或者更准确地说,在 Web Services Manager 的 Security Provider 中配置它。此密钥库用于存储 Weblogic 域中 SOAP 消息的公钥和私钥。
服务器启动过程结束之后,必须创建凭证以便 Service Bus Test Console 用于验证我们的配置:
既然我们已配置了密钥库和凭证,便可以登录到 sbconsole 并再次使用 Service Bus Test Console 测试 CustomerService。有效载荷与先前相同:
<?xml version="1.0"?> <env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"> <env:Header /> <env:Body> <cus:getCustomer xmlns:cus="http://customer.ws.examples.oracle.com/"> <arg0>1</arg0> </cus:getCustomer> </env:Body> </env:Envelope>
由于我们已经创建了 basic.credentials 密钥,因此在使用 Test Console 时不需要传递任何安全信息 — 这是自动执行的。如图 24 所示,Security 部分默认引用我们刚刚创建的密钥。
响应现在将显示预期的业务数据。
现在,我们需要从 Service Explorer 调用 OSB 中受保护的服务。让我们了解一下工具,看看将安全令牌添加到服务调用是多么简单。
现在,我们可以继续进行。按绿色箭头 (execute) 按钮,您将看到 Service Bus/OWSM 授权的请求输出在 Weblogic 中运行。
注:为简单起见,我们使用 weblogic 用户。在实际场景中,请考虑使用 LDAP 信息库、数据库、Oracle Access Manager 或类似的身份管理产品。
在下一节中,我们将配置 OEG 以使用自定义策略自动将这些身份验证凭证添加到服务请求。此策略将允许 OEG 调用 OSB 保护的一个端点。
我们在 OEG 中创建的策略并不知道 Service Bus 公开的 WSDL 现在需要 WS-Security 令牌。下面图 27a 显示了 Oracle Enterprise Gateway 公开的 WSDL,而图 27b 显示了 Oracle Service Bus 公开的 WSDL,并突出显示了新的 WS-Security 策略。
因此,我们现在需要更新服务策略以便在每个请求中发送用户/口令头。这样,通过 OEG 的调用将按预期运行。
再次启动 Service Explorer,但这次尝试在没有安全头的情况下执行 — 只需从有效载荷中删除整个 Header 标签。记住将请求端点修改为 http://localhost:8080/Customer/CustomerService,因为我们在上一节中为了直接调用 Service Bus 而对其进行了更改。
服务调用将通过 OEG,策略将插入 Service Bus 需要的用户/口令凭证。成功进行身份验证之后,服务将执行该请求。
至此,我们在 OWSM 和 OSB 中公开的服务将检查凭证,OEG 将让固定的系统用户通过。为了完全实现业务场景,我们必须做的最后一件事情是指示 OEG 请求凭证,根据单独的用户存储检查这些凭证,如果验证成功,则删除收到的凭证并执行我们已编码的过程(插入内部凭证并调用服务提供程序)。
如前所述,我们采用了 OEG 内部存储以使本文内容尽可能简单。在实际架构中,OEG 可以与不同的凭证提供程序(如 Oracle Access Manager 或 LDAP 服务器)集成以提供更好的解决方案,从而在您网络外部的安全外围 (DMZ) 中提供身份验证或授权。
首先,我们要将一个新用户添加到 OEG 的本地存储:
现在,我们须更新 OEG 策略以针对其内部用户存储执行身份验证:
返回 Service Explorer,如果您尝试原样执行该服务(指向 OEG 而没有任何安全信息),则会收到 fault:MessageBlocked 错误,因为 OEG 现在要求您传递有效的凭证集:
<?xml version="1.0"?> <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"> <env:Header /> <env:Body> <env:Fault> <env:Code> <env:Value>env:Receiver</env:Value> <env:Subcode> <env:Value xmlns:fault="http://www.vordel.com/soapfaults"> fault:MessageBlocked </env:Value> </env:Subcode> </env:Code> <env:Reason /> <env:Detail xmlns:fault="http://www.vordel.com/soapfaults" fault:type="faultDetails" /> </env:Fault> </env:Body> </env:Envelope>
现在,插入新的用户令牌,为此单击 Security Tokens,选择 WS-Security Username 并填写各个域,如下所示(口令为 oracle):
执行请求,您将获得预期的业务响应。
注:Service Explorer 生成的安全头包含一个具有时间戳的 Created 标签。OEG 检查此信息以确保在我们设置的 Validity Period(5 分钟)所确定的期限内发出请求。如果您删除此标签,或者在执行请求时,创建令牌和实际调用之间的时间间隔大于 5 分钟,则将收到 fault:MessageBlocked SOAP 错误,这样可以阻止可能的重放攻击。有关更多详细信息,请查看参考资料。
如果您要避免 capture-replay 威胁(查看“参考资料”一节了解详细信息),则必须组合使用 Nonce (Number Once) 和 SHA1 Digest 特性 — 这样,如果有人嗅探到您的请求并试图篡改它,则 OEG 将不会确认假的请求,从而保护您的环境。
至此,我们完全实现了建议的场景。
注:Oracle Enterprise Gateway 有两个重要的监视组件 — Traffic Monitor 和 Real Time monitoring,可以通过产品的管理界面 (http://localhost:8090) 访问。Traffic Monitor 提供有关 OEG 处理的 HTTP 和 HTTPS 流量的基于 Web 的消息日志,对于故障排除非常有用。Real Time monitoring 显示使用情况统计信息,并显示有关请求状态、SLA 违反消息、远程主机访问等的图形信息。
Oracle Service Bus 和 Oracle Web Services Manager 是很好的 Web 服务安全性解决方案,但 Oracle Enterprise Gateway 更上一层楼,提供了独特的功能以及更高级的 Web 服务策略开发方法。而且,在 DMZ 中使用 Oracle Enterprise Gateway 是一种战略决策,可阻止对您的内部网络(内联网)的未授权访问,减轻 Oracle Service Bus 或任何其他后端服务上的流量负担。在本文中,我们了解了简单的安全性解决方案,但 Enterprise Gateway 还提供限流、缓存、SSL 终止、SAML 令牌复制、XML 威胁防范(SQL 注入、病毒检查)、更快的 XML/XLST 分析等功能。
Oracle Enterprise Gateway、Oracle Service Bus 和 Oracle Web Services Manager 共同提供了一个完整的 Web 服务安全性套件,从而提供性能、可伸缩性以及与开放标准的互操作性。
William Markito Oliveira
是位于巴西的 Oracle 平台技术解决方案团队的资深技术专家,他致力于中间件、SOA 和 Java 技术。他还是官方《Java EE 教程》的撰稿人,提供有关 CDI、EJB 3.1 和 JAX-RS 的评论和代码示例。William 在软件开发、咨询和架构方面拥有 10 多年的经验。
Fabio Mazanatti
是位于巴西的 Oracle 咨询团队的首席顾问,他为寻求采用 SOA 的大型公司提供支持。他担任顾问已有 20 多年时间,其间广泛涉足各种技术领域。