任务:消息: 理解 WebSphere MQ 授权和 setmqaut 命令

  配置文件、实体和分组

  从最简单形式来说IBM WebSphere MQ 授权控制将为单对象实体赋予组权限但是在实战中赋予特定用户有效授权可能来自些访问控制实体(在 WebSphere MQ 术语中称作配置文件)它们可能已经应用于多个分组有效访问是指结合所有可应用配置文件包括所有可应用分组或帐户要理解所有这些知识点您需要了解配置文件、帐户和分组的间交互以及用于管理这些设置工具

  为了演示配置文件和实体的间区别交互请看以下 3个用例:

  在 第个用例 中个应用将建立连接、发起请求并等待回复可以使用些配置文件来建立这个简单模式

  第 2个用例 是来自相邻队列管理器连接您要求访问将消息保存到所有用户定义队列中但不会为相邻队列管理器赋予管理权限这个用例将展示区别访问控制列表和特定队列集的间交互

  最后个用例 将展示如何累计来自多个源访问在此场景中个虚构开发人员会将 “Foo” 项目迁移到 “Bar” 项目上由于 Foo 和 Bar 应用的间将彼此进行交互因此它们都需要访问些相同队列但权限各不相同您将看到和开发人员帐户相关联分组成员身份在更新时访问权限将如何随时间不断变化

  在深入探讨的前我们有必要在此上下文中给些术语实体定义授权可以应用若干个区别层次其中最低层次是单独帐户此帐户可能属于某个人类用户、应用、系统工具、信息代理或者监控器通常属于人类帐户被称作用户 ID 而应用和工具所使用帐户则被称作 服务帐户当差异无关紧要时可以将帐户更加通用地表示为主体(principal)mqaut 命令中 –p 选项

  授权还可以应用于分组级别分组表示零个或多个主体些模型中比如 Windows® Active Directory甚至可以将权限授予包含域分组本地分组其中还包含主体

  在本文中实体表示授权规则可以应用到任何内容根据平台和帐户管理工具授予权限实体还可以是单独帐户或本地分组当主体和分组的间差异无关紧要时相关对象可表示为实体

  归纳如下:

  用户 ID 和服务帐户是主体

  主体和分组是实体

  在本文其余部分我将使用最适用术语

  用例 #1:授权应用

  还记得在本用例中应用需要连接到队列管理器添加个消息到队列中并获得回复远程应用通过 SVRCONN 通道建立连接和本地应用采用绑定模式建立连接所需权限是相同差异在于 WebSphere MQ 获取主体方式

  在本地绑定模式连接中主体是和连接到队列管理器进程相关联帐户由于连接到进程在本地运行因此 WebSphere MQ 可以通过查找进程表来获取进程所有者经过操作系统验证后帐户是可以信赖

  对于使用客户机通道连接远程应用来说主体是通道 MCAUSER 属性中帐户如果 MCAUSER 硬编码在通道定义中或者经过验证则该帐户可以信赖

  应用服务帐户 apple 是 fruit 分组成员授予所需权限命令应如下所示:

