IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope:Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  Grid computing  >

GT4 安全性简介

Grid Security Infrastructure,Globus Toolkit 4 中的安全组件

developerWorks
文档选项

未显示需要 JavaScript 的文档选项

讨论


级别: 初级

Babu Sundaram (babu@cs.uh.edu), 网格专家

2005 年 6 月 30 日

在本文中,将了解有关 Globus Toolkit 4(GT4)中安全组件 GSI(Grid Security Infrastructure)的信息。本文将概括性地介绍 GSI 的基本设计和架构,GSI 允许网格实体在开放网络上进行身份验证、授权和安全通信。本文将使用一个简单的网格服务作为例子,介绍如何构建、配置和使用 GSI 进行身份验证和安全连接。

什么是 GSI?

在任何网络环境中,安全性都是一个非常重要的问题。您必须保护自己免受外部的威胁。这种需要对于网格环境来说尤其重要,因为在网格环境中,客户机可以位于不同的地理空间和组织中,而 GT4 可以满足这种需求。任何网格对于安全性都有一些基本的要求,这些要求包括但不仅仅局限于以下几点:

  • 保证网格实体之间的通信是安全的、可以防止篡改的,这些网格实体包括用户、资源和程序。
  • 网格用户在多个资源之间使用单点登录的能力。
  • 从一个实体到另外一个实体的权限委托,用于类似代理的操作。
  • 参与组织中安全机制方面的互操作性。

GSI 是 GT4 的一个组件,用于解决所有这些需求,能为网格通信提供保密性、完整性和回放保护(为了防止监听和中间人攻击),并为网格用户提供单点登录和权限委托的能力。它还包括一些用来对网格实体的身份进行验证的工具,并基于这些工具来确定允许该实体执行哪些操作(授权)。





回页首


GSI 的功能和架构

为获得网格安全,GSI 既提供了资源端工具,又提供了客户端工具。在资源端,GSI 工具包括用来识别资源的 X.509 证书。(请参阅 参考资料,获得有关 X.509 的更多信息,并根据经过身份验证的客户机的行为来产生进程的工具。)

客户端工具包括用来创建临时证书(称为 代理(proxy))的工具,以及用来执行单点登录和权限委托的工具。客户机与目标资源使用上面介绍的证书相互进行身份验证,并在第一次握手之后,建立一个安全的加密通信通道,该通道类似于支持安全传输 HTTPS 和 Secure Shell(SSH)的传输层安全协议(TLS)中涉及的通道。(请参阅 参考资料,获得有关 TLS 的更多信息。)

另外,客户机可以选择将自己的证书委托给资源,让后续的资源访问得以继续,而不用再进行任何干涉。资源利用网格映像文件将目前的证书与一个本地用户帐号关联在一起。然后,它可以使用这个本地帐号的权限派生一些进程。另外,它可以利用诸如 CAS(Community Authorization Service)之类的工具进行更细粒度的身份验证操作。由于 GT4 消息是基于 SOAP(Simple Object Access Protocol)的,因此您也可以启用消息级的安全性来为这些消息提供保护,并确保这些消息的完整性。

GSI 使用 Web service 社区中的各种标准和规范实现了一系列的标准,从而提供刚才介绍的基本安全性需要。GT4 安全性由基于 Web service 和非 Web Service 的元素组成,它们一起实现了网格的安全性。从传统上说,GSI 所有的功能都是基于公钥加密(也称为不对称密钥加密)的。它使用了 X.509 终端实体证书(EEC)来建立持久性的实体身份,例如用户和资源。它引入了 X.509 代理证书的概念,它可以支持委托,并为临时和短期存在的实体建立身份。GSI 认为这两种证书是相同的。GSI 可以利用 SSL(Secure Sockets Layer)在网格实体之间实现安全的通信。

