1. 为什么你的RocketMQ需要ACL权限控制?
大家好,我是老张,在消息队列这块摸爬滚打快十年了。记得去年我们团队就踩过一个坑:一个测试环境的RocketMQ集群,因为没做任何权限管控,被隔壁项目组的同学误操作,把线上几个核心Topic的消息给消费掉了,直接导致线上业务数据对不上,排查了大半天。这事儿之后,我们立刻在所有环境都上了ACL。
简单来说,ACL(Access Control List,访问控制列表) 就是RocketMQ的“门禁系统”。想象一下,你家的消息队列就像一个存放重要文件的仓库,以前谁都能进,现在你得给每个人发张门禁卡,规定谁能进、能进哪个房间、能看哪些文件。在RocketMQ里,这个“门禁卡”就是用户名密码,“房间”就是Topic和Consumer Group,“能干什么”就是发布(PUB)或订阅(SUB)的权限。
在4.9.2这个版本,RocketMQ的ACL功能已经比较成熟稳定了。它主要管三件事:
- 你是谁(用户):通过
accessKey和secretKey(类似账号密码)来识别身份。 - 你想动什么(资源):主要是Topic(主题)和Consumer Group(消费组)。
- 你能怎么动(权限):允许(PUB|SUB)、拒绝(DENY)、只发布(PUB)、只订阅(SUB)。
如果你正在负责一个多团队共用、或者有安全合规要求(比如等保)的项目,给RocketMQ加上ACL绝对是必选项。它能有效防止误操作、越权访问,甚至是恶意攻击,让整个消息链路更可控、更安全。接下来,我就手把手带你从零开始,把RocketMQ 4.9.2的ACL配置和Java客户端集成整个流程跑通。
2. 5分钟快速开启Broker端的ACL开关
开启ACL,首先得在Broker端进行配置。别怕,步骤很简单,主要就是改两个配置文件。我假设你已经有一套RocketMQ在运行了(单机或集群都行)。
2.1 第一步:修改broker.conf,打开ACL总开关
找到你的Broker配置文件,通常是在${ROCKETMQ_HOME}/conf目录下的broker.conf(或者你自定义的配置文件)。用vim或者你喜欢的编辑器打开它,找到或者添加下面这行核心配置:
# ACL总开关,设置为true才能启用权限控制
aclEnable=true
这个参数默认是false,所以不配就是“裸奔”状态。把它改成true,Broker就会开始对所有的连接请求进行权限校验。这里有个我踩过的坑:记得检查你的brokerIP1和namesrvAddr配置是否正确,尤其是集群环境,IP地址一定要配置成当前机器可被外部访问的地址,不然客户端连不上,排查起来很头疼。
一个完整的基础broker.conf配置示例可以参考下面这样,我把关键参数都加上了注释:
# ACL核心开关
aclEnable=true
# Broker对外的IP,非常重要!
brokerIP1=192.168.1.100
# NameServer地址,客户端靠这个找Broker
namesrvAddr=192.168.1.100:9876
# 是否允许自动创建Topic,生产环境建议false
autoCreateTopicEnable=false
brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=0
# 文件清理时间
deleteWhen=04
fileReservedTime=48
broRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH
改完之后,重启Broker使配置生效。你可以通过./mqbroker -c ../conf/broker.conf来指定配置文件启动,或者用nohup挂到后台。
2.2 第二步:详解plain_acl.yml权限规则文件
光打开开关还不够,你得告诉Broker具体的规则。规则定义在${ROCKETMQ_HOME}/conf/plain_acl.yml文件里。这个文件是YAML格式的,缩进特别重要,写错了Broker可能启动失败或者规则不生效。
这个文件结构清晰,主要分两大块:全局IP白名单和用户账户权限。我结合一个生产环境中常用的配置例子,给你拆开讲明白。
# 第一部分:全局IP白名单
# 这里列出的IP地址,可以直接访问所有资源,无需账号密码。通常用于集群内部机器(如Broker、NameServer之间)的通信。
globalWhiteRemoteAddresses:
- 10.10.103.* # 支持通配符,表示10.10.103网段的所有IP
- 192.168.1.100 # 也可以写具体的IP
- 192.168.1.101
# 第二部分:用户账户及权限定义
accounts:
# 第一个账户:普通应用账户,有严格的权限限制
- accessKey: AppUser1 # 用户名,客户端连接时使用
secretKey: MySecretPass123 # 密码,务必复杂一些
whiteRemoteAddress: 192.168.2.* # 此用户允许连接的客户端IP段(可选)
admin: false # 是否为管理员,false表示普通用户
defaultTopicPerm: DENY # 默认Topic权限:拒绝所有。这是最安全的做法,白名单制。
defaultGroupPerm: SUB # 默认Group权限:只允许订阅。通常消费组权限管理更宽松。
topicPerms: # 针对特定Topic的精细权限
- `OrderTopic=PUB|SUB` # 对OrderTopic有发布和订阅权限
- `PayTopic=SUB` # 对PayTopic只有订阅权限
- `AuditTopic=DENY` # 明确拒绝访问AuditTopic
groupPerms: # 针对特定Consumer Group的权限
- `OrderGroup=SUB`
- `PayGroup=PUB|SUB`
# 第二个账户:管理员账户,来自特定IP,拥有所有权限
- accessKey: Admin

2万+

被折叠的 条评论
为什么被折叠?