mqaut -m VENUS -t qmgr -g fruit -all +inq +connect 
mqaut -m VENUS -t queue -g fruit -n FRUIT.REQUEST -all +put +inq 
mqaut -m VENUS -t queue -g fruit -n FRUIT.REPLY -all +get +browse +inq


  指定队列管理器

  –m 选项还用于指定将应用命令队列管理器如果定义了默认队列管理器则可以省略 –m 选项但不建议这样做在需要考虑安全性情况下最佳方式是使用最明确命令语法以实现所需结果指定 –m 选项需要掌握目标队列管理器信息省略该选项也需要掌握相同信息但还需要管理员明确当前设定默认本地队列管理器在任何情况下使用 –m 选项来明确指定队列管理器都会更加简单和可靠

  授权分组和主体

  举例中个参数是 –g它用于指定分组虽然 mqaut 命令接受使用 –p 选项来指定帐户但 –g 分组选项通常是您需要其原因在于–p 将根据平台表现出区别行为在 UNIX® 和 Linux® 平台上队列管理器将查找在 –p 选项中指定主体获取指定主体主要分组然后将配置文件应用于该分组如果主体使用 staff 作为其主要分组并使用 apple 作为次要分组则使用 -p 选项时将为 staff 分组授权

  个人所见过许多在 UNIX 平台上使用 –p 选项情况并且帐户主要分组会随时间变化每次在分组成员身份更改后更新授权时配置文件都将应用于当前分组这时应用不会出现故障因此不需要提醒管理员授予了过度权限在除 Windows 以外平台上指定 –p 选项会执行隐式操作而非明确操作正如前面讨论默认队列管理器时所提到明确操作始终是首选

  在 Windows 平台上–p 选项行为则区别它实际上会解析为单独帐户但是这并不是成不变因此在 Windows 主机上使用 –p 选项时仍然需要格外注意

  我们来考虑 Windows 将如何解析针对 applid 主体查询首先搜索本地 Security Account Manager (SAM) 数据库查找匹配帐户如果找到了本地帐户则始终使用它但是如果未找到本地帐户则 Windows 服务器将查询它所信任所有域搜索这些域顺序是不确定因此如果匹配帐户存在于多个域中则无法预先知道哪个帐户例子将解析查询

  这点非常重要在执行 mqaut 命令时所创建配置文件将包含 Security ID (SID)而不是串版本帐户名SID 是特定域中特定帐户全局惟标识符如果 applid 同时存在于 DoA 和 DoB 中则每个例子都会有和的相关 UIDmqaut 命令将接收解析执行命令例子 SID这可能是也可能不是在运行时查找帐户时返回相同例子

  在指定主体时可以解决这种不明确性其思路方法是通过所需域名限定它mqaut 命令和 MCAUSE 通道属性正确格式是 user@do其中do 是实际域名或本地主机名称在使用这种格式时Windows 会正确解析所需域中主体即使个帐户在多个位置有相同名称

  但是不能通过这种方式来指定分组WebSphere MQ 认可分组是在托管队列管理器服务器上本地定义分组因此如果 Windows 队列管理器授权将基于分组则相关主体必须属于本地分组或者属于本地分组成员域分组

  考虑到这些原因我建议只在 Windows 主机上使用 mqaut –p 选项然后使用 user@do 格式完全限定帐户以下举例展示了 –p 选项建议使用思路方法:

mqaut -m VENUS -t qmgr -p user1@mqhost -all +inq +connect

  权限规范标准

  mqaut 命令中最后个参数是将授权权限注意此处提供举例都包含 -all后面紧跟其他权限比如 +inq 和 +connect其原因在于mqaut 命令是可以累计

  举例来说考虑以下命令结果:

C:\>mqaut -m VENUS -t qmgr -g fruit +dsp 
The mqaut command completed successfully. 
 
C:\>mqaut -m VENUS -t qmgr -g fruit +inq +connect 
The mqaut command completed successfully. 
 
C:\>dspmqaut -m VENUS -t qmgr -g fruit 
Entity fruit has the following authorizations for object VENUS: 
 inq 
 connect 
 dsp


  注意前两条命令结果是结合在当 –all 添加到第 2条命令的后它会替换的前设置授权而不是添加权限

C:\>mqaut -m VENUS -t qmgr -g fruit +dsp 
The mqaut command completed successfully. 
 
C:\>mqaut -m VENUS -t qmgr -g fruit +inq +connect 
The mqaut command completed successfully. 
 
