Oracle Enterprise Gateway:与 Oracle Service Bus 和 Oracle Web Services Manager 集成

作者:William Markito Oliveira 和 Fabio Mazanatti

为您的 Web 服务提供安全的环境

2012 年 3 月发布


概要

当安全性至关重要时,Oracle Enterprise Gateway (OEG)Oracle Web Services Manager (OWSM) 就成为了 SOA 计划的两个中心点。本文介绍如何将这些产品与 Oracle Service Bus (OSB) 集成,从而为 Web 服务提供安全的环境。虽然这些产品可以做更多的事情,但本文的重点是身份验证,这是在保护公开的服务时需要迫切关注的一个问题。

要求


本文假设读者具备以下方面的知识:

  • Java 和 Web 服务
  • Oracle Service Bus 基本知识
  • Oracle WebLogic Server 基本管理

您还将需要:

  • 一个已启用和运行 OWSM Extension 和 Enterprise Manager 的 Oracle Service Bus 域:

图 00

您可以使用 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


简介

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 组件:

  • Enterprise Gateway
  • Policy Studio
  • Service Explorer

因此,从终端发出相应的命令:


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。


图 1
图 1 — Oracle Enterprise Gateway — 管理界面

Oracle Service Bus

通过对服务使用者和后端应用程序之间的交互进行连接、协调和管理,Oracle Service Bus 在集成架构中虚拟化服务,从而将复杂脆弱的架构转变为敏捷的集成网络。

配置

如前所述,我们将使用一个启用了 OWSM Extension 和 Enterprise Manager 的 Bus 域:


图 2
图 2 — Oracle Service Bus — 域要求

如果您尚未进行这些工作,请启动您的 Service Bus 域并登录到 Service Bus Console (/sbconsole) 导入基本项目。

  1. 将 jar 文件 sbconfig-Customer-INIT.jar 下载到一个本地文件夹。
  2. 在 Service Bus 控制台上,导航到 System Administration
  3. 单击左上角的 Create 启动一个新的更改会话。
  4. Import Resources 下,选择下载的文件并单击 Next>>。随即显示资源列表。单击 Import,随即显示确认:

图 3
图 3 — Oracle Service Bus — 资源导入

  1. 激活会话。
  2. 浏览到 Project Explorer,在 Projects 下展开 Customer 项目。
  3. 现在,我们单击 Launch Test Console 执行快速检查以确保服务已启用并运行:

图 4
图 4 — Oracle Service Bus — 执行代理服务

  1. 在 Test Console 的 Payload 域中,粘贴以下内容:

<cus:getCustomer xmlns:cus="http://customer.ws.examples.oracle.com/">
   <arg0>1</arg0>
</cus:getCustomer>

  1. 其他属性保留默认值。单击 Execute。预期的结果如下:

<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 公开的一个接口。因此,基本访问示意图如下所示:


[FILENAME]
图 5 — 业务场景

但现在出现了新的要求:必须使用标准互联网链路向我们的合作伙伴公开其中一些服务。为了能够这么做,安全官员要求所有外部接口必须实施某种访问强制措施。既然我们谈到了这个话题,还有一个要求,那就是即使内部接口也必须对用户进行身份验证。因此,我们的内部客户端必须相应地更改其调用。由于我们谈论的是内联网内部的系统到系统访问,因此现在只需确保调用方是“已知系统”就足够了。这代表了一种常见的场景,通常称为“系统到系统身份验证”,其中每个系统都有安全原则。

最后一个细节:收到来自合作伙伴的请求时,必须在网络外围的 DMZ 中执行身份验证,从而筛选掉无效请求。我们要查询的用户存储与公司存储相隔离,以便说明如何执行凭证替换。在实际场景中,用户存储通常是统一的。

为了完成这一目标,我们将利用 Oracle Service Bus 与 OWSM(Oracle 融合中间件的默认安全解决方案)的紧密集成,并且使用 OEG 作为合作伙伴请求的外部代理:


