启用队列管理器 Advanced Message Security (AMS)
什么是 IBM MQ Advanced Message Security?
IBM® MQ Advanced Message Security 扩展了 IBM MQ 安全服务,可在“消息”级别提供加密,以保护敏感数据,例如高价值的财务交易和个人信息。 实现 IBM MQ AMS 有两种方法,我们将其称为应用程序 AMS 和队列管理器 AMS。 本教程重点说明队列管理器 AMS。
队列管理器 AMS 提供以下功能:
- 全面安全性,无需编写复杂的安全代码,也无需修改或重新编译现有应用程序
- 支持对消息进行加密和数字签名
- 公共密钥基础架构 (PKI) 技术,用于为消息提供认证、授权、机密性和数据完整性服务
教程概述
图:队列管理器 AMS 可确保在将消息数据放入队列到检索消息数据之间,消息数据未被修改。
本教程通过网络将纯文本消息传递到队列管理器。 在生产系统中,建议您使用启用 TLS 的通道来保护传输中的消息。
本教程将指导您完成相应步骤来配置队列管理器 AMS,以在 IBM Cloud 队列管理器的 IBM MQ 队列上进行加密。 首先,放入并获取明文消息,以确认位于队列中的消息是明文形式。 然后,启用队列管理器 AMS 加密,从而确保对队列上的消息加密。 然后,证明队列上的消息现在已加密,以确保未经授权的用户或应用程序无法访问或修改消息数据。
先决条件
为了继续执行本教程,请务必确保您满足以下先决条件:
-
IBM MQ on Cloud 队列管理器
如果您还没有 IBM MQ on Cloud 队列管理器,那么可以通过遵循此处的引导式教程来创建一个队列管理器:
- 注: 队列管理器应该尚未启用 TLS
遵循了引导式教程或执行了同一页面上提供的手动步骤后,您应该具有:
- MQ on Cloud 队列管理器
- 在 connection_info.txt 文件中下载的连接详细信息
- 如果没有此文件,请查阅本教程底部的附录 1
- 在 platformApiKey.json 文件中下载的管理员用户名和 API 密钥
- 如果没有此文件,请查阅本教程底部的附录 2
- 在 apiKey.json 文件中下载的应用程序用户名和 API 密钥
- 如果没有此文件,请查阅本教程底部的附录 3
-
IBM MQ 客户机
要完成本教程,您需要 IBM MQ 命令行工具“runmqsc”以及已安装并且位于 PATH 上的 IBM MQ 样本应用程序“amqsputc”和“amqsgetc”。 如果没有这些命令,那么可以通过安装 IBM MQ 客户机来获取这些命令。 本教程末尾的附录 4 详细说明了如何执行此操作。
- 注: IBM MQ 客户机仅可用于 Windows 和 Linux。
设置终端环境
-
打开 2 个终端窗口
- 一个终端将是管理终端,用于管理队列管理器
- 一个终端将是应用程序终端,用于表示连接到队列管理器的应用程序,并执行消息“放入”和“获取”操作
-
在管理终端中指定队列管理器详细信息
稍后将使用的
runmqsc
命令需要设置环境变量,以标识它应该连接到的远程队列管理器。 在管理终端中,使用以下命令导出 MQSERVER 变量:export MQSERVER="CLOUD.ADMIN.SVRCONN/TCP/<HOSTNAME>(<PORT>)"
<HOSTNAME>
-这是 connection_info.txt 文件中的 "hostname"<PORT>
-这是 connection_info.txt 文件中的 "listenerPort"
-
在应用程序终端中指定队列管理器详细信息
稍后将使用的
amqsputc
和amqsgetc
命令需要设置环境变量,以标识它应该连接到的远程队列管理器。 在 app terminal中,使用以下命令导出 MQSERVER 变量: 在 app terminal中,使用以下命令导出 MQSERVER 变量:export MQSERVER="CLOUD.APP.SVRCONN/TCP/<HOSTNAME>(<PORT>)"
<HOSTNAME>
-这是 connection_info.txt 文件中的 "hostname"<PORT>
-这是 connection_info.txt 文件中的 "listenerPort"
-
指定应用程序用户名
amqsputc
和amqsgetc
命令还需要将环境变量设置为它应该使用的特定用户名。 在应用程序终端中,使用以下命令导出 MQSAMP_USER_ID:export MQSAMP_USER_ID="<APP_MQ_USER>"
<APP_MQ_USER>
-这是 apiKey.json 文件中的 "mqUsername"
-
在应用程序终端中禁用应用程序 AMS
在本教程中,我们将启用队列管理器 AMS。 因此,需要禁用应用程序 AMS(有时称为客户机 AMS),以便只有队列管理器执行 AMS 加密和解密,而客户机不执行。 在应用程序终端中:
- IBM MQ 客户机 7.5:
export AMQ_DISABLE_CLIENT_AMS=TRUE
- IBM MQ 客户机 8.0 和更高版本:
export MQS_DISABLE_ALL_INTERCEPT=TRUE
- IBM MQ 客户机 7.5:
创建目标设定为缺省队列的别名队列
在此部分中,您将创建目标设定为缺省队列的别名队列。 启用了 QM AMS 后,对缺省队列执行“放入”或“获取”操作时,将触发 AMS 拦截器。 因此,尽管消息已在队列上加密,但在检索到该消息时,该消息仍可作为明文读取。 为了证明消息已加密,可以使用别名队列。 通过别名队列检索消息不会触发缺省队列上的拦截器,因此将按原样检索消息而不进行解密,这将准确表明消息是明文还是已加密。
- 切换到管理终端
- 运行
runmqsc
以连接到远程队列管理器
runmqsc -c -u <ADMIN_MQ_USER> -w60 <QUEUE_MANAGER_NAME>
<ADMIN_MQ_USER>
-这是 platformApiKey.json 文件中的 "mqUsername"<QUEUE_MANAGER_NAME>
-这是 connection_info.txt 文件中的 "queueManagerName"-c
使用 MQSERVER 变量通知 runmqsc 应该连接到远程队列管理器
- 终端将提示您输入密码
- This is your <ADMIN_API_KEY> = 'API 密钥' in the file platformApiKey.json
- 现在,终端在等待进行输入
- 创建目标设定为缺省队列的别名队列
DEFINE QALIAS (DEV.ALIAS.QUEUE.1) TARGET (DEV.QUEUE.1)
- DEV.ALIAS.QUEUE.1 是别名队列的名称
- DEV.QUEUE.1 是在本教程中使用的缺省队列
在启用队列管理器 AMS 之前测试别名队列
为了证明别名队列正常工作并且这些消息当前在缺省队列上为明文形式,现在将对缺省队列执行消息“放入”操作,然后对别名队列执行消息“获取”操作。
- 切换到应用程序终端
- 运行 amqsputc 以将消息放入缺省队列
amqsputc DEV.QUEUE.1
- 终端将提示您输入密码
- This is your <APP_API_KEY> = 'API 密钥' in the file apiKey.json
- 现在,终端在等待进行输入。 请输入消息
- 两次按 Enter key 键以 exit from amqsputc
- 两次按 Enter key 键以 exit from amqsputc
- 针对别名队列运行 amqsgetc 以从缺省队列中获取消息
amqsgetc DEV.ALIAS.QUEUE.1
- DEV.ALIAS.QUEUE.1 是别名队列的名称
- 终端将提示您输入密码
- This is your <APP_API_KEY> = 'API 密钥' in the file apiKey.json
- 现在,终端将从缺省队列中输出消息
- 请注意,消息以明文形式返回,因为这就是消息在缺省队列上的存储方式。
选择要用于 AMS 加密的证书
队列管理器通道必须配置为对消息加密。 MQ on Cloud 随附了 Let 's Encrypt 提供的缺省证书,我们将使用该证书对消息进行加密。 执行以下步骤为队列管理器 AMS 配置队列管理器通道:
- 在 IBM Cloud (http://cloud.ibm.com/) 中,找到您在指导教程中创建的 IBM MQ on Cloud 队列管理器。
- 选择 密钥库 选项卡
- 在缺省证书上,单击 3 点
- 单击 管理
- 启用 将此证书用于队列管理器 AMS
- 选择应用程序通道 CLOUD。APP.SVRCONN
- 单击 下一步
- 阅读警告,然后勾选 我了解 ,然后单击 保存
您现在已对所选通道启用队列管理器 AMS ,并选择了要用于加密的证书
- 单击复制详细信息,并将其粘贴到您选择的文本编辑器。 将此内容另存为 default_cert.txt ,因为您稍后将需要 DN 字段内容。
创建策略以启用 AMS 加密
现在,将在单个队列上配置安全策略以启用 AMS。 您会看到我们将执行加密,但不会执行签名。 在相关队列上配置安全策略之前,不会执行加密或签名。
- 在管理终端中
- 终端应该仍位于 runmqsc 内。 如果不是,请如上面所执行的操作,针对队列管理器运行 runmqsc
- 使用以下命令创建策略:
SET POLICY (DEV.QUEUE.1) ENCALG (AES256) RECIP ('<SUBJECT_DN>')
- DEV.QUEUE.1 是在本教程中使用的缺省队列
- AES256 - 用于本教程的加密。 其他算法可在此处找到
<SUBJECT_DN>
-这是在 "选择证书" 的最后一步创建的 default_cert.txt 文件中的 "Subject DN"- 注释。 将主体 DN 括起的单引号是必需的
- 通过输入以下命令退出 runmqsc:
END
既然队列管理器 AMS 已启用,接着测试队列
- 在应用程序终端内
- 运行 amqsputc 以将消息放入缺省队列
amqsputc DEV.QUEUE.1
- 终端将提示您输入密码
- This is your <APP_API_KEY> = 'API 密钥' in the file apiKey.json
- 现在,终端在等待进行输入。 请输入消息
- 点击 Enter 键两次以退出 amqsputc
- 针对别名队列运行 amqsgetc 以从缺省队列中获取消息
amqsgetc DEV.ALIAS.QUEUE.1
- DEV.ALIAS.QUEUE.1 是别名队列的名称
- 终端将提示您输入密码
- This is your <APP_API_KEY> = 'API 密钥' in the file apiKey.json
- 现在,终端将从缺省队列中输出加密消息
- 注:显示的消息不是明文形式。 这是因为消息已在缺省队列上加密。
结论
您现在已经完成了本教程。 您已在队列上启用 IBM MQ AMS,并且已证明这可确保存储在指定队列上的消息已加密。
故障诊断
- amqsputc 返回原因码 2063
- 如果没有为通道选择证书,那么可能会发生此情况
- 执行“选择要用于 AMS 加密的证书”
- amqsputc 返回原因码 2035
- 如果尚未运行
export MQS_DISABLE_ALL_INTERCEPT=TRUE
,那么可能会发生此情况 - 执行“设置终端环境”的最后一步
- 如果尚未运行
附录
附录 1:connection_info.txt
要检索包含队列管理器连接详细信息的 connection_info.txt 文件,请执行以下操作:
- 通过单击表中显示的相关服务,登录到 IBM Cloud 服务实例
- 这将打开队列管理器视图。 选择要从中检索连接信息的队列管理器
- 单击 连接信息
- 以“JSON 文本格式”下载此文件
附录 2:platformApiKey.json
要创建或重置管理员 API 密钥,请执行以下操作:
- 通过单击表中显示的相关服务,登录到 IBM Cloud 服务实例
- 这将打开队列管理器视图。 选择要从中检索连接信息的队列管理器
- 接下来,选择 管理 选项卡
- 现在,单击重置 IBM Cloud API 密钥
- 注:此 MQ 用户名的先前管理员 API 密钥将不再有效
- 注: 如果按钮显示 Create IBM Cloud API Key,那么您以前没有以这种方式创建 API 密钥。 请单击创建 IBM Cloud API 密钥按钮。
- 单击 下载 以下载包含管理员用户名和 API 密钥的 platformApiKey.json
附录 3:apiKey.json
要创建新的应用程序 API 密钥,请执行以下操作:
- 通过单击表中显示的相关服务,登录到 IBM Cloud 服务实例
- 这将打开队列管理器视图。 选择 应用程序凭证 选项卡
- 现在,单击将用于 AMS 教程的应用程序旁边的 3 点
- 单击添加新的 API 密钥
- 注释。 现有应用程序 API 密钥将继续有效
5。 单击 下载 以下载包含应用程序用户名和 API 密钥的 apiKey.json
附录 4:IBM MQ C 客户机
如果您没有 IBM MQ 客户机命令行工具和样本(runmqsc、amqsputc 和 amqsgetc),可以从此处进行下载。
- 如下所示选择最新的包,写入时的最新版本为 9.0.5
- 通过选中软件包左侧的框,选择 " [您的操作系统]的IBM MQC 可再分发客户机" ,如下所示。 文件名中应该有 Redist。 本教程是使用 Linux Ubuntu 操作系统创建的
- 选择通过 HTTPS 下载,这将允许您直接通过浏览器下载客户端,如下所示
- 注:如果您没有此选项,请尝试使用替代浏览器。
- 单击“继续”后, 会将您重定向到以下所示的屏幕。 点击红色圆圈显示的符号开始下载
- 下载后,将文件解压缩到您选择的目录
<PATH_TO_MQCLIENT_DIR>
tar -xvzf <IBM-MQC-Redist>.tar.gz <PATH_TO_MQCLIENT_DIR>
- 向路径添加命令
export PATH=$PATH:<PATH_TO_MQCLIENT_DIR>/bin:<PATH_TO_MQCLIENT_DIR>/samp/bin