![]() | |
Sun Java System Message Queue 3.5 SP1 管理指南 |
第 8 章
管理安全性本章介绍如何执行与安全性相关的任务。这些任务包括验证、授权和加密。
验证用户 您负责维护用户列表、用户组以及用户信息库中的密码。各个代理实例可以使用不同的用户信息库。本章第一部分介绍如何创建、填充和管理信息库。有关 Message Queue 安全性的介绍,请参见“安全性管理器”。
授权用户: 访问控制属性文件 您负责编辑访问控制属性文件,此属性文件用于将每个用户对代理操作的访问权限映射到用户名或用户组成员资格。各个代理实例可以使用不同的访问控制属性文件。本章第二部分介绍如何自定义此文件。
加密:使用基于 SSL 的服务(企业版) 使用基于安全套接字层 (SSL) 标准的连接服务可以对客户机与代理之间传送的消息进行加密。有关 Message Queue 如何处理加密的介绍,请参见“加密(企业版)”。本章最后一部分介绍如何设置基于 SSL 的连接服务,并提供了与 SSL 有关的其他信息。
在代理需要提供密码才能安全访问 SSL 密钥存储、LDAP 用户信息库或 JDBC 兼容持久性存储库的情况下,提供密码的方式有三种:
验证用户当某个用户试图与代理建立连接时,代理将通过检查该用户提供的用户名和密码对其进行验证。如果用户提供的用户名和密码与配置每个代理时指定要参照的代理特定的用户信息库中的用户名和密码相匹配,则允许该用户连接到该代理。信息库有两种类型:
有关设置和管理用户信息库的详细信息,请参见“使用文本文件用户信息库”。
这可以是现有的或新的 LDAP 目录服务器,这种服务器使用 LDAP v2 或 v3 协议。它并不象文本文件信息库那样易于使用,但它更安全并可伸缩,因此更适用于生产环境。
如果您目前使用的是 LDAP 用户信息库,您需要使用 LDAP 供应商提供的工具来填充和管理该用户信息库。有关详细信息,请参见“使用 LDAP 服务器管理用户信息库”。
使用文本文件用户信息库
Message Queue 提供了一个文本文件用户信息库,还提供了一个命令行工具 Message Queue 用户管理器 (imqusermgr),您可以使用它填充和管理文本文件用户信息库。以下各节介绍文本文件用户信息库以及如何使用 Message Queue 用户管理器实用程序 (imqusermgr) 来填充和管理该信息库。
创建用户信息库
文本文件用户信息库是特定于实例的。默认的用户信息库(名为 passwd)是为启动的每个代理实例创建的。此用户信息库所在的目录由与该信息库相关联的代理实例的名称 (instanceName) 标识(请参见附录 A“Message Queue 数据的位置”):
/instances/instanceName/etc/passwd
信息库创建时附带了两个条目(行),如表 8-1 所示。
这些初始条目使 Message Queue 代理安装后即可使用,无需任何管理员的介入。换句话说,使用 Message Queue 代理之前无需设置初始用户/密码。
初始 guest 用户条目使客户机可以使用默认的 guest 用户名和密码连接到代理实例(例如,用于测试目的)。
初始 admin 用户条目使您可以通过 imqcmd 命令,使用默认的 admin 用户名和密码管理代理实例。建议您更新此初始条目以更改密码(请参见“更改默认的管理员密码”)。
以下各节说明如何填充和管理文本文件用户信息库。
用户管理器实用程序 (imqusermgr)
此用户管理器实用程序 (imqusermgr) 允许您编辑或填充文本文件用户信息库。
本节介绍了基本的 imqusermgr 命令语法,提供了一个子命令列表,并概述了 imqusermgr 命令选项。下文说明如何使用 imqusermgr 子命令完成特定任务。
使用 imqusermgr 之前,请谨记以下内容:
imqusermgr 命令的语法
imqusermgr 命令的一般语法如下:
imqusermgr subcommand [options]
imqusermgr -h
imqusermgr -v请注意,如果指定 -v 或 -h 选项,将不会执行命令行中指定的子命令。例如,输入以下命令将显示版本信息,而不是执行 list 子命令。
imqusermgr list -v
imqusermgr 子命令
表 8-2 列出了 imqusermgr 子命令。
imqusermgr 命令选项概述
表 8-3 列出了 imqusermgr 命令的选项。
组
向代理实例的用户信息库中添加用户条目时,您可以为该用户指定三个预定义组中的一个组,这三个组为:admin、user 或 anonymous。如果不指定任何组,则默认属于 user 组。
- admin 组。用于代理管理员。默认情况下,指定到该组中的用户可以配置和管理代理。您可以为 admin 组指定多个用户。
- user 组。用于普通(非管理)Message Queue 客户机用户。多数客户机用户将访问 user 组中已经过验证的代理。默认情况下,该组中的应用程序客户机用户可以生成和使用所有主题和队列的消息,也可以浏览任意队列中的消息。
- anonymous 组。用于那些不想使用代理已知用户名(也许客户机应用程序不知道可以使用的实际用户名)的 Message Queue 客户机。这类似于多数 FTP 服务器中的匿名帐户。您一次只能为 anonymous 组指定一个用户。与 user 组相比,您需要通过访问控制限制此组的访问权限,或者在部署时从该组中删除用户。
要更改某个用户所属的组,您必须删除该用户的条目,然后再添加一个用户条目并为其指定一个新组。
您可以指定访问规则,定义组成员可以执行哪些操作。有关详细信息,请参见“授权用户: 访问控制属性文件”。
状态
向信息库中添加用户时,用户的默认状态是活动的。要使用户处于非活动状态,您必须使用 update 命令。例如,以下命令将使用户 JoeD 处于非活动状态:
imqusermgr update -u JoeD -a false
处于非活动状态的用户条目将保留在信息库中,但不能打开新连接。当某个用户处于非活动状态时,如果您试图添加具有相同名称的另一个用户,操作将失败。必须删除处于非活动状态的用户条目,或者更改新用户的名称,或者为新用户指定不同的名称。这样可以防止添加重复的用户名。
用户名和密码的格式
用户名和密码必须遵循以下原则:
- 用户名不能包含表 8-4 中列出的字符。
- 用户名和密码不能包含新行符或回车符。
- 如果用户名或密码包含空格,必须将整个用户名或密码放在引号中。
- 用户名或密码必须至少包含一个字符。
- 除了命令 shell 规定的命令行中最多可输入的字符数之外,密码或用户名的长度没有限制。
填充和管理用户信息库
要在信息库中添加用户,可以使用 add 子命令。例如,以下命令将向默认代理实例用户信息库添加用户名为 Katharine,密码为 sesame 的用户。
imqusermgr add -u Katharine -p sesame -g user
要从信息库中删除用户,可以使用 delete 子命令。例如,以下命令将删除用户 Bob:
imqusermgr delete -u Bob
要更改用户的密码或状态,可以使用 update 子命令。例如,以下命令将 Katharine 的密码更改为 alladin:
imqusermgr update -u Katharine -p alladin
要列出一个或所有用户的相关信息,可以使用 list 命令。以下命令将显示用户名为 isa 的相关信息:
imqusermgr list -u isa
% imqusermgr list -u isa
User repository for broker instance:imqbroker
----------------------------------
User Name Group Active State
----------------------------------
isa admin true
以下命令将列出所有用户的相关信息:
imqusermgr list
更改默认的管理员密码
为安全起见,应该将 admin 的默认密码更改为只有您自己知道的密码。为此,需要使用 imqusermgr 工具。
以下命令将 mybroker 代理实例的默认密码更改为 grandpoobah。
imqusermgr update -i mybroker -u admin -p grandpoobah
要快速确认此更改是否已生效,可以在代理实例运行时运行任何命令行工具。例如,可以使用以下命令:
imqcmd list svc -i mybroker -u admin -p grandpoobah
使用旧密码将失败。
更改密码后,使用任何 Message Queue 管理工具(包含管理控制台)时都应该提供新密码。
使用 LDAP 服务器管理用户信息库
如果要使用 LDAP 服务器管理用户信息库,必须在实例配置文件中设置某些代理属性。设置这些属性后,不论何时某个用户试图连接到代理实例或执行某些信息传送操作,代理实例将在 LDAP 服务器中查询用户和组的相关信息。此实例配置文件 (config.properties) 位于一个目录中,该目录用与此配置文件相关联的代理实例的名称 (instanceName) 标识(请参见附录 A“Message Queue 数据的位置”):
…/instances/instanceName/props/config.properties
编辑配置文件以使用 LDAP 服务器
- 通过设置以下属性,指定您正在使用 LDAP 用户信息库:
imq.authentication.basic.user_repository=ldap
- 设置 imq.authentication.type 属性,确定是以 Base64 编码的形式 (basic) 还是以 MD5 摘要的形式 (digest) 将密码从客户机传送给代理。使用 LDAP 目录服务器管理用户信息库时,必须将验证类型设置为 basic。例如,
imq.authentication.type=basic
- 还必须设置控制 LDAP 访问的代理属性。表 8-5 列出了存储在代理实例配置文件中的这些属性。Message Queue 使用 JNDI API 与 LDAP 目录服务器进行通信。有关这些属性的语法及其所引用术语的详细信息,请参见 JNDI 文档。Message Queue 使用 Sun JNDI LDAP 提供者并使用简单验证。
Message Queue 支持 LDAP 验证故障转移:可以为要试图进行的验证指定 LDAP 目录服务器列表(请参见表 8-5 中的 imq.user.repos.ldap.server 属性)。
表 8-5 LDAP 相关属性
属性
说明
imq.user_repository.
ldap.serverLDAP 服务器的 host:port,其中 host 指定运行目录服务器的主机的全限定 DNS 名称,port 指定目录服务器用于通信的端口号。要指定故障转移服务器的列表,请使用以下语法: host1:port1 ldap://host2:port2 ldap://host3:port3列表中的条目以空格分隔。请注意:第一个地址后的每个故障转移服务器的地址均以 ldap 开头。
imq.user_repository.
ldap.principal代理用来绑定到目录服务器以进行搜索时使用的独特名称。如果目录服务器允许匿名搜索,则无需为此属性指定值。
imq.user_repository.
ldap.password与代理使用的独特名称关联的密码。只能在密码文件中指定此属性(请参见“使用密码文件”)。
有多种提供密码的方式。最安全的方式是让代理提示您输入密码。较安全的方式是使用密码文件并对密码文件进行读保护。最不安全的方式是使用下列命令行选项指定密码:imqbrokerd -ldappassword。
如果目录服务器允许匿名搜索,则无需输入密码。
imq.user_repository.
ldap.base用户条目的目录库。
imq.user_repository.
ldap.uidattr提供者特定的属性标识符,其值用于唯一标识一个用户。例如:uid、cn 等。
imq.user_repository.
ldap.usrfilterJNDI 搜索过滤器(以逻辑表达式的形式表示搜索查询)。通过为用户指定搜索过滤器,代理可以缩小搜索范围,从而使搜索更有效。有关详细信息,请参见位于以下位置的 JNDI 教程:http://java.sun.com/products/jndi/tutorial。
此属性并不是必须设置的。
imq.user_repository.
ldap.grpsearch指定是否启用组搜索的布尔值。请参见 LDAP 提供者提供的文档,决定您是否可以将用户与组相关联。
请注意,Message Queue 不支持嵌套组。
默认值:falseimq.user_repository.
ldap.grpbase组条目的目录库。
imq.user_repository.
ldap.gidattr提供者特定的属性标识符,其值为组名。
imq.user_repository.
ldap.memattr组条目中的属性标识符,其值是组成员的独特名称。
imq.user_repository.
ldap.grpfiltlerJNDI 搜索过滤器(以逻辑表达式的形式表示搜索查询)。通过为组指定搜索过滤器,代理可以缩小搜索范围,从而使搜索更有效。有关详细信息,请参见位于以下位置的 JNDI 教程:
http://java.sun.com/products/jndi/tutorial
此属性并不是必须设置的。
imq.user_repository.
ldap.timeout指定搜索的时间限制(以秒为单位)的一个整数。
默认值为 180 秒。imq.user_repository.
ldap.ssl.enabled指定代理在与 LDAP 服务器通信时是否应使用 SSL 协议的布尔值。
默认值为 false。请参见代理的 default.properties 文件,查看样例(默认)LDAP 用户信息库相关属性的设置。
- 必要时还需要编辑访问控制属性文件中的用户/组和规则。有关使用访问控制属性文件的详细信息,请参见“授权用户: 访问控制属性文件”。
- 如果您希望代理在连接验证和组搜索时通过 SSL 与 LDAP 目录服务器进行通信,您需要在 LDAP 服务器中激活 SSL,然后在代理配置文件中设置以下属性:
授权用户: 访问控制属性文件连接到代理实例后,用户可能希望生成消息、在目标上使用消息或在队列目标上浏览消息。当用户试图进行此类操作时,代理将检查代理特定的访问控制属性文件(ACL 文件),确认该用户是否有权执行此操作。ACL 文件包含指定某个用户(或一组用户)可以执行哪些操作的规则。默认情况下,所有授权用户都可以在任何目标上生成和使用消息。您可以编辑 ACL 文件,将这些操作限制到某些用户和组。
不管用户信息是放置在文本文件用户信息库(请参见“使用文本文件用户信息库”)中还是放置在 LDAP 用户信息库(请参见“使用 LDAP 服务器管理用户信息库”)中,都使用 ACL 文件。
创建访问控制属性文件
ACL 文件是特定于实例的。默认的文件(名为 accesscontrol.properties)是为启动的每个代理实例创建的。此 ACL 属性文件所在目录用与该 ACL 文件相关联的代理实例的名称 (instanceName) 标识(请参见附录 A“Message Queue 数据的位置”):
…/instances/instanceName/etc/accesscontrol.properties
ACL 文件的格式与 Java 属性文件类似。首先定义文件的版本,然后指定访问控制规则,规则分为三部分:
version 属性定义 ACL 属性文件的版本,不能更改此条目。
version=JMQFileAccessControlModel/100
下面介绍指定访问控制的 ACL 文件的三个组成部分,然后说明访问规则的基本语法并介绍如何计算权限。
访问规则语法
在 ACL 属性文件中,访问控制用于定义特定用户或组对受保护的资源(如目标和连接服务)具有哪些访问权限。访问控制由一个规则或一组规则组成,每个规则都由一个 Java 属性表示:
这些规则的基本语法如下:
resourceType.resourceVariant.operation.access.principalType = principals
表 8-6 介绍了语法规则的元素。
表 8-6 访问规则的语法元素
元素
说明
resourceType
下列选项之一:connection、queue 或 topic。
resourceVariant
resourceType 指定的类型的一个实例。例如,myQueue。通配符 (*) 可用于表示所有连接服务类型或所有目标。
operation
其值取决于所设置访问规则的类型。
access
下列选项之一:allow 或 deny。
principalType
下列选项之一:user 或 group。有关详细信息,请参见“组”。
principals
可能具有规则左侧指定了访问权限的人。如果 principalType 是 user,则可能是单个用户或以逗号分隔的用户列表;如果 principalType 是 group,则可能是单个组或以逗号分隔的组列表。通配符 (*) 可用于表示所有用户或所有组。
下面是一些访问规则实例:
- 以下规则表示所有用户都可以向名为 q1 的队列发送消息。
queue.q1.produce.allow.user=*
- 以下规则表示任何用户都可以向任何队列发送消息。
queue.*.produce.allow.user=*
注意
要指定非 ASCII 用户、组或目标名称,必须使用 Unicode 换码符 (\uXXXX) 表示法。如果在您编辑并保的 ACL 文件中,这些名称采用了非 ASCII 编码,则可以通过 Java native2ascii 工具将此文件转换为 ASCII。有关详细信息,请访问 http://java.sun.com/j2se/1.4/docs/guide/intl/faq.html
权限计算
计算一系列规则所代表的权限时需应用以下原则:
- 指定的访问规则将覆盖一般访问规则。应用以下两条规则之后,所有用户都可以向所有队列发送消息,但是 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。默认情况下,所有用户都可以访问 NORMAL 类型的连接服务,但只有 admin 组中的用户可以访问 ADMIN 类型的连接服务。
您可以编辑连接访问控制规则,限制某个用户的连接访问权限。例如,以下规则将拒绝 Bob 访问 NORMAL,但允许其他人访问:
connection.NORMAL.deny.user=Bob
connection.NORMAL.allow.user=*
可以使用星号 (*) 指定所有授权用户或组。
不能创建自己的服务类型,只能使用常量 NORMAL 和 ADMIN 指定的预定义类型。
目标访问控制
访问控制属性文件的目标访问控制部分包含基于目标的访问控制规则。这些规则决定谁(用户/组)可以在哪里(目标)执行什么(操作)。这些规则控制的访问类型包括向队列发送消息、向主题发布消息、从队列接收消息、订阅主题以及浏览队列中的消息。
默认情况下,任何用户或组都能够对任何目标进行任意类型的访问。您可以添加更多特定的目标访问规则或编辑默认的规则。本节下面介绍目标访问规则的语法,必须理解该语法才能编写自己的规则。
目标规则的语法如下:
resourceType.resourceVariant.operation.access.principalType = principals
表 8-7 列出了这些元素:
表 8-7 目标访问控制规则的元素
组件
说明
resourceType
必须是 queue 或 topic 其中之一。
resourceVariant
某个目标名或所有目标 (*),星号表示所有队列或所有主题。
operation
必须是 produce、consume 或 browse 其中之一。
access
必须是 allow 或 deny 其中之一。
principalType
必须是 user 或 group 其中之一。
可以将访问权限授予一个或多个用户和/或一个或多个组。
以下示例说明了不同类型的目标访问控制规则:
目标自动创建访问控制
ACL 属性文件的最后一部分访问规则指定代理将为哪些用户和组自动创建目标。
当用户在尚不存在的目标上创建生成方或使用方时,如果代理的 auto-create 属性已启用且物理目标尚不存在,代理将会创建该目标。
默认情况下,任何用户或组都有权让代理为其自动创建一个目标。此特权由以下规则指定:
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 的服务(企业版)Message Queue 企业版支持基于安全套接字层 (SSL) 标准的连接服务:通过 TCP/IP(ssljms 和 ssladmin)和通过 HTTP (httpsjms)。这些基于 SSL 的连接服务允许对在客户机和代理之间传递的消息进行加密。当前的 Message Queue 发行版支持基于自签名服务器证书的 SSL 加密。
要使用基于 SSL 的连接服务,需要使用密钥工具实用程序 (imqkeytool) 生成专用密钥/公用密钥对。此实用程序将公用密钥嵌入自签名证书,此证书将传递给请求连接代理的客户机,客户机需要使用该证书建立加密连接。
尽管 Message Queue 基于 SSL 的连接服务在概念上很相似,但它们的设置方法却不尽相同。因此以下各节将分别讨论通过 TCP/IP 和通过 HTTP 的安全连接。
设置通过 TCP/IP 的基于 SSL 的服务
有三种基于 SSL 的连接服务通过 TCP/IP 提供直接、安全的连接。
ssljms 此连接服务用于在客户机和代理之间通过安全、加密的连接传送消息。
ssladmin 此连接服务用于在 Message Queue 命令行实用程序 (imqcmd)(命令行管理工具)和代理之间创建安全、加密的连接。不支持管理控制台 (imqadmin) 安全连接。
群集 此连接服务用于在群集的代理之间通过安全、加密的连接传送消息(请参见“安全的交叉代理连接”)。
设置基于 SSL 的连接服务
设置 ssljms 和 ssladmin 连接服务的过程基本相同,不同之处在于步骤 4,配置并运行客户机。
下文详细介绍了每个步骤。
步骤 1:生成自签名证书
Message Queue 的 SSL 支持用于保护所传输数据的安全,假定客户机正在与已知且可信任的服务器进行通信。因此,仅使用自签名证书实现 SSL。
运行 imqkeytool 命令,为代理生成自签名证书。可以对 ssljms 连接服务、ssladmin 连接服务或群集连接服务使用相同的证书。在命令提示符下输入以下内容:
imqkeytool -broker
命令行实用程序会提示您提供所需的信息。(在 UNIX 操作系统上,可能需要以超级用户 (root)身份运行 imqkeytool 命令,以获得创建密钥存储所需的权限。)
首先,imqkeytool 提示您输入密钥存储密码,然后提示您输入组织信息,最后提示您进行确认。收到您的确认后,它将在生成密钥对时暂停。然后它要求您输入密码以锁定特定密钥对(关键字密码),此时请按回车键响应此提示:这将使关键字密码与密钥存储密码相同。
注意
请记住您提供的密码,稍后(启动代理时)您需要向代理提供此密码,使代理可以打开密钥存储。您还可以将密钥存储密码存储在密码文件中(请参见“使用密码文件”)。
运行 imqkeytool 命令以运行 JDK keytool 实用程序,生成自签名证书并将其放置 Message Queue 的密钥存储中。密钥存储所在的目录因操作系统而异,如附录 A“Message Queue 数据的位置”中所示
密钥存储格式与 JDK1.2 keytool 实用程序支持的格式相同。
表 8-8 列出了 Message Queue 密钥存储的可配置属性。(有关配置这些属性的说明,请参见第 5 章“启动与配置代理”)。
表 8-8 密钥存储属性
属性名称
说明
imq.keystore.file.dirpath
适用于基于 SSL 的服务:指定包含密钥存储文件的目录的路径。
默认值:请参见附录 A“Message Queue 数据的位置”。imq.keystore.file.name
适用于基于 SSL 的服务:指定密钥存储文件的名称。
默认值:Keystoreimq.keystore.password
适用于基于 SSL 的服务:指定密钥存储密码。只能在密码文件中指定此属性(请参见“使用密码文件”)。
有多种提供密码的方式。最安全的方式是让代理提示您输入密码。较安全的方式是使用密码文件并对密码文件进行读保护。最不安全的方式是使用下列命令行选项指定密码:imqbrokerd -ldappassword。
您可能需要重新生成密钥对以解决某些问题,例如:
出现异常的原因可能是您提供的密码与您在“步骤 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. 启动代理
启动代理并提供密钥存储密码。可以通过以下方法之一提供密码:
- 让代理启动时提示您输入密码:
imqbrokerdPlease enter Keystore password:mypassword
- 使用 imqbrokerd 命令的 -password 选项:
imqbrokerd -password mypassword
- 将密码放在代理启动时访问的密码文件中(请参见“使用密码文件”)。您需要首先设置以下代理配置属性(请参见“编辑实例配置文件”):
imq.passfile.enabled=true
要查看与密码文件相关的代理属性列表,请参见表 2-6。
启用带有 SSL 的代理或客户机时,您可能会注意到它在几秒钟内使用了大量的 CPU 资源。这是因为 Message Queue 使用 JSSE(Java 安全套接扩展)来实现 SSL。JSSE 使用 java.security.SecureRandom() 生成随机数。此方法需要大量时间生成初始随机数初始化向量,这就是您看到 CPU 使用增加的原因。生成初始化向量后,CPU 的使用将降到正常水平。
步骤 4:配置并运行基于 SSL 的客户机
最后,您需要配置客户机以使用安全连接服务。根据您使用的连接服务,有两种类型的客户机:使用 ssljms 的应用程序客户机和使用 ssladmin 的 Message Queue 管理客户机(如 imqcmd)。下面分别介绍这两种客户机。
应用程序客户机
您需要确保客户机的类路径中有必需的安全套接扩展 (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 Java Client Developer's Guide》中有关使用受管理对象的章节。
管理客户机 (imqcmd)
您可以通过在使用 imqcmd 时包含 -secure 选项来建立一个安全管理连接(请参见表 6-2),例如:
imqcmd list svc -b hostName:port -u adminName -p adminPassword -secure
其中 adminName 和 adminPassword 是 Message Queue 用户信息库中的有效条目。(如果使用的是文本文件信息库,请参见“更改默认的管理员密码”)。
列出连接服务是查看 ssladmin 服务是否正在运行的一种方法,您可以成功建立安全管理连接,如以下输出所示:
列出指定的代理上的所有服务:
Host Primary Port
localhost 7676
Service Name Port Number Service State
admin 33984 (dynamic) RUNNING
httpjms - UNKNOWN
httpsjms - UNKNOWN
jms 33983 (dynamic) RUNNING
ssladmin 35988 (dynamic) RUNNING
ssljms dynamic UNKNOWN
成功列出服务。
设置通过 HTTP 的 SSL 服务
在这种基于 SSL 的连接服务 (httpsjms) 中,客户机和代理通过 HTTPS 隧道 Servlet 建立安全连接。有关 HTTPS 支持所需的体系结构以及实现方案,请参见附录 C“HTTP/HTTPS 支持(企业版)”。
使用密码文件如果您不希望代理启动时提示您输入密码,或者要求您作为 imqbrokerd 命令选项提供密码,您可以将所需的密码放在密码文件中。然后可以在启动代理时使用 -passfile 选项指定密码文件:
imqbrokerd -passfile myPassfile
密码文件是包含密码的纯文本文件。该文件没有加密,因此没有手动提供密码安全。但您可以为该文件设置权限,限制哪些用户可以查看它。在密码文件中设置的权限需要为启动代理的用户提供读访问权限。
表 8-9 列出了密码文件可能包含的密码:
表 8-9 密码文件中的密码
密码
说明
imq.keystore.password
为基于 SSL 的服务指定密钥存储密码(请参见表 8-8)。
imq.user_repository.ldap.password
指定与代理的独特名称(用于绑定到已配置的 LDAP 用户信息库)相关联的密码(请参见表 8-5)。
imq.persist.jdbc.password
指定必要时用于打开数据库连接的密码(请参见表 B-1)。
样例密码文件所在的位置因操作系统而异,如附录 A“Message Queue 数据的位置”中所示。