第一条记录:阻止所有特权用户远程访问队列管理器。类型是 BLOCKUSER,用户列表是 MQADMIN,表示所有特权用户,主要指 mqm 用户组内的用户。在 MQ 7.1 以前的版本中,很多用户习惯显式设置 MCAUSER 为 mqm,从而比较方便的实现远程访问。在 MQ 7.1 及以后的版本中,这种方式不再被支持。 第二条记录:阻止所有对 SYSTEM 通道的连接。类型是 ADDRESSMAP,而地址是“*”,表示所有地址。最后,NOACCESS 作用等同于拦截连接。 第三条记录:这条记录是基于第二条记录的,表示只有系统通道 SYSTEM.ADMIN.SVRCONN 可以被远程访问。 关于 SET CHLAUTH 的详细参数介绍,请参考 MQ 7.1 的信息中心。下面,主要介绍三种认证方式的实现。 断言认证的实现这种方法是将远程的用户 ID 或者队列管理器名字映射到本地 ID。首先,使用 MQ 资源管理器实现该映射。从 MQ 资源管理器面板选择要操作的队列管理器,并展开其通道部分。右键点击“通道认证记录”来新建一个通道认证记录,弹出第一个窗口。 图 1. 创建通道认证记录![]() 在这个窗口中,可以选择新规则的用途。选择“允许访问”表示允许运程连接;选择“阻止访问”表示拦截远程连接。点击“下一步”,进入下一页面。 图 2. 选择匹配类型![]() 从上图可以看到,可以选择 SSL/TLS 主题的专有名称、客户机应用程序用户标识、远程队列管理器名称或者 IP 地址和本地用户 ID 匹配。在本例中,选择客户机应用程序用户标识,进入下一步。 图 3. 选择通道![]() 在这一步中,选择该规则所应用的一个或者多个通道。由于前面选择了“客户机应用程序用户标识”,因此该规则仅应用于服务器连接通道。如果选择“远程队列管理器名称”,则对应的通道应该为服务器通道或者接收通道。在设定好通道以后,就需要设置远程客户机用户标识。 图 4. 选择远程客户机用户标识![]() 在这一步中,包含两个部分。一个是必须要填的远程客户机用户标识,另外一个是可选的 IP 地址模式。用户可以选择只匹配远程用户标识,同时检验 IP 地址来提高安全性。这里,只设置远程用户标识 mqtest。 图 5. 选择本地用户标识![]() 对于允许的入站连接,需要为其分配在本地队列管理器上使用的用户标识,该标识将用于权限检查。用户可以选择映射到本地的固定用户标识,或者映射到已定义的通道 MCA 用户。这里,选择映射到本地用户 test1。用户 test1 需要是本地非特权用户。 到此为止,新的通道安全记录设置完成,点击“完成”,生成新的规则。同时,也可以看到相应的 MQSC 命令。 清单 2. 基于 ID 映射的认证从上面命令可以看出,作用通道是 SERVER1;类型是用户标识映射;远程用户是 mqtest;USERSRC 是 MAP,即映射到本地 ID;本地用户 test1;ACTION 是添加记录。 使用同样的步骤,不过在图 2 中选择“队列管理器名称”,则可以生成基于远程队列管理器名的映射。具体命令如下: 清单 3. 基于远程队列管理器名字映射的认证通道为接收通道 RECEIVER1;类型是队列管理器映射;队列管理器名是“QM*”,表示以“QM”开始的所有队列管理器;本地用户是 test2;ACTION 同样是添加记录。 在添加这些通道认证记录以后,远程的连接都会具有和本地用户 test1、test2 相同的权限。这些认证记录,会以永久消息的形式,存放在系统队列 SYSTEM.CHLAUTH.DATA.QUEUE 中。一般来说,不建议用户手工操作这些系统队列。 起源认证的实现在实现断言认证后,起源认证也变得简单,因为过程大同小异。在图 2 中,选择“IP 地址”。最后,生成如下命令。 清单 4. 基于 IP 地址映射的认证该记录作用通道为 SERVER1;类型地址映射;地址是“9.20*”,使用通配符可以表示符合条件的多个地址;本地用户标识 test1;ACTION 是添加记录。 证书认证的实现基于证书的认证,是将证书的专用名称(Distinguished Name)映射到本地队列管理器使用的用户标识。在图 2 中选择“SSL/TLS 主题的专有名称”,生成如下命令。 清单 5. 基于 SSL 专用名称映射的认证该记录作用通道为 SERVER1;类型 SSL 映射;SSL 的专用名称为“CN=*,L="China"”,使用通配符可以表示符合条件的多个名称;本地用户标识 test1;ACTION 是添加记录。 以上生成的通道认证记录可以从 MQ 资源管理器中查看,也可以通过 MQSC 命令“DISPLAY CHLAUTH”查看。用户也可以通过定义通道出口实现远程用户的映射,但是那样需要用户编写代码。通道认证记录的引入,极大方便了用户。 在解决了认证问题以后,下面将介绍 MQ 权限管理。 在具体介绍 MQ 的访问权限管理之前,需要说明一点。在 MQ 中,所有的权限管理都是基于队列管理器所在系统用户的。对于远程连接,就需要将连接请求者解析为本地用户,从而进行后续的权限操作。 ID 解析ID 解析,或者称为 ID 映射,是为了使 MQ 完成对远程连接的权限检查而采取的措施。一般来说,有下列几种方法。
在将远程连接用户映射到本地账户以后,就可以对该账户进行相应的权限管理,即根据需要赋予相应的权限。 对象权限管理器(OAM)MQ 队列管理器有一个对象权限管理器组件。该组件负责保证所有和队列管理器相关的操作都是经过授权的。对于每一个队列管理器对象,权限管理器都有一个访问控制列表(Access Control List)来记录不同用户对该对象的访问权限。这所有的权限记录,都以持久消息的形式保存在系统队列 SYSTEM.AUTH.DATA.QUEUE 中。一般来说,不建议用户通过操作该队列来改变权限。 为实现权限管理,MQ 提供了三个与对象权限管理器相关的命令。 dspmqaut:显示某个用户或者用户组对某个队列管理器对象的权限。 dmpmqaut:导出多个队列管理器对象的权限列表。 setmqaut:设置或者重置权限。关于该命令的细节,请参考 MQ 信息中心。 在 MQ 7.1 中,引入新的 MQSC 命令“SET AUTHREC”也可以实现相同功能。另外,用户也可以通过 MQ 资源管理器对队列管理器及其对象进行权限管理。本章节通过实例,对这两种方式进行介绍。 需要注意的是:在 Windows 平台上,访问权限管理可以针对单个用户或者用户组;在 UNIX 平台上,权限管理只能针对用户组。对单个用户的权限操作,都会改变同组的其它用户。 使用 MQ 资源管理器设置对队列管理器的访问权限使用 MQ 资源管理器,可以很方便的设置访问权限,不需要用户编写 MQSC 命令。MQ 资源管理器可以在不同级别上设置访问权限。如果针对队列管理器设置访问权限,按如下顺序操作。从导航栏中选择队列管理器,右键点击选择:对象权限 –》添加基于角色的权限。 图 6. 添加基于角色的权限![]() 从上图可以看出,用户可以设置针对队列管理器的只读权限或者完全管理权限。这里,选择“只读访问权”,从“命令预览”框中,可以看到同时生成的 MQSC 命令。 清单 6. 队列管理器只读权限命令清单
从以上命令看以看出,使用 setmqaut 命令给用户 test1 赋予了对队列管理器的连接、查询及显示权限,和对所有队列管理器对象的显示权限。最后两行是针对 MQ 资源管理器的访问权。 如果选择“完整管理权限”,则得到如下命令清单。 清单 7. 队列管理器完全管理权限命令清单
在命令中,test1 被赋予“alladm”权限, 即完全管理权限,并可以创建所有对象。用户可以修改这些生成的命令,用在其它脚本文件中。 使用 MQ 资源管理器设置对队列管理器对象的访问权限在 MQ 资源管理器中,也可以针对具体对象设置权限。这里,以本地队列 LQ1 为例。右键点击 LQ1 并选择:对象权限 –》管理权限记录。 图 7. 管理权限记录![]() 在这里,设置用户 test1 对本地队列 LQ1 的权限。在该对话框的右边页面中,可以选择“组”或者“用户”,分别表示权限设置是针对用户所在的组还是只针对该用户。这里,保持默认设置,点击“新建”,弹出如下对话框。 图 8. 新建权限记录![]() 在这一步中,设置用户 test1 对本地队列 LQ1 的权限,同时该设置会影响到同组的其它用户。如图所示,选择浏览、取出、查询、放入。在下方的“命令预览”框中,生成相应的 setmqaut 命令。 清单 8. 队列权限设置命令清单这里,第一条命令用来清除用户 test1 以前的所有权限;第二条命令赋予 test1 新的权限。 授予对队列管理器的有限管理权限在前面的实例中,展示了如何授予对队列管理器的完全管理权限。但是,在现实的企业解决方案中,为了安全,很少赋予一个用户完全的管理权限。因此,使用有限的管理权限更加实际,也可以保证系统的安全性。用户可以使用下面命令来授予有限的管理权限。 清单 9. 设置有限管理权限命令清单这四条命令,分别用于对队列管理器、队列、通道及主题设置有限管理权限。关键字“ReqdAction”可以是如下权限的组合: 更改(chg):更改指定对象的属性。 清除(clr):清除指定的队列或某个主题。 创建(crt):创建指定类型的对象。 删除(dlt):删除指定的对象。 显示(dsp):显示指定对象的属性。 控制(ctrl):对于侦听器和服务,启动和停止指定的通道、侦听器或服务;对于通道,启动、停止和 Ping 指定的通道;对于主题,定义、改变或删除预订。 控制 x(ctrlx):复位或解析指定的通道。 用户可以根据需求,使用以上权限设置相应的组合,从而在保证安全的前提下实现必需的管理功能。 撤销访问权限使用命令 setmqaut,可以撤销对队列管理器及其对象的访问权限。在授予权限的时候,使用符号“+”,那么撤销权限的时候,用符号“-”代替。 清单 10. 撤销访问权限命令清单第一条命令撤销用户组对队列的获取消息权限,赋予浏览和放入权限;第二条命令撤销对队列管理器的连接权限。 在本章节中介绍的实例和命令,主要针对 Windows 和 UNIX 平台。对于其它平台,用户可以参考 MQ 信息中心。除了以上介绍的 MQSC 命令和 MQ 资源管理器,用户也可以使用 PCF 命令完成权限的管理。具体的细节,请参考 MQ 信息中心。 MQ 2035 错误与以前的版本相比, MQ 7.1 及 MQ 7.5 在安全方面,有比较大的变化。很多用户在使用 MQ 7.1 及以后版本过程中,发现原来在 MQ 6.0 及 MQ 7.0 中使用的远程连接方法,主要是使用管理员账户远程连接队列管理器,不再有效。这些连接会被拦截,错误代码是 2035,表示无权限连接远端队列管理器。这是因为 MQ 7.1 引入的通道认证记录默认情况下定义了三条规则,其中有一条规则阻止了远程管理员用户的连接。如果队列管理器是从 MQ 7.0 及以前的版本升级到 MQ7.1 或 MQ 7.5,则通道认证记录默认是关闭的。 在远程访问被拦截的情况下,用户可以采取以下措施。
清单 11. 允许管理员用户远程访问通道认证记录第一条记录拦截所有的管理员用户及“nobody”用户;第二条记录对管理员账户开放了 SYSTEM.ADMIN 通道的访问,只拦截“nobody”用户。这里,MQ 假设其它的通道认证记录或者用户安全出口可以完成对管理员账户的认证。
因此,对于 2035 错误,最好的解决方案就是使用非管理员用户远程连接队列管理器,并通过访问权限管理赋予该用户合适的访问权限,从而保证系统的安全性。 本文主要介绍了 MQ 的认证及访问权限管理。在多数的安全解决方案中,两者都是必需的。认证过程用来确认用户的真实及有效性,而权限管理赋予用户合适的访问权限,两者缺一不可。另外,MQ 的安全性和系统安全、存储安全等息息相关。只有各个方面都具有较好的安全性并协调工作,才能保证整个系统的安全性 |
|