在 GT4 中,GSI 可以同时支持传输层的安全性和消息级的安全性。在 GSI 中,传输层的安全实现可以在网格实体之间使用 TLS 和 X509 证书进行身份验证。消息级的安全性实现了对 WS-Security 和 WS-SecureConversation 规范的支持。通过使用这种安全性,您可以在每个消息的级别上为 SOAP 消息提供安全保护。

在 GT4 中,传输层的安全性被设置为默认设置,这是为了提高性能才这样考虑的。随着消息级安全性的性能的提高,这种方式将会得到抑制,但是在最近可能还达不到。

现在我们已经讨论了 GT4 背后的一些原因,接下来就让我们来建立、配置和安装一个 GSI。这个过程中主要的步骤包括:

  1. 安装 GSI 和 GT4。
  2. 生成证书请求,并获取经过签名的证书。
  3. 安全配置,以及使用网格映射文件进行权限映射。




回页首


GSI 和 GT4 的核心安装

没必要依照本文中的步骤来下载和安装 GT4 Toolkit,但是为了设置并运行例子,请从以下地址下载 GT4 Toolkit: http://www-unix.globus.org/toolkit/survey/index.php?download=gt4.0.0-all-source-installer.tar.gz。我们需要完整的安装程序,而不是 WS Core,这是因为我们需要 GSI 组件。

解压 .tar 文件,并按照下面的指令从源代码开始编译并安装 GT4 Toolkit。选择一个安装目录,例如 /home/globus/gt-4.0.0,并将 GLOBUS_LOCATION 环境变量的值设置为这个目录的名字。设置 GT4 的步骤如下:

  1. 使用任何非特权的帐号来执行下面介绍的步骤。另外,可以创建一个单独的 globus 帐号来执行管理任务,例如安装、启动并停止存放 GT4 服务的容器等。
  2. 创建 GT4 安装目录,此处我们称之为 GLOBUS_LOCATION。
  3. 我们需要一个可以工作的 Java™ 和 Ant 编译工具来编译 GT4。将 JAVA_HOMEANT_HOME 环境变量分别设置为 Java 和 Ant 的安装根目录。确保已经将它们的二进制程序加入 PATH 变量中。例如:
    >> export JAVA_HOME=/usr/local/java
    >> export ANT_HOME=/usr/local/ant
    >> export PATH=$JAVA_HOME/bin:$ANT_HOME/bin:$PATH

  4. 解压并安装 GT4,步骤如下:
    >> untar zxvf gt4.0.0-all-source-installer.tar.gz
    >> cd gt4.0.0-all-source-installer
    >> export GLOBUS_LOCATION=/home/globus/gt-4.0.0
    >> ./configure --prefix=$GLOBUS_LOCATION
    >> make

注意,这个 make 命令需要执行几分钟甚至几个小时才能完成 GT4 的安装,这取决于系统的性能。完成安装之后,将创建一个 GT4 的完整安装,其中包括 GSI 工具。

在一个终端窗口中,设置 GLOBUS_LOCATION 的值。例如:

		 >> GLOBUS_LOCATION=/home/globus/gt-4.0.0
		 >> export GLOBUS_LOCATION=$GLOBUS_LOCATION
		 

$GLOBUS_LOCATION/bin 加入 PATH 变量中,例如:

		 >> PATH=$GLOBUS_LOCATION/bin:$PATH
		 >> export PATH=$PATH





回页首


安装证书

要使用安全证书,则必须访问一个证书权威机构,该权威机构可以对证书进行“签名”,确保这些证书的真实性,如下所示。对于此处要进行的工作而言,可以使用 SimpleCA 包(这是 GT4 中提供的)来为我们自己和服务器生成证书(EEC)。如果已经有证书,则可以使用现有的证书。

在使用证书时,DN(distinguished name)可以在全局命名空间中提供一种标准的命名实体。在任何环境中,给定的 DN 都惟一地标识了一个特定的实体。X.509 证书可以引用这个 DN 来标识一个永久的实体,例如用户、服务器程序、硬件,等等。它在实体的 DN 与一个特定的公钥之间提供了一种绑定。这种断言通常会由一个称为证书权威机构(CA)的可信实体进行有效性验证,或者进行数字签名。

