MQ8 + JDk8 的授权错误

MQ *_*ner 1 ibm-mq

当使用 JMS 示例代码时,放置在应用程序中,使用 MQ8 + JDk8 时出现低于授权错误

MQException received while attempting reconnect: Reason Code=2035
 Exception text: com.ibm.mq.MQException: MQJE001: Completion Code '2', Reason '2035'.
Run Code Online (Sandbox Code Playgroud)

AMQERR01.LOG 说

AMQ8077: Entity 'clientadmin' has insufficient authority to access object
'TLSTEST.QM'.

EXPLANATION:
The specified entity is not authorized to access the required object. The
following requested permissions are unauthorized: connect
ACTION:
Ensure that the correct level of authority has been set for this entity against
the required object, or ensure that the entity is a member of a privileged
group.

AMQ9557: Queue Manager User ID initialization failed for 'clientadmin'.

EXPLANATION:
The call to initialize the User ID 'clientadmin' failed with CompCode 2 and Reason
2035.
ACTION:
Correct the error and try again.
Run Code Online (Sandbox Code Playgroud)

执行的步骤如下站点和命令,但无法解决问题

http://www-01.ibm.com/support/docview.wss?uid=swg21680930
http://www-01.ibm.com/support/docview.wss?uid=swg21577137
ALTER AUTHINFO(SYSTEM.DEFAULT.AUTHINFO.IDPWOS) AUTHTYPE(IDPWOS) CHCKCLNT(OPTIONAL)
REFRESH SECURITY TYPE(CONNAUTH)

ALTER AUTHINFO(SYSTEM.DEFAULT.AUTHINFO.IDPWOS) AUTHTYPE(IDPWOS) CHCKCLNT(NONE)
REFRESH SECURITY TYPE(CONNAUTH)

ALTER QMGR CHLAUTH(DISABLED)
Run Code Online (Sandbox Code Playgroud)

使用以下命令解决

删除 'SecurityPolicy=user' ,仅按如下方式设置身份验证并重新启动 QM

setmqaut -m TLSTEST.QM -t qmgr -p clientadmin +all
setmqaut -m TLSTEST.QM -t queue -p clientadmin -n RECEIVE +all
setmqaut -m TLSTEST.QM -t queue -p clientadmin -n SEND +all
Run Code Online (Sandbox Code Playgroud)

只是想知道,如何在 qmgr 的所有队列中设置“+all”?将为 qmgr 中的所有队列设置@通道级别吗?

使用以下命令和设置成功运行

'SecurityPolicy=user'  
    setmqaut -m TLSTEST.QM -t qmgr -p clientadmin +connect +dsp +inq
    setmqaut -m TLSTEST.QM -t queue -p clientadmin -n RECEIVE +put +get +browse +dsp +inq
    setmqaut -m TLSTEST.QM -t queue -p clientadmin -n SEND +put +get +browse +dsp +inq
Run Code Online (Sandbox Code Playgroud)

Jos*_*hMc 5

AUTHINFO(SYSTEM.DEFAULT.AUTHINFO.IDPWOS) AUTHTYPE(IDPWOS) CHCKCLNT(OPTIONAL)如果发送密码,则要求该密码是有效的。

您收到的错误AMQ8077是因为用户没有连接到队列管理器的权限。

您必须授予 OAM 权限才能允许clientadmin队列connect管理器执行此操作。


默认情况下,在 Linux 上,您只能针对用户所属的组(在您的情况下是clientadmin所属组)授予 MQ OAM 权限。在 MQ v8.0 及更高版本中,如果以下设置已添加到 qm.ini,您还可以向用户本身授予 OAM 权限:

Service:
   SecurityPolicy=user
Run Code Online (Sandbox Code Playgroud)

上述设置不是必需的,它只是允许两种不同的方式授予 OAM 权限。这记录在 IBM MQ v8.0 知识中心页面“主体和组”中。该页面指出:

UNIX 和 Linux 系统