图 6
图 6 — 解决方案架构

我们将通过以下行动实现该业务场景:

  1. 通过 Oracle Enterprise Gateway 公开当前的 Customer 服务,原样公开该服务而不实施安全防护
  2. 将 OWSM 策略附加到 Service Bus 端点
  3. 在 Oracle Enterprise Gateway 中创建自定义策略以应对 OWSM 的策略
  4. 将用户身份验证添加到 OEG 的公开接口

OEG 不仅可以对请求进行身份验证,还可以完成诸多其他任务,包括筛选请求以防范已知威胁(如防范拒绝服务、SQL 注入,扫描附件查找病毒)和高级路由等。但是,这些特性不在本文的讨论范围内。

在 Oracle Enterprise Gateway 中注册 Web 服务

通过此步骤,我们将在 OEG 中注册 OSB 服务,从而确保 OSB 和 OEG 之间的连接有效,确保通过 OEG 公开服务。不过,这里我们不会附加任何安全策略。

本节描述在 OEG 中注册 Web 服务的基本步骤。有关更多信息,请查看官方文档

假定 Service Bus 和 OEG 像先前说明的那样已启用并运行,完成以下步骤:

  1. 转到 Policy Studio 应用程序
  2. 单击 Enterprise Gateway - localhost
  3. Open Connection 窗口中,单击 OK
  4. 随即显示 OEG Dashboard。单击 Edit Active Configuration,然后单击 OK,保留 Passphrase 域为空。随即显示选定 OEG 实例的配置视图:

图 7
图 7 — Enterprise Gateway 实例配置

左侧面板包含了代表 OEG 功能的多个项。此时,我们只需在 Web Service Repository 中注册一个新服务。

  1. 单击左侧面板中的 Policies
  2. 展开 Web Service Repository

图 8
图 8 — Web Service Repository

  1. 右键单击 Web Services,选择 Register a Web Service。随即显示 Import WSDL 窗口
  2. 选择 WSDL URL 并粘贴以下 URL:http://localhost:7001/Customer/CustomerService?WSDL(更改端口号以反映您的安装)
  3. 单击 Next,选择 getCustomer 操作。单击 Next,然后再次单击 Next
  4. 选择 Default Services 设置公开 Web 服务的位置:

图 9
图 9 — Enterprise Gateway — 服务部署

  1. 单击 Finish,然后在下一个屏幕中单击 OK。(我们没有立即为此服务设置安全性,因此 OEG 将仅作为 Service Bus 端点的代理)
  2. 随即显示 Summary 屏幕。确保选中 WSDL Access Option(如下面图 10 所示,此为屏幕截图),否则 OEG 无法将服务的 WSDL 公开到客户端(可以使用此策略增强服务安全性,作为治理工作的一部分):

图 10
图 10 — Enterprise Gateway — 服务部署汇总

在左侧面板的 Services 选项中,您会在 Default Services 下看到新建的 CustomerService 接口。在对其进行测试之前,我们需要将更改部署到 Enterprise Gateway 服务器。为此,单击右上角的 Deploy 图标或按下键盘上的 F6


图 11
图 11 — Enterprise Gateway — 部署图标

部署过程结束后,通过 Web 浏览器访问 http://localhost:8080/Customer/CustomerService?WSDL,并确认我们在 OSB 中具有的同一 WSDL 现已在 OEG 下公开。

使用 Service Explorer 调用 Web 服务

现在,我们对刚刚通过 OEG 公开的服务进行测试。为此,我们要使用 OEG 的 Service Explorer。

Service Explorer 是一个 Web 服务测试客户端,用于生成发送到 Enterprise Gateway 并返回到 Service Explorer 的测试消息。Service Explorer 既支持基于 SOAP 的调用又支持基于 REST 的调用,包括对多种安全方案(传输或消息级别)的支持,能够生成压力测试并执行测试用例方案。