防火墙的问题

大部分公司的网络都采用防火墙来对网络进行保护。Globus Toolkit 解决了这个问题,并允许设置 GSI 或其他 Globus 通信与现有的防火墙共存。其他 Globus 服务,例如 MDS 和 GridFTP,都已经在一些已知端口上运行,客户机/服务器进行交互可能会需要使用其他临时端口。要允许在一定范围的端口上进行与 Globus 有关的通信,请按照下面的方法来设置 GLOBUS_TCP_PORT 环境变量:% export GLOBUS_TCP_PORT_RANGE=45000,45100.

有关这个问题的更多信息和提示,可以在 参考资料 一节中找到。

很多公司都自行运行一个商业 CA,以便对这种实体进行签名,目的是对组织内部的人员进行识别。在网格环境中,一旦从目标资源的可信 CA 处获得证书,就可以对这个资源进行身份验证。使用 GSI,可以跟据需要将网格中的实体配置为信任一组特定的 CA。例如,哪些希望进行合作的组织可以配置为接受彼此的证书,他们的证书都可以从一个公用的可信 CA 处获得。

下面让我们介绍一下获取证书并为 GSI 设置证书的步骤。

获取证书并进行设置

GT4 提供了几个命令行工具来生成证书请求,可以使用邮件将这些证书发送给 CA,从而对它们进行有效验证和签名。在进行签名之后,CA 将返回签名后的文档,我们现在就可以使用它们来标识请求生成这个证书的实体的身份了。假设我们已经安装了一个 GSI(或者完全安装的 GT4),就可以使用诸如 grid-cert-request 之类的工具来生成这些请求。这个脚本会生成一个公钥/私钥对,以及一个相关的证书请求。生成证书的过程非常简单,在命令行中输入: grid-cert-request 即可。

这会产生以下输出:

A certificate request and private key is being created. You will be asked to enter 
a PEM pass phrase. This pass phrase is similar to your account password
and protects your key file. If you forget your pass phrase, you will need to obtain
a new certificate. Generating a 1024-bit RSA private key
....................++++++
................................................++++++
writing new private key to /home/globus/.globus/userkey.pem

在提示您 Enter PEM pass phrase: 时,输入一个密码,用该密码对私钥进行保护。

运行这个命令,这将在 $HOME 目录的 .globus 子目录中创建一个空的 usercert.pem(稍后会使用签名后的证书替换)、userkey.pem(只有您自己可以读取)以及 usercert_request.pem(要发送给 CA的请求)。

按照提示,将请求发送给 CA,后者会发回一个签名后的版本。将这个文件保存为 $HOME 目录的 .globus 子目录中的 usercert.pem 文件。通常,需要对自己的服务和其他资源(例如服务器或容器(主机证书))重复这个步骤,以获得证书密钥对。

要试验本文中介绍的例子,则要为运行网格服务的容器提供一个主机证书或证书密钥对,因为 GSI 中的相互认证要求您和提供服务的容器都具有 EEC。要获得主机证书,可以使用相同的 grid-cert-request 命令,命令与前面的一样,但是这次是系统级的服务,例如容器,我们要使用一个超级用户来生成证书请求。通常,主机/服务证书都不用使用密码进行保护。使用下面的命令可以生成证书请求:

grid-cert-request -host <<Full qualified Domain name of the host>>

例如:

 
grid-cert-request -host myhost.myorg.com

容器证书称为 hostcert.pemhostkey.pem,需要将它们放在 /etc/grid-security 目录中。要为主机设置证书,请以 root 用户的身份执行以下步骤:

root# cd /etc/grid-security
root# cp hostkey.pem containerkey.pem
root# cp hostcert.pem containercert.pem
root# chown globus.globus containerkey.pem containercert.pem