C:\>dspmqaut -m VENUS -t qmgr -g fruit 
Entity fruit has the following authorizations for object VENUS: 
 inq 
 connect


  其目通常在于mqaut 命令会替换的前任何配置文件而不是继续添加配置文件–all 参数将确保这过程顺利执行

  +inq 重要性

  注意以上举例都提供了 +inq其原因在于WebSphere MQ 对象些属性专用于使用这些对象将信息传递给应用举例来说BOQNAME 属性可以保存回退(backout)队列名称(该队列可以包含问题消息)BOQTHRESH 属性包含在将消息存放到回退队列的前可以回退(backout)次数

  查询可以在许多情况下发生即使不受应用代码控制举例来说JMS 类将查询应用是否明确执行 BOQNAME 和 BOQTHRESH通用规则是被适当允许连接到队列管理器任何实体都应该授予 +inq 权限

  用例 #1 整理总结

  在第个用例中分组 fruit 授予了连接到队列管理器、查询请求队列以及获取、浏览和查询回复队列权限在此举例中配置文件和所应用对象的间存在对应关系

  默认情况下不在 mqm 分组中任何主体都不具备访问权限运行 3个命令的后fruit 分组成员将限制于特定操作仅为 fruit 分组成员主体将不能执行其他活动

  用例 #2:相邻列队管理器

  此用例是基本 WebSphere MQ 管理基石其目标是为相邻队列管理器赋予广泛权限允许将消息添加到本地队列管理器用户定义队列中同时赋予管理权限

  来自其他队列管理器通道(在 WebSphere MQ 术语中称作 MCA 通道)有 3种形式:RCVR、RQSTR 和 CLUSRCVR您可能知道所有入站通道都具有队列管理器完整权限因此可以访问所有队列为了限制访问需要强制通道使用低权限帐户为此可以将通道 MCAUSER 值设置为适当帐户

  专用于此目任何帐户都可以但我倾向于选择易于识别有管理权限帐户名考虑到这些原因我为 RCVR、RQSTR 和 CLUSRCVR 通道使用 mqmmca 帐户mqm 部分可联系到用于管理 WebSphere MQ mqm 帐户希望帐户管理员已经将 mqm 帐户和分组作为管理帐户对待并限制对它们访问其他名称为 mqm* 帐户和分组也具有相同控制帐户名 mca 部分表示帐户特定于 MCA 通道同样我为 MQI 通道(多称作客户机或 SVRCONN 通道)使用类似 mqmmqi 帐户两种通道权限需求稍有区别因此创建区别帐户和分组是非常重要点将在下个用例中详细解释

  因此对于名称为 mqmmca 帐户和分组应该如何将它赋予大量队列呢?在创建配置文件的前帐户不具有权限但使用第个用例中窍门技巧需要为通道访问个队列都创建个配置文件这不仅极为耗费人力工作而且非常脆弱不堪每个队列都需要个配置文件;忘记创建配置文件会造成应用中断更加合理思路方法是建立个默认 “允许所有(allow-all)” 策略个配置文件来管理多个队列幸运mqaut 提供了相应配置在配置文件名称中使用通配符可以实现通用配置文件

  通用配置文件

  WebSphere MQ 对象名通常由点分隔节点构成mqaut 命令支持在名称中使用问号来表示或者在节点中使用星号来表示零个或多个举例来说:AB.?D 可以匹配名称为 AB.CD、AB.DD、AB.ED 对象

  星号可匹配由点分隔零个或多个举例来说ABC.*.JKL 可以表示对象 ABC.DEF.JKL 和 ABC.GHI.JKL注意配置文件将匹配个名称为 ABC..JKL 队列它有 3个节点即使中间节点没有但是 ABC.*.JKL 不能匹配名称为 ABC.JKL 队列名称中只有两个节点

  可以在相同配置文件中使用多个问号和星号举例来说配置文件 ???.*.* 将匹配共包含 3个节点且第个节点有 3个名称

  由两个星号构成通配符将匹配零个或多个节点并且可以在名称开头、中间或结尾使用有效举例包括:

表 1. mqaut 命令中通配符

**.REPLY 匹配最后个节点为 .REPLY 所有名称
PAY.** 匹配第个节点为 PAY. 所有名称
PAY.**.REPLY 匹配第个节点为 PAY.、最后个节点为 .REPLY 且中间可包含任意个节点名称
** 匹配所有名称



  些举例将帮助您更好地理解这此处两个星号用于表示队列名称开始处零个或多个节点请注意两个星号将匹配零个或多个节点而不是个或多个节点这介绍说明在最后个举例中名称中包含个或多个节点 REPLY 都将被赋予权限

C:\>mqaut -m VENUS -t queue -n **.REPLY -g fruit -all +inq +dsp 
The mqaut command completed successfully. 
 
C:\>dspmqaut -m VENUS -n .REPLY -t queue -g fruit 
Entity fruit has the following authorizations for object .REPLY: 
 inq 
 dsp 
 
