除了基于文件的内置验证机制以及基于 LDAP 的内置验证机制外,Message Queue 还支持 Java 验证和授权服务 (Java Authentication and Authorization Service, JAAS),它允许将各种服务插入到代理中以验证 Message Queue 客户端。本部分介绍了代理为符合 JAAS 的验证服务提供的信息,并且说明了如何配置代理以使用此类服务。
而介绍 JAAS API 则超出了本文档的范围。如果需要了解更多信息,请参考以下资源。
有关 JAAS API 的完整信息,请参见《Java Authentication and Authorization Service (JAAS) Reference Guide》。
http://java.sun.com/j2se/1.5.0/docs/guide/security/jaas/JAASRefGuide.html
有关编写 LoginModule 的信息,请参见《 Java Authentication and Authorization Service (JAAS) LoginModule Developer's Guide》。
http://java.sun.com/j2se/1.5.0/docs/guide/security/jaas/JAASLMDevGuide.html
JAAS API 是 J2SE 中的核心 API,因此, 它是 Message Queue 运行环境中的一个不可或缺的组成部分。JAAS 在应用程序和验证机制之间定义了一个抽象层,它无需更改应用程序代码即可插入所需的机制。对于 Message Queue 服务,抽象层位于代理(应用程序)和验证提供者之间。通过设置几个代理属性,您可以插入任何符合 JAAS 的验证服务并升级此服务,而不会产生中断或需要更改代理代码。
如果使用的是基于 JAAS 的验证,则可以使用 JMX 客户端来管理代理,但必须先手动设置 JAAS 支持(通过设置与 JAAS 相关的代理属性),然后才能启动代理。无法使用 JMX API 更改这些属性。
图 1–1 显示了 JAAS 的基本元素:JAAS 客户端、符合 JAAS 的验证服务以及 JAAS 配置文件。
JAAS 客户端是一个应用程序,它需要使用符合 JAAS 的验证服务来执行验证。它使用 LoginModule 与此服务进行通信并负责提供回调处理程序,LoginModule 可以调用此处理程序以获取用户名、密码以及其他相关信息。
符合 JAAS 的验证服务包含一个或多个 LoginModule 以及执行所需验证的逻辑。LoginModule 可以包含验证逻辑,也可以使用专用协议或 API 与提供该逻辑的模块进行通信。
JAAS 配置文件是一个文本文件,JAAS 客户端使用该文件来查找与 JAAS 服务进行通信所需的LoginModule。
下一部分说明了 Message Queue 服务如何使用这些元素来提供符合 JAAS 的验证。
下图说明了 Message Queue 代理如何使用 JAAS。它显示了上图所示的 JAAS 模型的更复杂实现。
与更简单的示例所显示的一样,验证服务层与代理是分开的。验证服务包含一个或多个登录模块 (LoginModule) 以及附加验证模块(如果需要)。登录模块在与代理相同的 Java 虚拟机中运行。对于登录模块来说,Message Queue 代理表示为 LogInContext,并通过 CallBackHandler(作为代理运行时代码的一部分)与登录模块进行通信。
验证服务还提供一个 JAAS 配置文件,其中包含登录模块的入口。该配置文件指定了这些模块的使用顺序以及一些使用条件。在代理启动时,JAAS 通过 Java 系统属性 java.security.auth.login.config 或 Java 安全属性文件来查找该配置文件。然后,它根据代理属性 imq.user_repository.jaas.name 的值在 JAAS 配置文件中选择一个入口。该入口指定将用于验证的登录模块。正如图中所示,代理可以使用多个登录模块。(图 1–3 显示了配置文件、登录模块和代理之间的关系。)
代理使用 JAAS 插件验证服务这一情况对 Message Queue 客户端来说仍是完全透明的。客户端继续像以前一样连接到代理,以便传递用户名和密码。反过来,代理使用回调处理程序将此信息传递给验证服务,该服务使用此信息验证用户并返回结果。如果验证成功,代理将允许建立连接;如果失败,客户端运行时环境将返回 JMS 安全异常,客户端必须对其进行处理。
验证 Message Queue 客户端后,如果要进行进一步授权,代理将按正常方式继续操作;它将查看访问控制文件,以确定是否授权经过验证的客户端执行它要完成的操作:访问目的地、使用消息和浏览队列等。
设置符合 JAAS 的验证的过程包括设置一些代理和系统属性,以便选择这种验证类型、指定配置文件位置以及指定要使用的登录模块入口。
本部分说明了 JAAS 客户端、登录模块和 JAAS 配置文件是如何相互关联的,然后介绍了设置符合 JAAS 的验证所需的过程。下图显示了配置文件、登录模块和代理之间的关系。
正如图中所示,JAAS 配置文件 MyJAASCFile.config 包含对几个登录模块(组合在一个入口点中)的引用。代理通过查看 Java 系统属性 java.security.auth.login.config 或 Java 安全属性文件来查找配置文件。要使用的登录模块是通过查看代理属性 imq.user_repository.jaas.name 确定的,该属性指定配置文件中的所需入口。可以在 lib/ext 目录中找到这些模块的类。
要为 Message Queue 设置 JAAS 支持,您必须完成以下步骤。(在开发环境中,可以由开发者完成所有这些步骤。在生产环境中,将由管理员完成其中的某些任务。)
创建一个或多个用于实现验证服务的登录模块类。下面列出了代理支持的 JAAS 回调类型。
代理使用此回调为验证服务传递代理运行的语言环境。可以使用该值来进行本地化。
代理使用此回调为验证服务传递 Message Queue 客户端在请求连接时指定的用户名。
当 TextInputCallback.getPrompt() 为 imq.authentication.type 时,代理使用此回调为验证服务指定 imq.authentication.type 的值。目前,此字段的值只能为 basic。这表示使用 Base-64 密码编码。
代理使用此回调为验证服务传递 Message Queue 客户端在请求连接时指定的密码。
通过将文本输出记录到代理日志文件中,代理使用此回调为验证服务提供日志记录服务。回调的消息类型 ERROR、INFORMATION、WARNING 分别映射到代理日志级别 ERROR、INFO 和 WARNING。
使用引用登录模块类的入口创建 JAAS 配置文件,并为 Message Queue 管理员指定此文件的位置。(可以远程查找该文件,并且可以使用 url 指定其位置。)
记下 JAAS 配置文件中的入口(它引用登录实现类)的名称。
将用于实现登录模块的类归档为 jar 文件,然后将 jar 文件放在 Message Queue 的 lib/ext 目录中。
配置与 JAAS 支持相关的代理属性。表 1–2 对此进行了描述。
设置以下系统属性以指定 JAAS 配置文件的位置。
java.security.auth.login.config= JAAS_Config_File_Location
例如,可以在启动代理时指定配置文件。
imqbrokerd -Djava.security.auth.login.config=JAAS_Config_File_Location
可以使用其他方法来指定 JAAS 配置文件的位置。有关其他信息,请参见
http://java.sun.com/j2se/1.5.0/docs/guide/security/jaas/tutorials/LoginConfigFile.html
下表列出了设置 JAAS 支持所需的代理属性。
表 1–2 用于 JAAS 支持的代理属性
属性 |
描述 |
---|---|
imq.authentication.type |
设置为 basic 以表示使用 Base-64 密码编码。这是 JAAS 验证唯一允许的值。 |
imq.authentication.basic.user_repository |
设置为 jaas 以指定 JAAS 验证。 |
imq.accesscontrol.type |
设置为 file。 |
imq.user_repository.jaas.name |
设置为 JAAS 配置文件中的所需入口的名称,该入口引用要用作验证机制的登录模块。这是在步骤 3 中记下的名称。 |
imq.user_repository.jaas.userPrincipalClass |
此属性(由 Message Queue 访问控制使用)指定登录模块中的 java.security.Principal 实现类,代理使用该类来提取主体名称,以表示 Message Queue 访问控制文件中的用户实体。如果未指定此属性,则改用在请求连接时从 Message Queue 客户端传递的用户名。 |
imq.user_repository.jaas.groupPrincipalClass |
此属性(由 Message Queue 访问控制使用)指定登录模块中的 java.security.Principal 实现类,代理使用该类来提取主体名称,以表示 Message Queue 访问控制文件中的组实体。如果未指定此属性,则忽略 Message Queue 访问控制文件中的组规则(如果有)。 |