注意,我们正在以 globus 用户身份来启动和停止容器。在使用其他用户时,请相应地对上面的命令进行调整。

网格映射文件的管理

现在我们已经为您和主机在适当的位置上提供了证书。接下来,我们需要一种方法来告诉 GT4 服务容器如何将证书 DN 关联到一个本地用户上。网格映射文件就是用于这个目的,Globus 工具可以使用网格映射文件实现 DN 到用户帐号的映射,网格映射文件位于 GSI 专用的目录中,通常是 /etc/grid-security/。要编辑这个文件需要 root 权限,但是使用任何文本编辑器都可以对其进行编辑。编辑这个文件并添加一个项,如下所示:

"/O=TestOrg/OU=TestOrgUnit/CN=Babu Sundaram" bsundaram

这一项指出了使用相关证书成功与上面的 DN 进行身份验证的实体,该实体拥有相关私钥,并将授予本地帐号的权限。在这种情况中,可以使用将用户标识为 /O=TestOrg/OU=TestOrgUnit/CN=Babu Sundaram 的证书说明该用户应当授予 bsundaram 帐号的权限。这个过程允许用户将一个证书呈现给多个资源,并可以将它映射到不同的本地帐号。

但是应该从哪儿获得 DN 呢?执行下面的命令可以看到证书中的 DN 是什么:

grid-proxy-init
Your identity: /O=TestOrg/OU=TestOrgUnit/CN=Babu Sundaram 
Enter GRID pass phrase for this identity:

按下 <Ctrl+c> 停止这个命令,因为稍后我们会创建真正的代理。

使用上面的格式输入这个 DN 和网格映射文件中的本地帐号。您还可以使用 grid-cert-info -subject 命令来获得证书的 DN。





回页首


部署样例程序

要了解它具体的使用情况,我们可以为现有的网格服务添加身份验证和授权功能,例如在“Understanding WSRF, Part 4” 教程中介绍过的拍卖服务。(请参阅 参考资料 中的链接。)可以从参考资料一节下载代码。我们使用 Ant 编译工具来编译并部署程序。

我们将安装样例程序类的目录称为 AUCTION_HOME。在展开样例程序的文件之后,将存在以下目录结构:

<AUCTION_HOME>/etc
<AUCTION_HOME>/schema
<AUCTION_HOME>/schema/tutorial
<AUCTION_HOME>/src

还应该安装 Java SDK 和 Ant,并提前设置 JAVA_HOMEANT_HOME;否则,现在立刻设置这两个环境变量:

>>> JAVA_HOME=/home/globus/jdk1.5.0_01
>>> export JAVA_HOME=$JAVA_HOME

>>> ANT_HOME=/home/globus/apache-ant-1.6.2
>>> export ANT_HOME=$ANT_HOME

还要确保 JAVA_HOME/binANT_HOME/binGLOBUS_HOME/bin 都已经包含在 PATH 环境变量中。

安全描述符的设置

现在我们需要在 AUCTION_HOME 目录中的 deploy-server.wsdd 文件中添加一个安全描述符,这样服务器就知道在哪儿获取服务器级安全性的详细配置信息。

将以下内容添加到 deploy-server.wsdd 中:

<deployment name="defaultServerConfig"
    xmlns="http://xml.apache.org/axis/wsdd/"
    xmlns:aggr="http://mds.globus.org/aggregator/types"
    xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">

    <service name="AuctionService" provider="Handler"
        use="literal" style="document">

     <parameter name="providers" value="GetRPProvider QueryRPProvider DestroyProvider
		   SetTerminationTimeProvider SubscribeProvider"/>

