RocketMQ ACL 1.0
摘要
- 
本文介绍 RocketMQ ACL 1.0 的使用方法。 
- 
本文使用的 RocketMQ 版本为 5.3.2。 
- 
RocketMQ 从 5.3.0 起引入安全性更高的 ACL 2.0,5.3.2 是最后一个还支持 ACL 1.0 的版本,5.3.3 移除了 ACL 1.0,官方建议所有使用 Apache RocketMQ ACL 的用户迁移到 ACL 2.0。 
ACL 1.0 简介
- 
ACL控制在增强集群访问控制安全性的同时也会带来部署流程和运维管理的复杂度。 
- 
一般仅建议在网络环境不安全、业务数据敏感、多部门租户混用的场景下使用。如果生产集群本身是私有集群不会被外部部门租户访问,可以不开启。 
ACL 1.0 使用方法
- 
本文在 RocketMQ 的安装及使用 中 集群 安装完成之后,开始配置 ACL 1.0。 
- 
首先需要在 Broker 节点开启 ACL 权限,在 broker.conf文件中添加如下配置,并重启 Broker
| 1 | aclEnable=true | 
- 
权限配置文件为 conf/plain_acl.yml,这个文件不需要修改,后面会介绍如何通过命令行进行配置,默认的内容如下:
| 1 | # 全局白名单,支持的格式:*;192.168.*.*;192.168.0.1 | 
- 
权限定义 
| 权限值 | 含义 | 说明 | 
|---|---|---|
| DENY | 拒绝 | 禁止对该 Topic 的任何操作(无论是发送还是订阅) | 
| ANY | 任意权限 | 具有发布(PUB)和订阅(SUB)双重权限 | 
| PUB | 发送权限 | 允许生产者向该 Topic 发送消息 | 
| SUB | 订阅权限 | 允许消费者订阅并消费该 Topic 的消息 | 
defaultGroupPerm: SUB
- 表示:默认允许该用户以任意消费者组身份参与消费(不限制 group),但前提是该消费者对目标 Topic 也必须拥有 SUB 权限。
命令行配置 ACL
- 
如果 RocketMQ 开启了 ACL,无论是 ACL 1.0 还是 ACL 2.0,都需要在 conf/tools.yml配置正确的账号密码,否则无法执行mqadmin命令。
| 1 | accessKey: mqadmin | 
以下命令执行后会自动修改
conf/plain_acl.yml文件
- 
添加白名单 
| 1 | sh bin/mqadmin updateGlobalWhiteAddr \ | 
| 参数 | 是否必填 | 含义 | 示例 | 
|---|---|---|---|
| -b | 二选一必填 | 指定要更新白名单的 Broker 地址 | 127.0.0.1:10911 | 
| -c | 二选一必填 | 指定要更新白名单的 Cluster 名称,集群内所有 Broker 都会被更新 | DefaultCluster | 
| -g | ✅ 必填 | 要设置的全局白名单地址列表,支持通配符 | "10.10.103.*,192.168.0.*" | 
| -n | 可选 | NameServer 地址 | 127.0.0.1:9876 | 
| -p | 可选 | 指定 ACL 配置文件路径(Broker 端对应的配置文件路径) | /home/rocketmq/conf/plain_acl.yml | 
| -h | 否 | 打印帮助信息 | — | 
- 
创建或更新用户,accessKey 和 secretKey 的长度必须大于 6 位 
| 1 | # 创建管理员 | 
| 参数 | 是否必填 | 含义 | 示例 | |
|---|---|---|---|---|
| -a | ✅ 必填 | 用户名(accessKey) | rocketmq_user | |
| -s | ✅ 必填 | 密码(secretKey) | 12345678 | |
| -b | 二选一 | 指定目标 Broker 地址 | 127.0.0.1:10911 | |
| -c | 二选一 | 指定目标集群名称,集群中所有 Broker 都会被更新 | DefaultCluster | |
| -g | 可选 | 指定 Group 权限列表 | groupA=SUB,groupB=DENY | |
| -t | 可选 | 指定 Topic 权限列表 | `topicA=PUB | SUB,topicB=DENY` | 
| -u | 可选 | 设置默认 Group 权限 | SUB | |
| -i | 可选 | 设置默认 Topic 权限 | DENY | |
| -w | 可选 | 设置 IP 白名单 | "10.10.10.*,192.168.1.*" | |
| -m | 可选 | 是否设置为管理员账号 | true或false | |
| -n | 可选 | 指定 NameServer 地址 | 127.0.0.1:9876 | |
| -h | 否 | 打印帮助信息 | — | 
- 
删除用户 
| 1 | sh bin/mqadmin deleteAccessConfig \ | 
| 参数 | 是否必填 | 含义 | 示例 | 
|---|---|---|---|
| -a | ✅ 必填 | 要删除的用户名(accessKey) | rocketmq_user | 
| -b | 二选一 | 指定目标 Broker 地址 | 127.0.0.1:10911 | 
| -c | 二选一 | 指定目标集群名称(删除整个集群上的该账号) | DefaultCluster | 
| -n | 可选 | 指定 NameServer 地址 | 127.0.0.1:9876 | 
| -h | 否 | 打印帮助信息 | — | 
Dashboard 配置
- 
此时在 Dashboard 中配置好认证信息并重启,即可正常访问RocketMQ集群,但是并不支持在web端配置ACL认证信息。 
| 1 | # vim run/application.yaml # 按需替换配置 | 
Proxy 配置
- 
Broker 开启 ACL 1.0 认证后,即使在代码中添加了ACL认证信息的情况下,新版客户端(rocketmq-client-java)通过 Proxy发送或订阅消息依旧会失败,原客户端(rocketmq-client)通过Nameserver发送或订阅消息正常,尚不知道该如何完美解决。
目前有两种没什么意义的解决方法:
- 
- 将 Proxy IP 添加到白名单,因为客户端连接Proxy后,所有的请求都是由Proxy转发,所以将Proxy IP添加到白名单即可免于认证,该方法无需重启即可生效
 
| 1 | sh bin/mqadmin updateGlobalWhiteAddr \ | 
- 
- 为 Proxy 开启 enableAclRpcHookForClusterMode
 - 修改conf/rmq-proxy.json文件,添加enableAclRpcHookForClusterMode参数
 1 "enableAclRpcHookForClusterMode": true - 修改conf/tools.yml文件,配置帐号信息:
 1 
 2accessKey: mqadmin 
 secretKey: 1234567- 重新启动Proxy即可
 
- 为 Proxy 开启 
- 
两种方法,客户端代码都不需要进行修改,甚至不需要添加ACL认证信息 
- 
但这样做没啥意义,proxy也可以配置acl,但是没搞懂如何配置 
 
 
 
 
 
 
 
 
 