ACL 基于用户 ID 和组,您可以使用其中任何一个进行授权。

在版本 8.0 中,您可以使用基于用户的模型进行授权,这允许您同时使用用户和组。但是,当您在setmqaut命令中指定用户时,新权限将仅应用于该用户,而不应用于该用户所属的任何组。

有关详细信息,请参阅可安装服务。

当您使用基于组的模型进行授权时,用户 ID 所属的主组将包含在 ACL 中。

不包括个人用户 ID,并且权限授予该组的所有成员。因此,请注意,您可能会通过更改同一组中另一个主体的权限而无意中更改主体的权限。

这记录在 IBM MQ v8.0 知识中心页面“可安装服务”中。该页面指出:

SecurityPolicy=用户|组|默认

在 UNIX 和 Linux 系统上,该值指定队列管理器是使用基于用户的授权还是基于组的授权。值不区分大小写。如果不包含此属性,则使用默认值,即使用基于组的授权。重新启动队列管理器以使更改生效。


要授予 OAM 连接到某个组的队列管理器的权限,您可以使用 MQSC 命令来执行此操作SET AUTHREC

SET AUTHREC PROFILE('self') GROUP('groupname') OBJTYPE(QMGR) AUTHADD(CONNECT,DSP,INQ)
Run Code Online (Sandbox Code Playgroud)

使用命令行工具也可以完成同样的任务setmqaut

setmqaut -m <queue_manager_name> -t qmgr -g groupname +connect +dsp +inq
Run Code Online (Sandbox Code Playgroud)

要授予 OAM 权限以针对用户本身连接到队列管理器,您可以使用 MQSC 命令来执行此操作SET AUTHREC

SET AUTHREC PROFILE('self') PRINCIPAL('clientadmin') OBJTYPE(QMGR) AUTHADD(CONNECT,DSP,INQ)
Run Code Online (Sandbox Code Playgroud)

使用命令行工具也可以完成同样的任务setmqaut

setmqaut -m <queue_manager_name> -t qmgr -p clientadmin +connect +dsp +inq
Run Code Online (Sandbox Code Playgroud)

您还需要授予对要访问的队列的 PUT 或 GET 访问权限。以下使用 MQSC 命令的示例SET AUTHREC使用主体,但如果需要,您可以将其更改为使用组:

SET AUTHREC PROFILE('QUEUE.NAME') PRINCIPAL('clientadmin') OBJTYPE(QUEUE) AUTHADD(PUT,GET,BROWSE,DSP,INQ)
Run Code Online (Sandbox Code Playgroud)

使用命令行工具也可以完成同样的任务setmqaut

setmqaut -m <queue_manager_name> -t queue -p clientadmin +put +get +browse +dsp +inq
Run Code Online (Sandbox Code Playgroud)

更新2017/02/21

不建议在没有 SecurityPolicy=user 的情况下使用 -p 在 Linux 上设置权限。这是因为此操作不会针对使用 -p 指定的用户设置权限,而是针对运行命令时该用户的主要组设置权限。

这可能会导致各种情况,我能想到的一些例子如下:

  1. 如果您有两个用户具有相同的主要组,并且您为他们提供了不同的访问级别,那么他们最终都会获得与您运行的最后一个 setmqaut 命令所产生的相同的访问级别。
  2. 即使您一开始就为他们提供了相同级别的访问权限,您也可能希望删除这两个用户之一的访问权限,并使用-remove指定的权限发出类似的命令。结果不会是您删除了两个用户之一的访问权限,而是删除了两个用户的访问权限。
  3. UNIX 帐户的主要组更改并不罕见。如果用户在更改后不是与辅助组相同的组的成员,他们将失去对 MQ 的访问权限。

也不建议为非管理用户提供+all,如果您这样做,不妨将该用户添加到mqm组中并为他们提供完整的 MQ 管理权限。

您应该向用户提供所需的特定权限。我在示例中提供了一组适用于大多数应用程序的有限权限。