<!-- Additions to add Service-level Security  -->
        <parameter name="securityDescriptor" value="@config.dir@/security-config.xml"/>
        <parameter name="handlerClass" value="org.globus.axis.providers.RPCProvider"/>
        <parameter name="scope" value="Application"/>
        <parameter name="allowedMethods" value="*"/>
        <parameter name="activateOnStartup" value="true"/>
        <parameter name="className"
            value="org.globus.tutorial.auction.AuctionService"/>
        <wsdlFile>share/schema/tutorial/Auction_service.wsdl</wsdlFile>
    </service>

</deployment>

网格映射文件的设置

此时,我们已经成功获得了证书。接下来让我们将证书中的 DN 和用户帐号添加到这个服务的网格映射文件中,该文件位于 AUCTION_HOME/etc 目录中。

像上次一样,将 DN 和用户名添加到网格映射文件中,这样,它将如下所示:

"/O=TestOrg/OU=TestOrgn/CN=Babu Sundaram" bsundaram

当然,要使用您自己的信息。

现在我们需要部署所编辑的网格服务。在命令行中,切换到 AUCTION_HOME 目录中,并输入:ant deploy,将这个程序部署到容器中。如果一切运行良好,则会显示一条 BUILD SUCCESSFUL 消息。否则,请查看输出,以确定问题所在,改正这些问题,并重新运行 ant 脚本。

代理的创建

为了让系统能够工作,必须为单点登录和权限委托创建一个临时证书。操作步骤如下:

% grid-proxy-init
Your identity: <YOUR_DN_WILL_BE_SHOWN_HERE>
Enter GRID pass phrase for this identity:
Creating proxy
....................................................................... Done
Your proxy is valid until: <THE_PROXY_LIFETIME_WILL_BE_SHOWN_HERE>
%

在请求时,使用在建立证书时使用的密码。通过确保在 /tmp 目录中生成了一个名字类似 x509_up_u<your_uid> 的文件,来验证上述过程。这个位置是代理的默认位置,除非您指定了其他位置。

启动安全的容器

我们现在需要启动一个安全容器,它要在接受服务访问请求之前对身份验证进行检查。

部署好服务之后,我们就需要启动容器了。在命令行中输入以下内容:

% globus-start-container 

.......
<other_services>
.......
https://localhost:8443/wsrf/services/AuctionService
.......
<other_services>
.......

这个命令将启动安全的容器。还要注意的是,每个服务都是在端口 8443 (而不是 8080)上监听的,并且使用安全的 HTTP(HTTPS)作为通信协议。您应该看到一个已安装服务的列表(包括 AuctionService),这个窗口应该不会返回控制权。要停止这个容器,请在这个窗口中按下 <ctrl>-C 键。

进行身份验证

部署拍卖服务的部分过程会生成一些与 AuctionService 实例进行交互的客户机工具。我们现在可以使用它们在服务实现中执行一些安全操作。创建一个新的 AuctionService 实例,并与其进行交互,我们将在下一节中介绍该实例。创建的客户机工具使用了一个附加选项(-z)来指出我们想对新创建的实例采用哪种级别的身份验证。(另外,我们可以将这个选项设置为 none,指出不进行任何身份验证。)

% $GLOBUS_LOCATION/bin/create-auction 
-s https://localhost:8443/wsrf/services/AuctionService -z self 
New Auction Created...
EPR written to file:  bid-581376501.epr

self 参数意味着修改这个实例的属性可能只是针对网格映射文件中的那些实体。因此,在这种情况中,只有网格映射文件中的实体可以修改 bid 值。

% $GLOBUS_LOCATION/bin/offer-bid -e bid-581376501.epr -z none 1234
Current Bid = Welcome to the Auction Service (No Bid made yet!)
Your Bid = 1234
Bid Accepted.

% $GLOBUS_LOCATION/bin/show-bid -e bid-581376501.epr -z none 
<ns1:AuctionResourceProperties xmlns:ns1="http://tutorial.globus.org/auction">
 <ns1:message>1234</ns1:message>
 <ns1:lastModified>2005-04-05T21:28:31.129Z</ns1:lastModified>