C:\>dspmqaut -m VENUS -n ..REPLY -t queue -g fruit 
Entity fruit has the following authorizations for object ..REPLY: 
 inq 
 dsp 
 
C:\>dspmqaut -m VENUS -n REPLY -t queue -g fruit 
Entity fruit has the following authorizations for object REPLY: 
 inq 
 dsp


  在下个举例中两个星号可表示名称中间多个节点

C:\>mqaut -m VENUS -t queue -n PAY.**.REPLY -g fruit -all +inq +dsp 
The mqaut command completed successfully. 
 
C:\>dspmqaut -m VENUS -n PAY.ROLL.REPLY -t queue -g fruit 
Entity fruit has the following authorizations for object PAY.ROLL.REPLY: 
 inq 
 dsp 
 
C:\>dspmqaut -m VENUS -n PAY.OVER.DRAFT.REPLY -t queue -g fruit 
Entity fruit has the following authorizations for object PAY.OVER.DRAFT.REPLY: 
 inq 
 dsp 
         
C:\>dspmqaut -m VENUS -n PAY..REPLY -t queue -g fruit 
Entity fruit has the following authorizations for object PAY..REPLY: 
 inq 
 dsp 
 
C:\>dspmqaut -m VENUS -n PAY.REPLY -t queue -g fruit 
Entity fruit has the following authorizations for object PAY.REPLY: 
 inq 
 dsp 
 
C:\>dspmqaut -m VENUS -n PAYREPLY -t queue -g fruit 
Entity fruit has the following authorizations for object PAYREPLY: 


  注意在最后个举例中PAY.**.REPLY 并不会匹配名称 PAYREPLY配置文件需要至少 PAY 和 REPLY 两个节点至少使用个点分隔同样配置文件 PAY**REPLY 也是无效两个星号必须和其他分隔开

  重叠配置文件

  通过使用通用配置文件可以将多个配置文件应用于相同对象举例来说配置文件 PAY.**、PAY.**.REPLY 和 PAY.ROLL.REPLY 都可以应用于名称为 PAY.ROLL.REPLY 队列在这种情况下其规则是最具体配置文件将用于授权检查在本例中没有通配符配置文件是最具体因此是优先在其余两个配置文件中PAY.**.REPLY 优先于 PAY.**任何匹配名称都将匹配 5个特定(而不是 3个特定)

  重叠配置文件使用可允许您为第 2个用例构建授权模式通道要求个配置文件连接到队列管理器个配置文件建立到所有队列访问而其他特定配置文件则进步限制对队列管理权限组配置文件如下所示:

mqaut -m VENUS -g mqmmca -t qmgr -all +connect +inq +all 
mqaut -m VENUS -g mqmmca -n '**' -t queue -all +put +all 
mqaut -m VENUS -g mqmmca -n SYSTEM.ADMIN.COMMAND.QUEUE -t queue -all +none 
mqaut -m VENUS -g mqmmca -n SYSTEM.DEFAULT.INITIATION.QUEUE -t queue -all +none 
mqaut -m VENUS -g mqmmca -n SYSTEM.CLUSTER.TRANSMIT.QUEUE -t queue -all +none


  ‘**’ 配置文件将为通道建立权限以便将消息添加到任何队列中由于其他配置文件更加具体因此它们将覆盖此配置文件而通道将无法将消息添加到命令队列、默认启动队列或集群传输队列

  这是限制相邻队列管理器管理权限最小基本配置此处仅用于演示在实战中此授权模式还将限制对任何用户定义启动队列、传输队列和许多 SYSTEM.** 队列访问如果队列管理器参和到集群中则需要通过 CLUSRCVR 通道访问 SYSTEM.CLUSTER.COMMAND.QUEUE 权限方面相邻队列管理器几乎永远都不需要对 SYSTEM.ADMIN.COMMAND.QUEUE 访问权限

  使用 +all 权限

  MCA 通道需要针对队列管理器和队列 +all 权限其原因在于通道代理会保留消息描述符内容它会设置所有字段以匹配来自发送队列管理器消息这包括消息 PUT 日期和时间以及用户 ID这区别于不信任普通应用设置消息上下文字段而是从队列管理器认为合适值继承这些字段因此任何 RQSTR、RCVR 或 CLUSRCVR 类型通道都需要 +all

  虽然可以像其他内部队列管理器组件那样信任 MCA 通道代理但 MQI 通道代理则不尽然这是 MQI 通道代理是由可访问整个 WebSphere MQ API 远程应用驱动虽然远程应用有时需要设置消息头部字段但这只是例外情况而不是规则作为规则不能将 +all 权限赋予 SVRCONN 类型通道

  用例 #2 整理总结

  可以使用单分组中帐户来为相邻队列管理器赋予权限如果此例发生在 Windows 主机上则可以忽略分组而直接为主体授权而不用让它成为分组成员无论何种情况重叠配置文件窍门技巧都是先建立个 “允许所有” 默认策略然后再使用更加严格限制来重叠特定队列通用配置文件使用可允许对新创建队列自动执行策略并通过非常细粒度来指定例外情况

  用例 #3:虚构开发人员

  在上个用例中授权主体权限仅由个配置文件驱动如果有两个配置文件匹配相同对象则最具体配置文件将优先并完全覆盖另个配置文件中指定权限个举例展示了另个情况:当所涉及主体是多个分组成员并且这些分组具有区别权限时可以累计多个配置文件中权限

  在本例中个虚构开发人员将使用用户 ID alice由于 Alice 正在负责 Foo 项目因此 alice 用户 ID 当前位于 “foo” 分组Foo 应用将请求 Bar 应用服务并期望获得回复因此Alice 应该具备对 FOO.** 队列访问权限以及对 BAR.**.RQST 队列有限访问权限可以使用以下配置文件来赋予此访问权限:

mqaut -m VENUS -t qmgr -g foo -all +inq +connect 
mqaut -m VENUS -t queue -g foo -n 'FOO.**' -all +inq +get +browse 
mqaut -m VENUS -t queue -g foo -n 'BAR.**.RQST' -all +put


  由于 Foo 应用是 Bar 服务主要用户并且由于 Alice 是有关 Foo 切方面常驻专家因此 Bar 应用项目经理(project manager)聘用她作为新 Quality Assurance 主管作为迁移部分alice 用户 ID 将被添加到具有以下权限 bar 分组:

mqaut -m VENUS -t qmgr -g bar -all +inq +connect 
mqaut -m VENUS -t queue -g bar -n 'BAR.**.RQST' -all +get 
mqaut -m VENUS -t queue -g bar -n 'FOO.**.REPLY' -all +put


  这时Alice 用户 ID 已经被赋予到 BAR.**.RQST 队列 +get 和 +put(通过作为两个区别分组成员)其效果见 dspmqaut 命令累计作用:

mqaut -m VENUS -t queue -g foo -n 'BAR.**.RQST' -all +put 
mqaut -m VENUS -t queue -g bar -n 'BAR.**.RQST' -all +get 
 
dspmqaut -m VENUS -t queue -n BAR.UPDATE.RQST -p alice 
Entity alice has the following authorizations for object 
BAR.UPDATE.RQST: 
 get 
 put


  在以上举例中在两个 mqaut 命令中指定配置文件是相同:BAR.**.RQST但是用于为 FOO 队列授权配置文件则不尽相同:

mqaut -m VENUS -t queue -g foo -n 'FOO.**' -all +inq +get +browse 
mqaut -m VENUS -t queue -g bar -n 'FOO.**.REPLY' -all +put


  FOO.**.REPLY 配置文件要比 FOO.** 配置文件更加具体但是大多数特定配置文件规则在这种情况下都不适用由于两个配置文件位于两个区别分组因此它们实际上并未重叠显而易见从 dspmqaut 命令结果可以看出这点:

dspmqaut -m VENUS -t queue -n FOO.BAR.REPLY -g foo 
Entity foo has the following authorizations for object FOO.BAR.REPLY: 
 get 
 browse 
 inq 
dspmqaut -m VENUS -t queue -n FOO.BAR.REPLY -g bar 
Entity bar has the following authorizations for object FOO.BAR.REPLY: 
 put 