要调用服务,在 Service Explorer 中完成以下步骤:

  1. 单击绿色箭头 (execute) 按钮右侧的指针图标,选择 Request Settings...

图 12
图 12 — Service Explorer

  1. request settings 窗口中,单击 Add Request 按钮,粘贴在 OEG 中注册的服务的 URL (http://localhost:8080/Customer/CustomerService)。取消选中 Request name matches URL,输入 CustomerService 作为 Request Name,然后单击 OK
  2. 复制以下文本并将其粘贴到 Body Content 框中:
<?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>

  1. 可以选择输入该服务的 WSDL 位置:http://localhost:8080/Customer/CustomerService?WSDL
  2. 以下是该请求的最终配置:

图 13
图 13 — Service Explorer — Request Settings

  1. 单击 Run。随即关闭窗口。来自 Oracle Service Bus 测试客户端的响应随即在主窗口的 Response 域中显示(图 14)。

图 14
图 14 — Service Explorer — 调用没有安全性设置的 Web 服务

至此,我们有了一个简单的 Web 服务,它在 OSB 中发布,并通过 OEG 公开,没有附加安全性。接下来的步骤将其添加到服务的两个接口 — 首先是由 Service Bus 公开的内部端点,然后是由 OEG 发布的公共端点。

注:作为替代方案,您可以让 Service Explorer 创建基于 WSDL 的请求设置。以下步骤描述了此过程:

  1. 在 Service Explorer 运行的情况下,单击 File 并选择 Import WSDL

图 15图 15 — Service Explorer — Import WSDL

  1. 选择 WSDL URL 选项并粘贴端点 URL,如下所示:

图 16
图 16 — Service Explorer — 加载 WSDL 位置

  1. 单击 Next,选中相应的复选框以选择会生成该请求的操作。

图 17
图 17 — Service Explorer — Select WSDL Operations

  1. 单击 Finish 生成请求。

通过 Oracle Web Services Manager 向 Oracle Service Bus 添加安全性

通过 Oracle Web Services Manager,可以将声明式策略的定义和存储应用于 Web 服务,从而通过可配置的代理实施和监视安全策略、管理策略和审计策略。

Web 服务安全性有多个方面(身份验证、授权、机密性、完整性),每个方面都有自己的标准,它们可以定义为服务策略,或者仅定义为普通策略。对于此业务场景,我们将使用简单的 WS-Security 用户名/令牌策略来强制只允许我们的系统知道的用户能够执行服务端点。为此,我们将使用 Weblogic 域中的默认用户。

有关如何使用不同领域或者配置 LDAP 或其他身份验证提供程序的更多详细信息,请查看本文结尾处的参考资料。

为了将 OWSM 策略应用于我们的 CustomerService,在 OSB 控制台中执行以下步骤:

  1. 在左侧功能区中,选择 Project Explorer 并单击 Customer 项目
  2. 单击 CustomerService 代理名称并加载 Policies 选项卡
  3. Change Center 框(左上角)中单击 Create,创建一个新的更改会话
  4. 选择 From OWSM Policy Store 并单击 Add
  5. Select OWSM Policy 窗口中,搜索 oracle/wss_username_token_service_policy(通常在第 2 页中找到)并选择它:

图 18
图 18 — Service Bus — Policy Explorer

  1. 单击 Update。不要忘记此步骤,否则 Service Bus 不会应用该策略
  2. 在 Change Center 中激活该会话
  3. 现在尝试使用 Service Bus 测试客户端通过下面的负载执行该服务。此负载与前面步骤中的负载相同,只是添加了 WS-Security 头。记住更改 usernamepassword 域以反映您的域管理员用户的凭证:

<?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>

  1. 如果您收到以下错误消息……

    [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,执行以下步骤:

  1. 在顶部菜单中,选择 Security View Certificates
  2. 在弹出窗口中,单击 Create/Import 按钮。在此,您可以创建证书、对证书进行签名以及导入或导出密钥对:

图 19
图 19 — Enterprise Gateway — 配置证书和密钥

  1. 首先,我们来编辑 Subject 域。单击 Edit...,填写信息,如下面的图 20 所示。然后单击 OK

图 20
图 20 — 编辑证书信息

  1. Alias Name 域中,键入 test
  2. 单击 Sign Certificate...。在自签名确认中单击 Yes,并单击 Yes 生成密钥对。然后单击 OK 关闭 Configure Certificate 窗口。新的证书是列表中的最后一个条目
  3. 现在单击 Keystore,然后单击 New keystore。随即提示您选择密钥库的保存位置。选择 Weblogic Server 有权访问的一个文件夹,并记下此路径 — 稍后将需要此信息。对于文件名,键入 test.jks
  4. 随即打开密钥库口令窗口。任意键入一个要用于密钥库的口令。(在本文中,我们将使用 oracle。)
  5. 现在,让我们将密钥对添加到这个全新的密钥库。单击 Add to keystore,选择刚刚创建的密钥,然后单击 OK
  6. 输入用于此别名的口令。我们将再次使用 oracle。您应该看到别名在密钥库下列出,如图 21 所示。

图 21
图 21 — Enterprise Gateway — Keystore 视图

  1. 关闭 KeystoreSelect Certificate 窗口,但保留 Service Explorer 运行。

现在,我们有了一个正确配置的密钥库,但我们还必须在 Weblogic 中配置它,或者更准确地说,在 Web Services Manager 的 Security Provider 中配置它。此密钥库用于存储 Weblogic 域中 SOAP 消息的公钥和私钥。

  1. 打开 Enterprise Manager 控制台 (http://localhost:7001/em)
  2. 在导航器窗格下,展开 Weblogic Domain,右键单击您的域名,选择 Security,然后选择 Security Provider Configuration(参见图 22)。

图 22
图 22 — Enterprise Manager — Security Provider Configuration

  1. 单击 + 号展开页面的 Keystore 部分,然后单击 Configure 按钮
  2. Keystore Configuration 页面中,填写以下域,如下所示:
    1. Keystore path/location/of/your/test.jks [您在上面第 6 步中选择的路径/文件名]
    2. Passwordoracle [或者您在第 7 步中选择的口令]
    3. Confirm Passwordoracle
    4. Key Aliastest [或者您在第 4 步中输入的别名]
    5. Signature Passwordoracle [或者您在第 9 步中选择的口令]
    6. Confirm Passwordoracle
    7. Crypt Aliastest [或者您喜欢的任何其他名称]
    8. Crypt Passwordoracle [或者您喜欢的其他口令]
    9. Confirm Password:重复该口令
  3. 单击 OK 确认您的更改
  4. 重新启动您的 Weblogic 域。

服务器启动过程结束之后,必须创建凭证以便 Service Bus Test Console 用于验证我们的配置:

  1. 打开 Enterprise Manager 控制台 (http://localhost:7001/em)
  2. 在导航器窗格下,展开 Weblogic Domain,右键单击您的域名,选择 Security,然后选择 Credentials
  3. 单击 Create Key 并输入以下内容:
    1. Keybasic.credentials
    2. User Nameweblogic(更改它以反映您的环境 — 必须是有效用户)
    3. Passwordwelcome1(更改它以反映您的环境)
    4. Confirm Password:与上面相同(参见图 23)

[文件名]
图 23 — Enterprise Manager — 密钥配置

  1. 单击 OK

既然我们已配置了密钥库和凭证,便可以登录到 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 部分默认引用我们刚刚创建的密钥。


图 24
图 24 — Service Bus — Test Console 和安全设置

响应现在将显示预期的业务数据。

更改 Service Explorer 以通过安全令牌调用 OSB

现在,我们需要从 Service Explorer 调用 OSB 中受保护的服务。让我们了解一下工具,看看将安全令牌添加到服务调用是多么简单。

  1. 我们需要更改先前创建的服务请求,因此转到 Service Explorer 的窗口并单击绿色箭头 (execute) 按钮右侧的指针图标,然后选择 Request Settings...
  2. 在左侧面板中选择 CustomerService 条目。通过替换 URL 域值修改此条目的 URL,以便直接联系 Service Bus 而不是 OEG:
    1. 将:http://localhost:8080/Customer/CustomerService
    2. 替换为:http://localhost:7001/Customer/CustomerService
  3. 如果您先前输入了 WSDL,则相应地进行调整。配置应该与图 25 中的信息相符。

图 25
图 25 — Service Explorer — 调整请求设置

  1. 单击 Close
  2. 在主菜单中,依次选择 SecurityInsert WS-Security Username Token,并更改以下域:
    1. User nameweblogic
    2. Include Nonce取消选中
    3. Include Password选中
    4. Passwordwelcome1(必须选择 Password 选项,而不是 Wildcard
    5. Cleartext选中
    6. 单击 Finish

图 26
图 26 — Service Explorer — 插入 WS-Security 用户名和令牌

现在,我们可以继续进行。按绿色箭头 (execute) 按钮,您将看到 Service Bus/OWSM 授权的请求输出在 Weblogic 中运行。

注:为简单起见,我们使用 weblogic 用户。在实际场景中,请考虑使用 LDAP 信息库、数据库、Oracle Access Manager 或类似的身份管理产品。

在下一节中,我们将配置 OEG 以使用自定义策略自动将这些身份验证凭证添加到服务请求。此策略将允许 OEG 调用 OSB 保护的一个端点。

创建 OEG 自定义策略以进行系统身份验证

我们在 OEG 中创建的策略并不知道 Service Bus 公开的 WSDL 现在需要 WS-Security 令牌。下面图 27a 显示了 Oracle Enterprise Gateway 公开的 WSDL,而图 27b 显示了 Oracle Service Bus 公开的 WSDL,并突出显示了新的 WS-Security 策略。


图 27a
图 27a — Oracle Enterprise Gateway WSDL

图 27b
图 27b — Oracle Service Bus WSDL

因此,我们现在需要更新服务策略以便在每个请求中发送用户/口令头。这样,通过 OEG 的调用将按预期运行。

  1. 打开 Policy Studio
  2. 单击左侧面板中的 Policies 条目。依次展开 Generated CircuitsWeb Services.CustomerService/Customer/CustomerService,单击 Service Handler for 'CustomerService'

图 28
图 28 — Policy Studio — CustomerService 的服务处理程序

  1. 现在,您打开了策略编辑器,其右侧有几个按类别分组的筛选器。在筛选器域(在筛选器列表的顶部)中输入 token,然后单击 Authentication 组并选择 Insert WS-Security Username Token 操作:

图 29
图 29 — 策略编辑器和筛选器

  1. 现在,将 Insert WS-Security Username Token 操作拖放到编辑器的蓝色区域中。
  2. 随即弹出一个配置窗口。使用以下信息(与在上一节第 4 步中使用的信息相同)填写各个域:
    1. User nameweblogic
    2. Include Nonce取消选中
    3. Include Password选中
    4. Passwordwelcome1(必须选择 Password 选项,而不是 Wildcard
    5. Cleartext选中
    6. 单击 Finish
  3. 右键单击在画布中创建的 Insert WS-Security Username Token 节点并选择 Set as Start
  4. 单击操作面板中的 Success Path(绿色箭头)并连接 Insert WS-Security Username Token 节点与 Service Handler for 'CustomerService'(在每个节点上单击一次):

图 30
图 30 — Policy Studio — 具有用户名和令牌策略的 CustomerService

  1. 现在您可以部署更改了。单击 Deploy 图标(右上角)或按下键盘上的 F6 键。

再次启动 Service Explorer,但这次尝试在没有安全头的情况下执行 — 只需从有效载荷中删除整个 Header 标签。记住将请求端点修改为 http://localhost:8080/Customer/CustomerService,因为我们在上一节中为了直接调用 Service Bus 而对其进行了更改。

服务调用将通过 OEG,策略将插入 Service Bus 需要的用户/口令凭证。成功进行身份验证之后,服务将执行该请求。

在 OEG 中添加用户身份验证

至此,我们在 OWSM 和 OSB 中公开的服务将检查凭证,OEG 将让固定的系统用户通过。为了完全实现业务场景,我们必须做的最后一件事情是指示 OEG 请求凭证,根据单独的用户存储检查这些凭证,如果验证成功,则删除收到的凭证并执行我们已编码的过程(插入内部凭证并调用服务提供程序)。

如前所述,我们采用了 OEG 内部存储以使本文内容尽可能简单。在实际架构中,OEG 可以与不同的凭证提供程序(如 Oracle Access Manager 或 LDAP 服务器)集成以提供更好的解决方案,从而在您网络外部的安全外围 (DMZ) 中提供身份验证或授权。

首先,我们要将一个新用户添加到 OEG 的本地存储:

  1. 在 Policy Studio 中,单击左侧面板中的 Users
  2. 在树视图(左上方)中,单击 Users(在 User Store 内部)显示现有用户列表
  3. 单击用户列表右侧的 Add,填写新用户的信息:
    1. UserJakobsPetStore
    2. Passwordoracle

图 31
图 31 — Policy Studio — 用户管理

现在,我们须更新 OEG 策略以针对其内部用户存储执行身份验证:

  1. 单击左侧面板中的 Policies 项,然后依次展开 Generated CircuitsWeb Services.CustomerService/Customer/CustomerService,之后单击 Service Handler for 'CustomerService'
  2. Filters 列表(右侧)中,展开 Authentication 并将 WS-Security Username Token 拖放到编辑器中
  3. 在筛选器配置窗口中,执行以下操作:
    1. Name 更改为 Authenticate User
    2. Drift 设置为 5 秒钟
    3. Validity Period 设置为 5 分钟
    4. 取消选中 Nonce Required
    5. 选择 Verify username and password
    6. 选择 Clear password required
    7. Repository Name 中,选择 Local User Store
    8. 在 Advanced 部分下,选中 Remove enclosing WS-Security element on successful validation(否则,会将错误的安全凭证发给 Service Bus):

      图 32
      图 32 — Policy Studio — WS-Security 用户名和令牌策略设置
    9. 单击 Finish
  4. 右键单击并选择 Set as Start,将 Authenticate User 设置为策略的起始筛选器
  5. 创建成功路径(绿色箭头),从而将 Authenticate User 连接到 Insert WS-Security Username Token

    图 33
    图 33 — Policy Studio — CustomerService 完整自定义策略
  6. 部署新的策略(单击部署图标或按下 F6)。

返回 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):


图 34
图 34 — Service Explorer — 插入 WS-Security 用户名和令牌

执行请求,您将获得预期的业务响应。

注: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 违反消息、远程主机访问等的图形信息。


图 35
图 35 — Oracle Enterprise Gateway — Traffic Monitor


图 36
图 36 — Oracle Enterprise Gateway — Real Time Monitoring

总结

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 LinkedIn 是位于巴西的 Oracle 平台技术解决方案团队的资深技术专家,他致力于中间件、SOA 和 Java 技术。他还是官方《Java EE 教程》的撰稿人,提供有关 CDI、EJB 3.1 和 JAX-RS 的评论和代码示例。William 在软件开发、咨询和架构方面拥有 10 多年的经验。

Fabio Mazanatti LinkedIn 是位于巴西的 Oracle 咨询团队的首席顾问,他为寻求采用 SOA 的大型公司提供支持。他担任顾问已有 20 多年时间,其间广泛涉足各种技术领域。