WebSphere MQ 安全系列,第 1 部分: WebSphere MQ 认证及访问权限管理
在企业级的解决方案中,安全性总是占有非常重要的位置。WebSphere MQ 具有完善的安全机制,支持访问控制、数据加密、数字签名等安全措施。本文主要介绍 WebSphere MQ 的认证及访问权限管理,包括对队列管理器的访问控制和对队列管理器对象的访问控制。文章介绍了 MQ 7.0 的权限管理机制和 MQ 7.1 新引入的通道认证机制,并提供详细的实现命令供读者参考。通过概念与实例的结合,使用户对 MQ 的认证及权限管理有一个全面详实的认识。
张新坡,西安交通大学硕士。2007 年加入 IBM,现为 WebSphere MQ 二线支持工程师。
在企业级解决方案中,WebSphere MQ 被广泛用于不同产品间的通信,包括金融及银行领域。在这些领域中,对系统的安全性特别敏感,这就要求 MQ 具有完善的安全机制,从而应对各种潜在的攻击。MQ 的认证和权限管理,是其中重要的环节。认证可以避免非法用户的访问,而授权可以保证用户具有合适的权限。通常,两者结合使用,可以构建良好的安全屏障。
MQ 认证
认证,通常是指验证一个用户或者应用程序真实合法的过程。在 MQ 中,主要分为基于连接的认证和基于消息的认证。基于连接的认证,是通过 MQ 通道实现的;基于消息的认证,则是通过 MQ 高级消息安全(MQ AMS)实现的。在本文中,主要讲述基于连接的认证。
MQ 主要支持三种不同的认证方式:断言认证,起源认证和证书认证。在 MQ 7.0 及以前的版本中,这些认证方式主要是依靠用户编写代码,即安全出口来实现。MQ 7.1 和 MQ 7.5 集成了这三种常用的认证功能。在 MQ 7.1/7.5 中,用户可以通过定义通道认证规则来过滤连接请求。下面,是这三种认证方式的定义。
断言认证:即基于用户 ID 或者队列管理器名字的认证。对于 MQI 通道,使用客户端的用户 ID 来完成认证;对于消息通道,则使用远程队列管理器名字。这是最基本的,安全性最低的认证方式。远程用户在连接请求中声明用户 ID 或者队列管理器名字,服务器端的队列管理器接受此 ID 的连接。严格意义上讲,这个过程只是对 ID 的识别,具有非常弱的认证功能。通常,这种方式多用于查询的场景中。
起源认证:即基于 IP 地址的认证。在认证过程中,队列管理器会查看连接请求的 IP 地址,并根据已有规则决定是否接受该请求。这种认证方式,具有一定的 IP 过滤功能,从而实现基于 IP 的认证。
证书认证:这是最为严格,安全级别最高的认证方式。在连接过程中,连接请求者使用证书私钥加密随机字符串并发送到队列管理器。队列管理器会使用相应的证书公钥解密字符串。如果成功,队列管理器可以确定该连接请求者拥有合法的证书。
在 MQ 7.1 中,这三种认证方式是通过通道认证记录来实现的。通道认证记录定义了一组规则。当远程客户端或者队列管理器发来连接请求时,服务器端队列管理器可以基于这些规则检查连接参数(例如:用户 ID,IP 地址)并做出相应决定。比如,阻止来自某 IP 的连接。下面的章节介绍了如何使用通道认证记录实现断言认证、起源认证和证书认证。
通道认证记录通道认证记录是 MQ 7.1 引入的安全功能,用来保证通道连接的合法性。MQ 7.5 具有同样的安全功能,因此本文介绍的实例也适用于 MQ 7.5。它主要通过阻止非法连接和映射远程连接到本地合法 ID 来实现该功能。用户可以使用 MQSC 命令、PCF 命令或者 MQ 资源管理器来定义通道认证记录。本文主要介绍比较常用的 MQSC 命令和 MQ 资源管理器两种方式。
在默认情况下,MQ 定义了三条通道认证记录,来保证访问的安全性。下面,通过讲解这三条记录来了解 MQSC 命令 SET CHLAUTH 的使用。
清单 1. 通道认证默认记录清单 1. 通道认证默认记录
SET CHLAUTH('*') TYPE(BLOCKUSER) USERLIST('*MQADMIN') SET CHLAUTH('SYSTEM.*') TYPE(ADDRESSMAP) ADDRESS('*') USERSRC(NOACCESS) SET CHLAUTH('SYSTEM.ADMIN.SVRCONN') TYPE(ADDRESSMAP) ADDRESS('*') USERSRC(CHANNEL)
第一条记录:阻止所有特权用户远程访问队列管理器。类型是 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 映射的认证
SET CHLAUTH('SERVER1') TYPE(USERMAP) CLNTUSER('mqtest') USERSRC(MAP) MCAUSER('test1') ACTION(ADD)
从上面命令可以看出,作用通道是 SERVER1;类型是用户标识映射;远程用户是 mqtest;USERSRC 是 MAP,即映射到本地 ID;本地用户 test1;ACTION 是添加记录。
使用同样的步骤,不过在图 2 中选择“队列管理器名称”,则可以生成基于远程队列管理器名的映射。具体命令如下:
清单 3. 基于远程队列管理器名字映射的认证
SET CHLAUTH('RECEIVE1') TYPE(QMGRMAP) QMNAME('QM*') USERSRC(MAP) MCAUSER('test2') ACTION(ADD)
通道为接收通道 RECEIVER1;类型是队列管理器映射;队列管理器名是“QM*”,表示以“QM”开始的所有队列管理器;本地用户是 test2;ACTION 同样是添加记录。
在添加这些通道认证记录以后,远程的连接都会具有和本地用户 test1、test2 相同的权限。这些认证记录,会以永久消息的形式,存放在系统队列 SYSTEM.CHLAUTH.DATA.QUEUE 中。一般来说,不建议用户手工操作这些系统队列。
起源认证的实现在实现断言认证后,起源认证也变得简单,因为过程大同小异。在图 2 中,选择“IP 地址”。最后,生成如下命令。
清单 4. 基于 IP 地址映射的认证
SET CHLAUTH('SERVER1') TYPE(ADDRESSMAP) ADDRESS('9.20*') USERSRC(MAP) MCAUSER('test1') ACTION(ADD)
该记录作用通道为 SERVER1;类型地址映射;地址是“9.20*”,使用通配符可以表示符合条件的多个地址;本地用户标识 test1;ACTION 是添加记录。
证书认证的实现基于证书的认证,是将证书的专用名称(Distinguished Name)映射到本地队列管理器使用的用户标识。在图 2 中选择“SSL/TLS 主题的专有名称”,生成如下命令。
清单 5. 基于 SSL 专用名称映射的认证
SET CHLAUTH('SERVER1') TYPE(SSLPEERMAP) SSLPEER('CN=*,L="China"') USERSRC(MAP) MCAUSER('test1') ACTION(ADD)
该记录作用通道为 SERVER1;类型 SSL 映射;SSL 的专用名称为“CN=*,L="China"”,使用通配符可以表示符合条件的多个名称;本地用户标识 test1;ACTION 是添加记录。
以上生成的通道认证记录可以从 MQ 资源管理器中查看,也可以通过 MQSC 命令“DISPLAY CHLAUTH”查看。用户也可以通过定义通道出口实现远程用户的映射,但是那样需要用户编写代码。通道认证记录的引入,极大方便了用户。
在解决了认证问题以后,下面将介绍 MQ 权限管理。
MQ 访问权限管理
在具体介绍 MQ 的访问权限管理之前,需要说明一点。在 MQ 中,所有的权限管理都是基于队列管理器所在系统用户的。对于远程连接,就需要将连接请求者解析为本地用户,从而进行后续的权限操作。
ID 解析ID 解析,或者称为 ID 映射,是为了使 MQ 完成对远程连接的权限检查而采取的措施。一般来说,有下列几种方法。
在队列管理器运行的系统中创建与远程用户同名的 ID,并设置相应的权限。虽然,这个 ID 和远程用户 ID 没有关系,但是可以用来做权限检查。 设置通道的 MCAUSER 属性。在设置 MCAUSER 值为某个本地用户 ID 后,所有到达该通道的远程连接,都具有和该 ID 相同的权限。一般来说,在定义接收通道或者服务连接通道的时候,建议用户设置具有有限权限的 MCAUSER 用户。MCAUSER 的值,不会被远程连接的设置所覆盖,这在一定程度上保证了访问安全。MCAUSER 属性,可以在定义通道的时候设置,也可以在连接通道过程中通过通道安全出口程序来设置。 使用通道认证规则 CHLAUTH 将远程用户映射到本地 ID。这种方法不仅可以实现远端客户 ID 的映射,同样适用 IP 地址映射和 SSL 证书 DN(Distinguished Name)的映射。具体实例,可以参考认证章节。在将远程连接用户映射到本地账户以后,就可以对该账户进行相应的权限管理,即根据需要赋予相应的权限。
对象权限管理器(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 -m QM1 -t qmgr -p test1 +connect +inq +dsp setmqaut -m QM1 -n "**" -t q -p test1 +dsp setmqaut -m QM1 -n "**" -t topic -p test1 +dsp setmqaut -m QM1 -n "**" -t channel -p test1 +dsp setmqaut -m QM1 -n "**" -t process -p test1 +dsp setmqaut -m QM1 -n "**" -t namelist -p test1 +dsp setmqaut -m QM1 -n "**" -t authinfo -p test1 +dsp setmqaut -m QM1 -n "**" -t clntconn -p test1 +dsp setmqaut -m QM1 -n "**" -t listener -p test1 +dsp setmqaut -m QM1 -n "**" -t service -p test1 +dsp setmqaut -m QM1 -n SYSTEM.MQEXPLORER.REPLY.MODEL -t q -p test1 +dsp +inq +get setmqaut -m QM1 -n SYSTEM.ADMIN.COMMAND.QUEUE -t q -p test1 +dsp +inq +put
从以上命令看以看出,使用 setmqaut 命令给用户 test1 赋予了对队列管理器的连接、查询及显示权限,和对所有队列管理器对象的显示权限。最后两行是针对 MQ 资源管理器的访问权。
如果选择“完整管理权限”,则得到如下命令清单。
清单 7. 队列管理器完全管理权限命令清单
setmqaut -m QM1 -t qmgr -p test1 +connect +inq +alladm setmqaut -m QM1 -n "**" -t q -p test1 +alladm +crt setmqaut -m QM1 -n "**" -t topic -p test1 +alladm +crt setmqaut -m QM1 -n "**" -t channel -p test1 +alladm +crt setmqaut -m QM1 -n "**" -t process -p test1 +alladm +crt setmqaut -m QM1 -n "**" -t namelist -p test1 +alladm +crt setmqaut -m QM1 -n "**" -t authinfo -p test1 +alladm +crt setmqaut -m QM1 -n "**" -t clntconn -p test1 +alladm +crt setmqaut -m QM1 -n "**" -t listener -p test1 +alladm +crt setmqaut -m QM1 -n "**" -t service -p test1 +alladm +crt setmqaut -m QM1 -n SYSTEM.MQEXPLORER.REPLY.MODEL -t q -p test1 +dsp +inq +get setmqaut -m QM1 -n SYSTEM.ADMIN.COMMAND.QUEUE -t q -p test1 +dsp +inq +put
在命令中,test1 被赋予“alladm”权限, 即完全管理权限,并可以创建所有对象。用户可以修改这些生成的命令,用在其它脚本文件中。
使用 MQ 资源管理器设置对队列管理器对象的访问权限在 MQ 资源管理器中,也可以针对具体对象设置权限。这里,以本地队列 LQ1 为例。右键点击 LQ1 并选择:对象权限 –》管理权限记录。
图 7. 管理权限记录在这里,设置用户 test1 对本地队列 LQ1 的权限。在该对话框的右边页面中,可以选择“组”或者“用户”,分别表示权限设置是针对用户所在的组还是只针对该用户。这里,保持默认设置,点击“新建”,弹出如下对话框。
图 8. 新建权限记录在这一步中,设置用户 test1 对本地队列 LQ1 的权限,同时该设置会影响到同组的其它用户。如图所示,选择浏览、取出、查询、放入。在下方的“命令预览”框中,生成相应的 setmqaut 命令。
清单 8. 队列权限设置命令清单
setmqaut -m QM1 -n "LQ1" -t q -g test1 – remove setmqaut -m QM1 -n "LQ1" -t q -g test1 +browse +get +inq +put
这里,第一条命令用来清除用户 test1 以前的所有权限;第二条命令赋予 test1 新的权限。
授予对队列管理器的有限管理权限在前面的实例中,展示了如何授予对队列管理器的完全管理权限。但是,在现实的企业解决方案中,为了安全,很少赋予一个用户完全的管理权限。因此,使用有限的管理权限更加实际,也可以保证系统的安全性。用户可以使用下面命令来授予有限的管理权限。
清单 9. 设置有限管理权限命令清单
setmqaut -m QMgrName -n ObjectProfile -t qmgr -g GroupName ReqdAction setmqaut -m QMgrName -n ObjectProfile -t queue -g GroupName ReqdAction setmqaut -m QMgrName -n ObjectProfile -t channel -g GroupName ReqdAction setmqaut -m QMgrName -n ObjectProfile -t topic -g GroupName ReqdAction
这四条命令,分别用于对队列管理器、队列、通道及主题设置有限管理权限。关键字“ReqdAction”可以是如下权限的组合:
更改(chg):更改指定对象的属性。
清除(clr):清除指定的队列或某个主题。
创建(crt):创建指定类型的对象。
删除(dlt):删除指定的对象。
显示(dsp):显示指定对象的属性。
控制(ctrl):对于侦听器和服务,启动和停止指定的通道、侦听器或服务;对于通道,启动、停止和 Ping 指定的通道;对于主题,定义、改变或删除预订。
控制 x(ctrlx):复位或解析指定的通道。
用户可以根据需求,使用以上权限设置相应的组合,从而在保证安全的前提下实现必需的管理功能。
撤销访问权限使用命令 setmqaut,可以撤销对队列管理器及其对象的访问权限。在授予权限的时候,使用符号“+”,那么撤销权限的时候,用符号“-”代替。
清单 10. 撤销访问权限命令清单
setmqaut -m QMgrName -t queue -n QName -g GroupName +browse -get +put setmqaut -m QMgrName -t qmgr -g GroupName – connect
第一条命令撤销用户组对队列的获取消息权限,赋予浏览和放入权限;第二条命令撤销对队列管理器的连接权限。
在本章节中介绍的实例和命令,主要针对 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. 允许管理员用户远程访问通道认证记录
SET CHLAUTH(*) TYPE(BLOCKUSER) USERLIST('nobody','*MQADMIN') SET CHLAUTH(SYSTEM.ADMIN.*) TYPE(BLOCKUSER) USERLIST('nobody')
第一条记录拦截所有的管理员用户及“nobody”用户;第二条记录对管理员账户开放了 SYSTEM.ADMIN 通道的访问,只拦截“nobody”用户。这里,MQ 假设其它的通道认证记录或者用户安全出口可以完成对管理员账户的认证。
停止通道认证功能。但是,对于生产环境,不推荐停止通道认证记录功能。因为停止该功能, 意味着队列管理器会接受所有的具有管理权限的连接。这就需要用户付出更大的努力去管理和控制这些连接。出于安全考虑,请保持通道认证记录功能启用。因此,对于 2035 错误,最好的解决方案就是使用非管理员用户远程连接队列管理器,并通过访问权限管理赋予该用户合适的访问权限,从而保证系统的安全性。
小结
本文主要介绍了 MQ 的认证及访问权限管理。在多数的安全解决方案中,两者都是必需的。认证过程用来确认用户的真实及有效性,而权限管理赋予用户合适的访问权限,两者缺一不可。另外,MQ 的安全性和系统安全、存储安全等息息相关。只有各个方面都具有较好的安全性并协调工作,才能保证整个系统的安全性