MQ8 + JDk8的授权错误

时间:2017-02-20 14:43:48

标签: 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'.

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.

执行以下网站和命令的步骤,但dint解决问题

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)
  

已解决以下命令

删除'SecurityPolicy = user',仅将Auth设置如下并重新启动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

只想知道,我如何在qmgr的所有队列中设置'+ all'?将设置@ channel level设置为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

1 个答案:

答案 0 :(得分:4)

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

您获得的AMQ8077错误是因为用户无权连接到队列管理器。

您必须授予OAM权限,允许clientadmin connect到队列管理器。

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

Service:
   SecurityPolicy=user

上述设置不是必需的,它只允许两种不同的方式来授予OAM权限。这在IBM MQ v8.0知识中心页面“Principals and groups”中有记录。此页面说明:

  

UNIX和Linux系统

     

ACL基于用户ID和组,您可以使用它们进行授权。

     

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

     

有关详细信息,请参阅Installable services

     

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

     

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

这在IBM MQ v8.0知识中心页面“Installable services”中有记录。此页面说明:

  

<强> SECURITYPOLICY =用户|组|默认

     

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

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

SET AUTHREC PROFILE('self') GROUP('groupname') OBJTYPE(QMGR) AUTHADD(CONNECT,DSP,INQ)

使用命令行工具setmqaut完成同样的事情:

setmqaut -m <queue_manager_name> -t qmgr -g groupname +connect +dsp +inq

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

SET AUTHREC PROFILE('self') PRINCIPAL('clientadmin') OBJTYPE(QMGR) AUTHADD(CONNECT,DSP,INQ)

使用命令行工具setmqaut完成同样的事情:

setmqaut -m <queue_manager_name> -t qmgr -p clientadmin +connect +dsp +inq

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

SET AUTHREC PROFILE('QUEUE.NAME') PRINCIPAL('clientadmin') OBJTYPE(QUEUE) AUTHADD(PUT,GET,BROWSE,DSP,INQ)

使用命令行工具setmqaut完成同样的事情:

setmqaut -m <queue_manager_name> -t queue -p clientadmin +put +get +browse +dsp +inq
  

更新2017/02/21

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

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

  1. 如果您有两个具有相同主要组的用户,并且您为他们提供了不同的访问级别,则他们最终都会获得与您上次运行的最后一个setmqaut命令相同的访问级别。
  2. 即使您为它们提供了相同级别的访问权限,您也可能希望从两个用户之一中删除访问权限,并发出具有指定权限-remove的类似命令。结果 是您从两个用户之一中删除了访问权限,而是将其从两个用户中删除。
  3. unix帐户的主要组更改的情况并不少见。如果用户在更改后也不是同一组的成员,则他们将无法访问MQ。
  4. 也不建议为非管理用户提供+all,如果这样做,您也可以将用户添加到mqm组,并为他们提供完整的MQ管理权限。

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