</ns1:AuctionResourceProperties>

要确保安全性得到了使用,请使用 grid-proxy-destroy 命令删除代理。接下来,我们要试着建立一个拍卖服务的实例,或者为一个现有的拍卖提供一个 bid 值。这些操作都会失败,因为现在还没有有效的代理,因此请求实体不能证明自己与网格映射文件中 DN 的关系。请考虑下面这个例子:

% grid-proxy-destroy
% create-bid -s https://localhost:8443/wsrf/services/AuctionService -z self
Error: ; nested exception is:
   GSSException: Defective credential detected [Root error message: Proxy file
   (/tmp/x509up_u<uid>) not found.] [Root exception is
   org.globus.gsi.GlobusCredentialException: Proxy file (/tmp/x509up_u<uid>)
   not found.]

% $GLOBUS_LOCATION/bin/offer-bid -e bid-581376501.epr -z none 123456
Error: ; nested exception is:
    GSSException: Defective credential detected [Root error message: Proxy file
    (/tmp/x509up_u<uid>) not found.] [Root exception is org.globus.gsi.
    GlobusCredentialException: Proxy file (/tmp/x509up_u<uid>) not found.]

如果我们使用 grid-proxy-init 命令刷新代理,那么这些操作就会再次成功。

匿名操作

要说明的是,我们具有一个匿名用户就意味着在处理用户请求时不需要进行身份验证。因此,网格映射文件中没有包含的那些用户也可以通过包括匿名选项与服务进行交互。任何用户在包含匿名用户之后,都可以使用 -a 选项查询拍卖的值,只要知道资源实例的端点引用(EPR)即可。(虽然匿名用户可以查询当前 bid 的值,但是他们不能创建一个新实例,也不知道这个特定实例的 EPR,因此,在这种情况中,他们只能考虑使用 EPR 来允许匿名操作。)

例如:

% $GLOBUS_LOCATION/bin/show-bid -e bid-581376501.epr -z none -a
<ns1:AuctionResourceProperties xmlns:ns1=
"http://tutorial.globus.org/auction">
 <ns1:message>1234</ns1:message>
 <ns1:lastModified>2005-04-05T21:28:31.129Z</ns1:lastModified>
</ns1:AuctionResourceProperties>





回页首


结束语

在本文中,介绍了如何使用 Globus Alliance 作为 Globus Toolkit 4 的一部分提供的 GSI 组件的一个简要介绍。本文引证了 GSI 背后的动机,介绍了 GSI 使用的各种技术,以及如何将这些技术合并在一起,此外,还介绍了 GSI 的架构,并使用一个示例 WSRF(Web Services Resource Framework)服务来设置它。

本文介绍了使用 GSI 的相关方面的内容,其中包括如何:

  • 安装 GSI,让它能够工作起来。
  • 获得网格证书。
  • 设置系统和网格映射文件。
  • 安装各种配置文件。
  • 创建并销毁代理。
  • 安全的身份验证容器。
  • 安全地创建服务实例。


参考资料



关于作者

Author photo

Babu Sundaram 从开发 Globus Toolkit 早期就开始积极地参与网格计算的研究工作。他在 Argonne National Labs 实习时就是 Globus 实现组的成员之一。他拥有医学工程的学士学位和计算机科学的硕士学位,目前他正在休斯顿大学从事计算机科学博士研究工作。他已经在各个网格会议和网格相关的组织中出版了很多论文,而且是很多有关网格计算的书籍的合作者之一。他热爱教学,有时候会作为一个讲师来讲解有关 Web service 和网格计算领域的课程。他非常欢迎读者对本文进行反馈,您可以通过 babu@cs.uh.edu 与他进行联系。




对本文的评价

太差! (1)
需提高 (2)
一般;尚可 (3)
好文章 (4)
真棒!(5)

将您的建议发给我们或者通过参加讨论与其他人分享您的想法.




回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款