dspmqaut -m VENUS -t queue -n FOO.BAR.REPLY -p alice 
Entity alice has the following authorizations for object FOO.BAR.REPLY: 
 get 
 browse 
 put 
 inq


  dmpmqaut 命令

  上个举例中使用 dspmqaut 命令将根据所有适用配置文件来计算有效权限虽然这极为有用但在些情况下会结合些配置文件中权限从而造成意外结果而造成授权失败原因也不明显幸运针对这种情况也有个命令可用:

dmpmqaut -m VENUS -t queue -n FOO.BAR.REPLY -p alice -e 
profile:   FOO.**.REPLY 
object type: queue 
entity:   bar 
entity type: group 
authority:  put 
- - - - - - - - 
profile:   FOO.** 
object type: queue 
entity:   foo 
entity type: group 
authority:  get browse inq


  带 –e 选项 dmpmqaut 命令将显示构成了某个实体有效累计权限(针对对象)所有配置文件可以看到Alice 用户 ID 继承自赋予 Foo 和 Bar 分组权限并且各分组最具体配置文件已应用于针对 FOO.BAR.REPLY 队列累计有效权限

  调试授权问题

  尽管您费尽心思有时应用仍然会接收到 2035 Authorization Error 返回码通常这是没有为某个对象授权所致而问题症结也可以很容易确定比较棘手情况是应用有正确对象但尝试使用未授权提升权限比如 +altuser 或 +passid对于这种情况最简单诊断思路方法是启用授权事件

  如果您具备多年 WebSphere MQ 使用经验则提到授权事件可能会让您条件反射般地去找十 6进制计算器但这已经去不复返!MS0P SupportPac 提供了个 PCF 解码器插件可简化事件消息解析工作事件消息会通知您造成失败用户 ID、失败对象、针对该对象 API 以及 API 中使用操作如果无法立即查明问题所在您可以使用此信息结合 dmpmqaut 命令来查看所有相关配置文件(构成了对该用户及该对象权限)列表

  SupportPac MS0P 目前还包含个可链接 Object Authority Manager (OAM) 实现可记录并将它们传递给本机 OAMOAM 被设计为可插入组件可被替换或扩展以替换或扩展本机功能如果希望自己编写新组件则 MS0P 中实现可以作为自定义实现框架使用如果这听起来很熟悉那么您可能已经意识到这种功能在的前 SupportPac MS07 中出现过

  融会贯通

  显而易见通过指定区别级别通配符以及累计多个分组权限您可以构建非常细粒度授权模式建议是尽可能避免这情况复杂性和安全性是最大敌人应该始终选择最简单思路方法来解决问题事实上我写了这么多文字就是希望大家能够认识到授权模式永远都不是完善除非已经简化到不能再简化为止

  还有点需要指出本文目标是展示各组件的间如何形成个整体而不是简单地提供可应用授权举例这也是举例中未使用授权原因所在虽然它们使用和队列授权相同语法以及相同优先规则(为配置文件简单性起见)但授权是在名称空间而非特定对象上运作这将是未来任务:消息传递 主题

  我个建议是授权在执行的前不具效力回想授权执行您想做而验证首先将确定您身份和队列管理器建立连接时无论是通过其他队列还是通过客户机通道所需验证级别都将由管理员来决定并进行配置

  请记住没有 MCAUSER 集任何入站通道都允许管理员访问队列管理器如果非管理员实体可以使用所有管理权限进行连接或者冒充合法应用或用户身份则再完美模式都是毫无用处请确保为所有入站通道建立了验证过程然后再开始考虑授权模式这还包括 SYSTEM.DEF.** 和 SYSTEM.AUTO** 通道要确保授权模式得到正确执行通常需要在每个入站通道中启用 SSL、安全退出或同时结合两者

  WebSphere MQ 安全性:实时!

  今年我将在 IMPACT 2010 举办两场 WebSphere MQ 安全会议场是基本管理强化会议我将更加详细地讨论本文所提到验证机制场会议是全新 WebSphere MQ 安全实验包括配置 SSL 和安全退出机制以提供验证以及构建授权模式和诊断问题动手实战如果您今年将参加 IMPACT请不要错过这两个会议另外还请踊跃提问我期待在拉斯维加斯和您相会!

Tags: 

延伸阅读

最新评论

发表评论