Sun Java System Message Queue 3 2005Q4 管理指南 |
第 7 章
管理安全性作为管理员,您可以配置用户系统信息库来验证用户、定义访问控制、配置用来加密客户端/代理通信的安全套接字层 (Secure Socket Layer, SSL) 连接服务,并设置代理启动时使用的密码文件。
本章包含以下各节:
验证用户当用户尝试连接到代理时,代理将通过检查所提供的名称和密码来对用户进行验证。如果名称和密码与特定于代理的(每个代理均配置为需要查阅)用户系统信息库中的名称和密码相匹配,则允许该用户与代理建立连接。
您负责维护系统信息库中用户、用户组及用户密码的列表。各个代理实例可以使用不同的用户系统信息库。本节将说明如何创建、填充和管理系统信息库。
系统信息库可以是以下类型之一:
此类型的用户系统信息库非常易于使用。您可以使用用户管理器实用程序 (imqusermgr) 来填充和管理系统信息库。要启用验证,您需要用每个用户的名称和密码以及用户组的名称填充用户系统信息库。
有关设置和管理用户系统信息库的详细信息,请参见使用平面文件用户系统信息库。
这可以是现有的或新的 LDAP 目录服务器,这种服务器使用 LDAP v2 或 v3 协议。它并不像平面文件系统信息库那样易于使用,但它的可伸缩性更好,因此更适用于生产环境。
如果您目前使用的是 LDAP 用户系统信息库,请使用 LDAP 供应商提供的工具来填充和管理用户系统信息库。有关更多信息,请参见使用 LDAP 服务器管理用户系统信息库。
使用平面文件用户系统信息库
Message Queue 提供了一个平面文件用户系统信息库和一个命令行工具,即,用户管理器实用程序 (imqusermgr),您可以使用它来填充和管理平面文件用户系统信息库。以下各节介绍平面文件用户系统信息库以及如何使用用户管理器实用程序来填充和管理该系统信息库。
创建用户系统信息库
平面文件用户系统信息库是特定于实例的。默认的用户系统信息库(名为 passwd)是为启动的每个代理实例自动创建的。此用户系统信息库所在的目录由与该系统信息库相关联的代理实例的名称标识(请参见附录 A“Message Queue 数据在特定平台上的位置”):
.../instances/instanceName/etc/passwd
创建的系统信息库默认有两个条目。表 7-1 中的每一行显示一个条目。
这些初始条目使得 Message Queue 代理安装后即可使用,而不需要管理员的干预:
- 初始 guest 用户条目使客户端可以使用默认的 guest 用户名和密码连接到代理实例。
- 利用初始 admin 用户条目,您可以通过 imqcmd 命令使用默认的 admin 用户名和密码管理代理实例。您应更新此初始条目以更改密码(请参见更改默认的管理员密码)。
以下各节说明如何填充和管理平面文件用户系统信息库。
用户管理器实用程序
使用 Message Queue 用户管理器实用程序 (imqusermgr),您可以编辑或填充平面文件用户系统信息库。本节介绍了用户管理器实用程序。下文说明如何使用 imqusermgr 子命令完成特定任务。
有关 imqusermgr 命令的完整参考信息,请参见第 13 章“命令行参考”。
使用用户管理器之前,请谨记以下事项:
子命令
imqusermgr 命令包含子命令 add、delete、list 和 update。
命令选项
表 7-2 列出了 imqusermgr 命令的选项。
组
在代理实例的用户系统信息库中添加用户条目时,您可以指定以下三个预定义组之一:admin、user 或 anonymous。如果不指定任何组,则默认属于 user 组。应按如下方式指定组:
- admin 组。 用于代理管理员。默认情况下,指定到该组中的用户可以配置和管理代理。您可以为 admin 组指定多个用户。
- user 组。 用于普通(非管理)Message Queue 客户端用户。多数客户端用户都属于 user 组。默认情况下,该组中的用户可以生成发往所有主题和队列的消息,使用来自所有主题和队列的消息,以及浏览任意队列中的消息。
- anonymous 组。 用于那些不想使用代理已知的用户名(可能是因为客户端应用程序不知道要使用的实际用户名)的 Message Queue 客户端。此帐户类似于大多数 FTP 服务器中的匿名帐户。每次只能为 anonymous 组分配一个用户。与 user 组不同,应限定 anonymous 组的访问权限,或者在部署时删除该组中的用户。
要更改用户所属的组,必须删除该用户的条目,然后为该用户添加另一个条目并为其指定新组。
您不能重命名或删除这些系统创建的组,也不能创建新组。但是,您可以指定访问规则,定义该组的成员可以执行的操作。有关更多信息,请参见授权用户:访问控制属性文件。
用户状态
向系统信息库中添加用户时,用户的默认状态是活动的。要使用户处于非活动状态,您必须使用 update 命令。例如,以下命令将使用户 JoeD 处于非活动状态:
imqusermgr update -u JoeD -a false
处于非活动状态的用户条目将保留在系统信息库中,但不能打开新连接。当某个用户处于非活动状态时,如果您试图添加具有相同名称的另一个用户,操作将失败。必须删除处于非活动状态的用户条目,或者更改新用户的名称,或者为新用户指定一个不同的名称。这样可以防止添加重复的用户名。
用户名和密码的格式
用户名和密码必须遵循以下原则:
填充和管理用户系统信息库
要在系统信息库中添加用户,可以使用 add 子命令。例如,以下命令向默认代理实例用户系统信息库添加用户名为 Katharine、密码为 sesame 的用户。
imqusermgr add -u Katharine -p sesame -g user
要从系统信息库中删除用户,可以使用 delete 子命令。例如,以下命令删除用户 Bob:
imqusermgr delete -u Bob
要更改用户的密码或状态,可以使用 update 子命令。例如,以下命令将 Katharine 的密码更改为 aladdin:
imqusermgr update -u Katharine -p aladdin
要列出一个或所有用户的相关信息,可以使用 list 命令。以下命令显示名为 isa 的用户的相关信息:
imqusermgr list -u isa
% imqusermgr list -u isa
代理实例的用户系统信息库:imqbroker
----------------------------------
用户名 组 活动状态
----------------------------------
isa admin true
以下命令列出所有用户的相关信息:
imqusermgr list
更改默认的管理员密码
为安全起见,应该将 admin 的默认密码更改为只有您自己知道的密码。以下命令将 mybroker 代理实例的默认管理员密码从 admin 更改为 grandpoobah。
imqusermgr update mybroker -u admin -p grandpoobah
要快速确认此更改是否已生效,可以在代理实例运行时运行任何命令行工具。例如,以下命令将提示您输入密码:
imqcmd list svc mybroker -u admin
输入新密码 (grandpoobah) 将会被接受;而输入旧密码则会失败。
更改密码后,使用任何 Message Queue 管理工具(包含管理控制台)时都应该提供新密码。
使用 LDAP 服务器管理用户系统信息库
要使用 LDAP 服务器来管理用户系统信息库,请执行以下任务:
编辑实例配置文件
要让代理使用目录服务器,请设置代理实例配置文件 config.properties 中某些属性的值。设置这些属性后,每当用户试图连接到代理实例或执行信息传送操作时,代理实例都会在 LDAP 服务器中查询有关用户和组的信息。
实例配置文件位于代理实例目录下的某个目录中。路径的格式如下:
.../instances/instanceName/props/config.properties
有关实例目录在特定操作系统中的位置的信息,请参见附录 A“Message Queue 数据在特定平台上的位置”。
编辑配置文件以使用 LDAP 服务器
- 通过设置以下属性,指定您使用的是 LDAP 用户系统信息库:
imq.authentication.basic.user_repository=ldap
- 设置 imq.authentication.type 属性,确定密码是以 Base64 (basic) 还是 MD5 (digest) 编码的形式从客户端传递给代理。使用 LDAP 目录服务器管理用户系统信息库时,必须将验证类型设置为 basic。例如,
imq.authentication.type=basic
Message Queue 使用 JNDI API 与 LDAP 目录服务器进行通信。有关这些属性的语法及其所引用的术语的详细信息,请查阅 JNDI 文档。Message Queue 使用 Sun JNDI LDAP 提供者并使用简单验证。
Message Queue 支持 LDAP 验证故障转移:可以指定要尝试进行验证的 LDAP 目录服务器列表(请参见 imq.user.repos.ldap.server 属性的参考信息)。
有关说明如何设置 LDAP 用户系统信息库相关属性的示例,请参见代理的 config.properties 文件。
- 必要时还需要编辑访问控制属性文件中的用户/组和规则。有关使用访问控制属性文件的详细信息,请参见授权用户:访问控制属性文件。
- 如果您希望代理在连接验证和组搜索时通过 SSL 与 LDAP 目录服务器进行通信,您需要在 LDAP 服务器中激活 SSL,然后在代理配置文件中设置以下属性:
为管理员设置访问控制
要创建管理用户,请使用访问控制属性文件指定能够创建 ADMIN 连接的用户和组。必须在 LDAP 目录中预定义这些用户和组。
能够创建 ADMIN 连接的任何用户或组都可以执行管理命令。
设置管理用户
- 通过将代理属性 imq.accesscontrol.enabled 设置为 true(这是默认值)来允许使用访问控制文件。
imq.accesscontrol.enabled 属性允许使用访问控制文件。
- 打开访问控制文件 accesscontrol.properties。附录 A“Message Queue 数据在特定平台上的位置”中列出了该文件的位置。
该文件包含一个如下所示的条目:
服务连接访问控制
##################################
connection.NORMAL.allow.user=*
connection.ADMIN.allow.group=admin
列出的条目是示例。请注意,admin 组存在于基于文件的用户系统信息库中,而非默认存在于 LDAP 目录中。您必须将在 LDAP 目录中定义的组的名称替换为要为其授予 Message Queue 管理员权限的组的名称。
- 要为用户授予 Message Queue 管理员权限,请按如下所示输入用户名:
connection.ADMIN.allow.user=userName[[,userName2]...]
- 要为组授予 Message Queue 管理员权限,请按如下所示输入组名称:
connection.ADMIN.allow.group=groupName[[,groupName2]...]
授权用户:访问控制属性文件访问控制属性文件(Access Control Properties File,ACL 文件)包含一些规则,用来指定用户和用户组可以执行的操作。您可以编辑 ACL 文件,将操作限定给某些用户和组。各个代理实例可以使用不同的 ACL 文件。
无论用户信息是放在平面文件用户系统信息库中还是放在 LDAP 用户系统信息库中,都会使用 ACL 文件。当客户端应用程序执行以下操作之一时,代理将检查其 ACL 文件:
代理将检查 ACL 文件以确定是授权生成请求的用户还是用户所属的组来执行该操作。
如果对 ACL 文件进行编辑,新的设置将在下一次代理检查该文件以验证授权时生效。编辑完文件后,不需要重新启动代理。
创建访问控制属性文件
ACL 文件是特定于实例的。每次启动代理实例时,都会在该实例目录中创建一个名为 accesscontrol.properties 的默认文件。该文件的路径具有如下格式(请参见附录 A“Message Queue 数据在特定平台上的位置”):
.../instances/brokerInstanceName/etc/accesscontrol.properties
ACL 文件的格式与 Java 属性文件类似。首先定义文件的版本,然后指定访问控制规则,规则分为三部分:
version 属性定义 ACL 属性文件的版本,不能更改此条目。
version=JMQFileAccessControlModel/100
下面介绍指定访问控制的 ACL 文件的三个组成部分,然后说明访问规则的基本语法并介绍如何计算权限。
访问规则语法
在 ACL 属性文件中,访问控制用于定义特定用户或组对受保护的资源(如物理目标和连接服务)具有哪些访问权限。访问控制由一个规则或一组规则组成,每个规则都由一个 Java 属性表示:
这些规则的基本语法如下:
resourceType.resourceVariant.operation.access.principalType=principals
表 7-3 介绍了语法规则的元素。
表 7-3 访问规则的语法元素
元素
描述
resourceType
以下选项之一:connection、queue 或 topic。
resourceVariant
resourceType 指定的类型的一个实例。例如,myQueue。通配符 (*) 可用于表示所有连接服务类型或所有物理目标。
operation
值取决于所设置的访问规则的类型。
access
以下选项之一:allow 或 deny。
principalType
以下选项之一:user 或 group。有关更多信息,请参见组。
principals
可能具有规则左侧指定的访问权限的人。如果 principalType 为 user,则可能是单个用户或以逗号分隔的用户列表;如果 principalType 为 group,则可能是单个组或以逗号分隔的组列表。通配符 (*) 可用于表示所有用户或所有组。
下面是一些访问规则示例:
权限的计算方式
当文件中存在多个访问规则时,将按如下方式计算权限:
- 具体的访问规则将覆盖一般访问规则。应用以下两条规则之后,所有用户都可以向所有队列发送消息,但是 Bob 不能向 tq1 发送消息。
queue.*.produce.allow.user=*
queue.tq1.produce.deny.user=Bob
- 指定给显式 principal 的访问权限将覆盖指定给 * principal 的访问权限。以下规则将拒绝 Bob 向 tq1 发送消息,但允许其他人发送。
queue.tq1.produce.allow.user=*
queue.tq1.produce.deny.user=Bob
- 用户的 * principal 规则将覆盖组的对应 * principal 规则。例如,以下两条规则允许所有通过验证的用户向 tq1 发送消息。
queue.tq1.produce.allow.user=*
queue.tq1.produce.deny.group=*
- 授予用户的访问权限将覆盖授予用户所属组的访问权限。在以下示例中,即使 Bob 是 User 的成员,他也不能生成发送到 tq1 的消息。User 的其他所有成员都可以生成此类消息。
queue.tq1.produce.allow.group=User
queue.tq1.produce.deny.user=Bob
- 任何未通过访问规则明确授予的访问权限均默认为被拒绝。例如,如果 ACL 文件不包含任何访问规则,则所有用户的所有操作都将被拒绝。
- 如果同时允许和拒绝同一个用户或组的访问权限,则访问权限将相互抵消。例如,以下两条规则将使 Bob 无法浏览 q1:
queue.q1.browse.allow.user=Bob
queue.q1.browse.deny.user=Bob
用于连接服务的访问控制
ACL 属性文件中的连接访问控制部分包含代理连接服务的访问控制规则。连接访问控制规则的语法如下:
connection.resourceVariant.access.principalType=principals
为 resourceVariant 定义了两个值:NORMAL 和 ADMIN。这些预定义的值是您唯一能够授予访问权限的连接服务类型。
默认的 ACL 属性文件授予所有用户访问 NORMAL 连接服务的权限,并授予 admin 组中的用户访问 ADMIN 连接服务的权限:
connection.NORMAL.allow.user=*
connection.ADMIN.allow.group=admin
如果您使用的是基于文件的用户系统信息库,则默认组由用户管理器实用程序创建admin。如果您使用的是 LDAP 用户系统信息库,则可以通过执行以下操作之一来使用默认 ACL 属性文件:
您可以对连接访问权限加以限定。例如,以下规则拒绝 Bob 访问 NORMAL,但允许其他人访问:
connection.NORMAL.deny.user=Bob
connection.NORMAL.allow.user=*
可以使用星号 (*) 指定所有通过验证的用户或组。
使用 ACL 属性文件来授权访问 ADMIN 连接的方式与使用基于文件的用户系统信息库和 LDAP 用户系统信息库不同,如下所示:
对物理目标的访问控制
访问控制属性文件的目标访问控制部分包含基于物理目标的访问控制规则。这些规则决定谁(用户/组)可以在哪里(物理目标)执行什么(操作)。这些规则控制的访问类型包括向队列发送消息、向主题发布消息、从队列接收消息、订阅主题以及浏览队列中的消息。
默认情况下,任何用户或组都可以对任何物理目标进行任意类型的访问。您可以添加更多特定的目标访问规则或编辑默认的规则。本节的余下部分介绍物理目标访问规则的语法,您必须理解这些语法才能编写自己的规则。
目标规则的语法如下:
resourceType.resourceVariant.operation.access.principalType=principals
表 7-4 介绍了这些元素:
表 7-4 物理目标访问控制规则的元素
组件
描述
resourceType
可以是 queue 或 topic。
resourceVariant
某个物理目标名或所有物理目标 (*),星号表示所有队列或所有主题。
operation
可以是 produce、consume 或 browse。
access
可以是 allow 或 deny。
principalType
可以是 user 或 group。
可以将访问权限授予一个或多个用户和/或一个或多个组。
以下示例说明了不同类型的物理目标访问控制规则:
对自动创建的物理目标的访问控制
ACL 属性文件最后一部分所包括的访问规则指定代理将为哪些用户和组自动创建物理目标。
当用户在尚不存在的物理目标上创建生成方或使用方时,如果已启用代理的自动创建属性,则代理将会创建该目标。
默认情况下,任何用户或组都有权让代理为其自动创建一个物理目标。此权限由以下规则指定:
queue.create.allow.user=*
topic.create.allow.user=*
您可以编辑 ACL 文件以限制此类访问权限。
物理目标自动创建访问规则的一般语法如下:
resourceType.create.access.principalType=principals
其中 resourceType 为 queue 或 topic。
例如,以下规则允许代理为除 Snoopy 之外的每个用户自动创建 topic 目标。
topic.create.allow.user=*
topic.create.deny.user=Snoopy
请注意,物理目标自动创建规则的效果必须与物理目标访问规则的效果一致。例如,1) 如果您更改目标访问规则,禁止任何用户向目标发送消息;2)但是启用了目标的自动创建,则如果目标不存在,代理将创建一个物理目标,但不会向该目标发送任何消息。
使用基于 SSL 的服务基于安全套接字层 (Secure Socket Layer, SSL) 标准的连接服务在客户端与代理之间发送加密的消息。本节将说明如何设置基于 SSL 的连接服务。
Message Queue 支持以下基于安全套接字层 (Secure Socket Layer, SSL) 标准的连接服务:
这些连接服务允许对客户端与代理之间发送的消息进行加密。Message Queue 支持基于自签名服务器证书或签名证书的 SSL 加密。
要使用基于 SSL 的连接服务,需要使用密钥工具实用程序 (imqkeytool) 生成专用密钥/公共密钥对。此实用程序将公共密钥嵌入自签名证书,此证书将传递给请求连接到代理的任何客户端,客户端需要使用该证书建立加密连接。
尽管 Message Queue 的基于 SSL 的连接服务在概念上很相似,但它们的设置方法却不尽相同。
本节后面部分将介绍如何通过 TCP/IP 建立安全连接。
基于 SSL 的连接服务(适用于通过 HTTP 连接的用户)(httpsjms) 使客户端和代理可以通过 HTTPS 隧道 Servlet 方式建立安全连接。有关通过 HTTP 建立安全连接的信息,请参见附录 C“HTTP/HTTPS 支持”。
TCP/IP 的安全连接服务
以下基于 SSL 的连接服务通过 TCP/IP 提供直接、安全的连接:
- ssljms 服务可通过安全的加密连接在客户端与代理之间传送消息。
- ssladmin 服务将在 Message Queue 命令实用程序 (imqcmd) 与代理之间创建一个安全的加密连接。不支持管理控制台 (imqadmin) 安全连接。
- cluster 服务可通过安全的加密连接在群集中的代理之间传送消息并提供代理之间的通信(请参见代理之间的安全连接)。
配置自签名证书的使用
本节介绍如何使用自签名证书来设置基于 SSL 的服务。
如果需要更严密的验证,您可以使用由证书颁发机构验证的签名证书。先按照本节中的步骤执行操作,然后转至配置签名证书的使用执行其他步骤。
设置基于 SSL 的连接服务
设置 ssljms 和 ssladmin 连接服务的过程基本相同,不同之处在于步骤 4,即配置并运行客户端的步骤。
下文详细介绍了每个步骤。
步骤 1:生成自签名证书
带有自签名证书的 Message Queue SSL 支持用于保护所传输数据的安全性,并假定客户端正在与已知且可信任的服务器进行通信。
运行密钥工具实用程序为代理生成自签名证书。在 UNIX® 系统上,可能需要以超级用户 (root) 身份运行密钥工具,以便具有创建密钥存储的权限。
可以对 ssljms、ssladmin 或 cluster 连接服务使用相同的证书。
在命令提示符下输入以下内容:
imqkeytool -broker
实用程序会提示您输入密钥存储密码。
Generating keystore for the broker ...
Enter keystore password:然后,实用程序将提示您提供信息,用于标识拥有该证书的代理。您提供的信息将构成 X.500 标识名。下表列出并说明了一些提示,并为每个提示提供了一个示例。值区分大小写,并且可以包含空格。
表 7-5 自签名证书所需的标识名信息
提示
描述
示例
您的姓名是什么?
X.500 commonName (CN)。输入运行代理的服务器的全限定名称。
myhost.sun.com
您所在部门的名称是什么?
X.500 organizationalUnit (OU)。输入部门或分部的名称。
purchasing
您的工作单位的名称是什么?
X.500 organizationName (ON)。大型工作单位的名称,如公司或政府机构。
My Company, Inc.
您所在城市或地区的名称是什么?
X.500 localityName (L)。
San Francisco
您所在国家或省市的名称是什么?
X.500 stateName (ST)。输入国家或省市的全称,不要使用缩写。
California
此单位的两字母国家/地区代码是什么?
X.500 country (C)。
US
输入信息后,密钥工具将显示这些信息以便于您确认。例如:
Is CN=mqserver.sun.com, OU=purchasing, O=My Company, Inc., L=San Francisco, ST=California, C=US correct?
要重新输入值,请接受默认值或输入 no;要接受当前值并继续,请输入 yes。确认后,密钥工具将生成密钥对而暂停其他操作。
接下来,密钥工具要求您输入密码以锁定特定密钥对(密钥密码)。按 Return 键响应此提示,以使用同一密码作为密钥密码和密钥存储密码。
注
请记住您提供的密码。启动代理时必须提供此密码,代理才能打开密钥存储。可以将密钥存储密码存储到密码文件中(请参见使用密码文件)。
imqkeytool 命令运行 JDK keytool 实用程序生成自签名证书并将生成的证书置于 Message Queue 的密钥存储中。密钥存储所在的目录因操作系统而异,如附录 A“Message Queue 数据在特定平台上的位置”中所示。
密钥存储的格式与 JDK1.2 keytool 实用程序支持的格式相同。
以下是 Message Queue 密钥存储的可配置属性:
- imq.keystore.file.dirpath。适用于基于 SSL 的服务:指定包含密钥存储文件的目录的路径。有关默认值的信息,请参见附录 A“Message Queue 数据在特定平台上的位置”。
- imq.keystore.file.name。适用于基于 SSL 的服务:指定密钥存储文件的名称。
- imq.keystore.password。适用于基于 SSL 的服务:指定密钥存储密码。
您可能需要重新生成密钥对才能解决某些问题,例如:
出现异常的原因可能是因为您提供的密钥密码与您在步骤 1:生成自签名证书中生成自签名证书时的密钥存储密码不同。
重新生成密钥对
- 删除代理的密钥存储。有关密钥存储的位置,请参见附录 A“Message Queue 数据在特定平台上的位置”。
- 再次运行 imqkeytool,按步骤 1:生成自签名证书中所述生成密钥对。
步骤 2:在代理中启用基于 SSL 的服务
要在代理中启用基于 SSL 的服务,您需要将 ssljms(或 ssladmin)添加到 imq.service.activelist 属性中。
注
基于 SSL 的 cluster 连接服务是使用 imq.cluster.transport 属性启用的,而不是使用 imq.service.activelist 属性启用的。请参见代理之间的安全连接。
在代理中启用基于 SSL 的服务
- 打开代理的实例配置文件。
实例配置文件位于一个由代理实例名称 (instanceName) 标识的目录中,而该实例名称与此配置文件是相关联的(请参见附录 A“Message Queue 数据在特定平台上的位置”):
.../instances/instanceName/props/config.properties
- 为 imq.service.activelist 属性添加一个条目(如果此条目尚不存在),并将基于 SSL 的服务包括在列表中。
默认情况下,此属性包括 jms 和 admin 连接服务。您需要添加 ssljms 或 ssladmin 连接服务或同时添加这两者(取决于您要激活的服务):
imq.service.activelist=jms,admin,ssljms,ssladmin
步骤 3:启动代理
启动代理并提供密钥存储密码。可以通过以下方法之一提供密码:
- 让代理启动时提示您输入密码:
imqbrokerd
Please enter Keystore password:myPassword- 将密码放在密码文件中,如使用密码文件中所述。将密码放在密码文件中并设置属性 imq.passfile.enabled=true 后,执行以下操作之一:
启用带有 SSL 的代理或客户端时,您可能会注意到它在几秒钟内使用了大量的 CPU 资源。这是因为 Message Queue 使用 JSSE(Java Secure Socket Extension,Java 安全套接扩展)来实现 SSL。JSSE 使用 java.security.SecureRandom 生成随机数。此方法需要大量时间生成初始随机数初始化向量,这就是您看到 CPU 使用率增加的原因。生成初始化向量后,CPU 的使用率将降到正常水平。
步骤 4:配置并运行基于 SSL 的客户端
最后,配置客户端以使用安全连接服务。有两类在 TCP/IP 之上实现的安全连接方案:
下面分别介绍这两种客户端。
使用 ssljms 的应用程序客户端
必须确保客户端的类路径中有必要的安全套接扩展 (Secure Socket Extension, JSSE) .jar 文件,还需要告知该文件使用 ssljms 连接服务。
- 如果您的客户端不使用 J2SDK1.4(它内置 JSSE 和 JNDI 支持),请确保客户端的类路径中有以下 .jar 文件:
jsse.jar、jnet.jar、jcert.jar 和 jndi.jar
- 请确保客户端的类路径中有以下 Message Queue .jar 文件:
imq.jar 和 jms.jar
- 启动客户端并连接到代理的 ssljms 服务。执行上述操作的方法之一是输入以下命令:
java -DimqConnectionType=TLS clientAppName
设置 imqConnectionType,通知连接使用 SSL。
有关在客户端应用程序中使用 ssljms 连接服务的详细信息,请参见 Message Queue Developer's Guide for Java Clients 中有关使用受管理对象的章节。
使用 ssladmin 的管理客户端 (imqcmd)
您可以通过在使用 imqcmd 时包含 -secure 选项来建立一个安全的管理连接。例如:
imqcmd list svc -b hostName:portNumber -u adminName -secure
其中,adminName 是 Message Queue 用户系统信息库中的有效条目,该命令将提示您输入密码。(如果使用的是平面文件系统信息库,请参见更改默认的管理员密码。)
列出连接服务是查看 ssladmin 服务是否正在运行的一种方法,您可以通过此方法成功建立安全管理连接,如以下输出所示:
列出指定的代理上的所有服务:
主机 主端口
localhost 7676
服务名 端口号 服务状态
admin 33984(动态) 正在运行
httpjms - 未知
httpsjms - 未知
jms 33983(动态) 正在运行
ssladmin 35988(动态) 正在运行
ssljms 动态 未知
成功列出服务。
配置签名证书的使用
签名证书可以提供比自签名证书更严密的服务器验证。要实现签名证书,请将其安装到密钥存储中,然后对 Message Queue 客户端进行配置,使其在建立与 imqbrokerd 的 SSL 连接时请求签名证书。
您只能在客户端与代理之间实现签名证书,而不能在群集中的多个代理之间实现签名证书。
后面的说明假定您已经执行了配置自签名证书的使用中所述的步骤。在按照这些说明执行操作时,访问 http://java.sun.com 中有关 J2SE keytool 和 X.509 证书的信息可能会有所帮助。
步骤 1:获取和安装签名证书
获取签名证书
安装签名证书
- 检查 $JAVA_HOME/lib/security/cacerts 以查明 J2SE 是否默认支持您的 CA,如下所示:
keytool -v -list -keystore $JAVA_HOME/lib/security/cacerts
此命令列出系统密钥存储中的根 CA。
如果您的 CA 已列出,请跳过下一步。
- 如果 J2SE 不支持您的 CA,请将证书颁发机构的根证书导入到 imqbrokerd 密钥存储中。
下面是一个示例:
keytool -import -alias ca -file ca.cer -noprompt -trustcacerts
-keystore /etc/imq/keystore -storepass myStorePasswordca.cer 值是从 CA 获取的 CA 根证书。
如果您使用的是 CA 测试证书,则可能需要导入测试 CA 根证书。您的 CA 应提供有关如何获取测试 CA 根副本的说明。
- 将签名证书导入到密钥存储中以替换原来的自签名证书。
例如:
keytool -import -alias imq -file broker.cer -noprompt -trustcacerts
-keystore /etc/imq/keystore -storepass myStorePasswordbroker.cer 值是包含从 CA 收到的签名证书的文件。
imqbrokerd 密钥存储现在包含一个用于 SSL 连接的签名证书。
步骤 2:配置客户端运行时以请求签名证书
配置 Java 客户端运行时
默认情况下,Message Queue 客户端运行时信任 imqbrokerd 并接受提供给它的任何证书。现在,您必须将客户端运行时配置为请求签名证书,并确保客户端信任对该证书进行签名的 CA。
- 要对客户端进行配置以使其向 imqbrokerd 请求有效的签名证书,请将客户端的 ConnectionFactory 对象的 imqSSLIsHostTrusted 属性设置为 false。
- 尝试建立与 imqbrokrd 的 SSL 连接,如步骤 4:配置并运行基于 SSL 的客户端中所述。
如果代理的证书是由众所周知的 CA 签名的,则连接很可能会成功,您可以跳过下一步。如果连接由于证书验证错误而失败,请执行下一步。
- 在客户端的信任存储中安装签名 CA 的根证书,如以下各节所述。
有三个选项可用于配置具有信任存储的客户端:
下面几部分包含有关如何使用这些选项来安装 Verisign Test Root CA 的示例。根 CA 包含在名为 testrootca.cer 的文件中。这些示例假定 J2SE 安装在 /usr/j2se 中。
安装到默认的系统 cacerts 文件中
本示例将根 CA 安装到文件 $JAVA_HOME/usr/jre/lib/security/cacerts 中。
keytool -import -keystore /usr/j2se/jre/lib/security/cacerts
-alias VerisignTestCA -file testrootca.cer -noprompt -trustcacerts -storepass myStorePassword默认情况下,客户端搜索此密钥存储,因此无需对客户端进行进一步的配置。
安装到 jssecacerts 中
本示例将根 CA 安装到文件 $JAVA_HOME/usr/jre/lib/security/jssecacerts 中。
keytool -import -keystore /usr/j2se/jre/lib/security/jssecacerts
-alias VerisignTestCA -file testrootca.cer -noprompt
-trustcacerts -storepass myStorePassword默认情况下,客户端搜索此密钥存储,因此无需对客户端进行进一步的配置。
安装到其他文件中
本示例将根 CA 安装到文件 /home/smith/.keystore 中。
keytool -import -keystore /home/smith/.keystore
-alias VerisignTestCA -file testrootca.cer -noprompt -trustcacerts -storepass myStorePassword默认情况下,客户端不搜索此密钥存储,因此您必须向客户端提供信任存储的位置。要执行此操作,请在客户端运行后设置 Java 系统属性 javax.net.ssl.trustStore。例如:
javax.net.ssl.trustStore=/home/smith/.keystore
使用密码文件多种类型的命令都需要密码。在表 7-6 中,第一列列出了需要密码的命令,第二列列出了需要密码的原因。
表 7-6 使用密码的命令
命令
用途
密码的用途
imqbrokerd
启动代理
访问基于 JDBC 的持久性数据存储、SSL 证书密钥存储或 LDAP 用户系统信息库
imqcmd
管理代理
验证被授权使用此命令的管理用户
imqdbmgr
管理基于 JDBC 的数据存储
访问数据存储
可以在密码文件中指定这些密码,并使用 -passfile 选项指定该文件的名称。下面是 -passfile 选项的格式:
imqbrokerd -passfile myPassfile
注
在以前的版本中,您可以使用 -p、-password、-dbpassword 和 -ldappassword 选项在命令行指定密码。不赞成使用这些选项,在今后的版本中会将它们删除。在当前的发行版中,其中某个选项在命令行中的值将取代密码文件中相关联的值。
安全性问题
以交互方式指定密码以响应提示是最安全的密码指定方法,除非他人也可以看到您的监视器。您也可以在命令行中指定密码文件。但是,以非交互方式使用命令时,必须使用密码文件。
密码文件是未加密的,因此,您必须设置其权限以防止未经授权的访问。设置权限以限制可以查看该文件的用户,但为启动代理的用户提供读取权限。
密码文件内容
密码文件是包含一组属性和值的简单文本文件。每个值都是由某一命令使用的密码。
密码文件可包含表 7-7 中所示的密码:
表 7-7 密码文件中的密码
密码
受影响的命令
描述
imq.imqcmd.password
imqcmd
为 imqcmd 命令行指定管理员密码。需要对每个命令验证此密码。
imq.keystore.password
imqbrokerd
为基于 SSL 的服务指定密钥存储密码。
imq.persist.jdbc.password
imqbrokerd
imdbmgr
指定用于打开数据库连接的密码(如有必要)。
imq.user_repository.ldap.password
imqbrokerd
指定与代理的标识名(用于绑定到已配置的 LDAP 用户系统信息库)相关联的密码。
样例密码文件是 Message Queue 产品的一部分。有关样例文件位置的信息,请参见附录 A“Message Queue 数据在特定平台上的位置”。
创建审计日志Message Queue 仅在 Enterprise Edition 中支持审计日志记录。启用审计日志记录后,Message Queue 将为下列类型的事件生成记录:
要将审计记录记录到 Message Queue 代理日志文件中,请将 imq.audit.enabled 代理属性设置为 true。日志中的所有审计记录都包含关键字 AUDIT。