RocketMQ ACL 1.0

摘要

  • 本文介绍 RocketMQ ACL 1.0 的使用方法。

  • RocketMQ官网

  • 本文使用的 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 全局白名单,支持的格式:*;192.168.*.*;192.168.0.1
# 白名单内的 IP 都可以访问,无需配置帐号
globalWhiteRemoteAddresses:
- 10.10.103.*
- 192.168.0.*

# 全局白名单外的IP,需要账号访问
# 账号配置,数组形式
accounts:
- accessKey: RocketMQ # 用户名
secretKey: 12345678 # 密码
whiteRemoteAddress: # 当前帐号的白名单
admin: false # 是否是管理员
defaultTopicPerm: DENY # 当前用户对未在 topicPerms 中显式声明的 Topic 的默认权限:DENY;PUB;SUB;PUB|SUB
defaultGroupPerm: SUB # 当前用户对未在 groupPerms 中显式声明的 Consumer Group 的默认权限:DENY;PUB;SUB;PUB|SUB
topicPerms: # 特定的 topic 权限
- topicA=DENY # topicName=perm
- topicB=PUB|SUB
- topicC=SUB
groupPerms: # 特定的 ConsumerGroup 权限
# the group should convert to retry topic
- groupA=DENY # groupName=perm
- groupB=PUB|SUB
- groupC=SUB

- accessKey: rocketmq2
secretKey: 12345678
whiteRemoteAddress: 192.168.1.*
# if it is admin, it could access all resources
admin: true # 是否是管理员,true 表示管理员,管理员可以访问所有资源
  • 权限定义

权限值 含义 说明
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
2
accessKey: mqadmin
secretKey: 1234567

以下命令执行后会自动修改 conf/plain_acl.yml 文件

  • 添加白名单

1
2
3
4
sh bin/mqadmin updateGlobalWhiteAddr \
-n 127.0.0.1:9876 \
-c DefaultCluster \
-g 10.250.0.*,10.252.*.*,10.20.0.31
参数 是否必填 含义 示例
-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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 创建管理员
sh bin/mqadmin updateAclConfig \
-n 127.0.0.1:9876 \
-c DefaultCluster \
-a mqadmin \
-s 1234567 \
-m true

# 创建普通用户
sh bin/mqadmin updateAclConfig \
-c DefaultCluster \
-a rocketmq_user \
-s 12345678 \
-i "PUB|SUB" \
-u SUB \
-t "topicA=PUB|SUB,topicB=DENY" \
-g "groupA=SUB,groupB=DENY" \
-w "192.168.0.*" \
-n 127.0.0.1:9876

参数 是否必填 含义 示例
-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 可选 是否设置为管理员账号 truefalse
-n 可选 指定 NameServer 地址 127.0.0.1:9876
-h 打印帮助信息
  • 删除用户

1
2
3
4
sh bin/mqadmin deleteAccessConfig \
-n 127.0.0.1:9876 \
-c DefaultCluster \
-a mqadmin
参数 是否必填 含义 示例
-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
2
3
4
5
6
7
8
9
10
11
12
13
14
# vim run/application.yaml # 按需替换配置

rocketmq:
config:
namesrvAddrs: # 填写NameServer地址列表
- 10.250.0.175:9876
- 10.250.0.188:9876
- 10.250.0.131:9876
dataPath: /usr/local/soft/rocketmq/data/dashboard # Dashboard文件目录,登录用户配置文件所在目录
loginRequired: true # 是否需要登录,此时需要在 dataPath 下创建 users.properties 文件,用于存放用户名和密码。如果该目录下不存在此文件,则默认使用resources/users.properties文件
# 如果 broker 开启了 ACL,则需要配置 accessKey 和 secretKey
accessKey: mqadmin
secretKey: 1234567

Proxy 配置

目前有两种没什么意义的解决方法:

    1. 将 Proxy IP 添加到白名单,因为客户端连接Proxy后,所有的请求都是由Proxy转发,所以将Proxy IP添加到白名单即可免于认证,该方法无需重启即可生效
1
2
3
4
sh bin/mqadmin updateGlobalWhiteAddr \
-n 127.0.0.1:9876 \
-c DefaultCluster \
-g 10.250.0.*
    1. 为 Proxy 开启 enableAclRpcHookForClusterMode
    • 修改conf/rmq-proxy.json文件,添加enableAclRpcHookForClusterMode参数
    1
    "enableAclRpcHookForClusterMode": true
    • 修改conf/tools.yml文件,配置帐号信息:
    1
    2
    accessKey: mqadmin
    secretKey: 1234567
    • 重新启动Proxy即可
  • 两种方法,客户端代码都不需要进行修改,甚至不需要添加ACL认证信息

  • 但这样做没啥意义,proxy也可以配置acl,但是没搞懂如何配置