RocketMQ ACL 2.0
摘要
- 
本文介绍 RocketMQ ACL 2.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 2.0 简介
- 
在 RocketMQ官网 中没有找到关于 ACL 2.0 的介绍,但是有介绍 ACL 1.0 的使用方法: https://rocketmq.apache.org/zh/docs/bestPractice/03access。 
- 
在阿里云上找到一篇参考资料:Apache RocketMQ ACL 2.0 全新升级 
配置步骤
- 
本文在 RocketMQ 的安装及使用 中 集群 安装完成之后,开始配置 ACL 2.0。 
- 
在所有 Broker 的配置文件 broker.conf中增加认证与授权配置:
| 1 | # broker.conf | 
| 参数定义 | 参数名称 | 参数描述 | 
|---|---|---|
| authenticationEnabled | 是否打开认证开关 | 用于判断认证是否打开。 可选值: • true– 是• false– 否 | 
| authenticationProvider | 认证方式提供者 | 用于提供请求访问时的认证方式。 可选值: • org.apache.rocketmq.auth.authentication.provider.DefaultAuthenticationProvider– 默认的认证方式 | 
| initAuthenticationUser | 系统初始化用户 | 用于系统初始化时自动创建的用户账号。 示例: {"username":"rocketmq","password":"12345678"} | 
| innerClientAuthenticationCredentials | 组件间认证用户 | 用于设置集群内组件之间的访问凭证。 示例: {"accessKey":"rocketmq","secretKey":"12345678"} | 
| authenticationMetadataProvider | 认证元数据提供者 | 用于提供认证相关的元数据(如用户)。 可选值: • org.apache.rocketmq.auth.authentication.provider.LocalAuthenticationMetadataProvider– 本地认证元数据提供者• org.apache.rocketmq.proxy.auth.ProxyAuthenticationMetadataProvider– Proxy认证元数据提供者 | 
| authenticationStrategy | 认证策略 | 用于指定请求访问时的认证策略。 可选值: • org.apache.rocketmq.auth.authentication.strategy.StatelessAuthenticationStrategy– 每次请求认证策略• org.apache.rocketmq.auth.authentication.strategy.StatefulAuthenticationStrategy– 首次请求认证策略 | 
- 
重启启动所有 Broker 
命令行管理用户
- 
如果 RocketMQ 开启了 ACL,无论是 ACL 1.0 还是 ACL 2.0,都需要在 conf/tools.yml配置正确的账号密码,否则无法执行mqadmin命令。
| 1 | accessKey: mqadmin | 
用户管理
| 接口定义 | 接口名称 | 接口参数 | 
|---|---|---|
| createUser | 创建用户 | -n namesrv 地址 -b broker 地址 -c 集群名称 注: -b和-c参数二选一-u 用户名称 -p 用户密码 -t 用户类型(Super、Normal) | 
| updateUser | 更新用户 | -n namesrv 地址 -b broker 地址 -c 集群名称 注: -b和-c参数二选一-u 用户名称 -p 用户密码 -t 用户类型(Super、Normal) | 
| deleteUser | 删除用户 | -b broker 地址 -c 集群名称 注: -b和-c参数二选一-u 用户名称 | 
| getUser | 查询用户详情 | -n namesrv 地址 -b broker 地址 -c 集群名称 注: -b和-c参数二选一-u 用户名称 | 
| listUser | 查询用户列表 | -n namesrv 地址 -b broker 地址 -c 集群名称 注: -b和-c参数二选一-u 用户名称 -f 过滤条件(支持用户名称模糊查询,可选) | 
- 
示例 
| 1 | # 创建用户 | 
权限管理
- 
管理员(Super)拥有所以资源的访问权限,普通用户(Normal)则只有对应资源类型的访问权限。以下是为普通用户设置权限的命令。 
| 命令名称 | 操作定义 | 命令参数及解释 | 
|---|---|---|
| createAcl | 创建授权 | -n 127.0.0.1:9876:NameServer 地址(多个以 ;分隔)-b broker 地址 -c DefaultCluster:集群名称 注: -b和-c参数二选一-s User:rocketmq:授权的用户( User:rocketmq表示给用户rocketmq授权)-r Topic:*,Group::资源类型与名称, *表示所有 Topic 和 Group-a Pub,Sub:授权操作类型, Pub表示发布权限,Sub表示订阅权限-i 192.168.1.0/24:授权的 IP 地址范围 -d Allow:授权类型, Allow允许,Deny拒绝 | 
| updateAcl | 更新授权 | -n 127.0.0.1:9876:NameServer 地址 -b broker 地址 -c DefaultCluster:集群名称 注: -b和-c参数二选一-s User:rocketmq:授权的用户 -r Topic:*,Group::资源类型与名称 -a Pub,Sub:授权操作类型 -i 192.168.1.0/24:IP 地址范围 -d Deny:授权类型,更新为 Deny | 
| deleteAcl | 删除授权 | -n 127.0.0.1:9876:NameServer 地址 -b broker 地址 -c DefaultCluster:集群名称 注: -b和-c参数二选一-s User:rocketmq:授权的用户 -r Topic::指定删除某个资源(如 Topic)授权 | 
| listAcl | 查询授权列表 | -n 127.0.0.1:9876:NameServer 地址 -b broker 地址 -c DefaultCluster:集群名称 注: -b和-c参数二选一-s User:rocketmq:授权的用户 -r Topic::指定资源类型(如 Topic) | 
| getAcl | 查询授权详情 | -n 127.0.0.1:9876:NameServer 地址 -b broker 地址 -c DefaultCluster:集群名称 注: -b和-c参数二选一-s User:rocketmq:授权的用户 | 
- 
示例 
| 1 | # 创建授权 | 
Dashboard 配置
- 
此时在 Dashboard 中配置好认证信息并重启,即可正常访问RocketMQ集群,并且支持在web端配置ACL认证信息。 
| 1 | # vim run/application.yaml # 按需替换配置 | 
Proxy 配置
- 
Broker 开启 ACL 2.0 认证后,即使在代码中添加了ACL认证信息的情况下,新版客户端(rocketmq-client-java)通过 Proxy发送或订阅消息依旧会失败,原客户端(rocketmq-client)通过Nameserver发送或订阅消息正常,尚不知道该如何完美解决。
- 
按照这篇文章Apache RocketMQ ACL 2.0 全新升级的介绍,在所有 Proxy 的配置文件 rmq-proxy.json中增加认证与授权配置依旧没有解决该问题。
| 1 | { | 
- 
异常信息如下: 
| 1 | Caused by: org.apache.rocketmq.client.java.exception.UnauthorizedException: [request-id=1b2af952-38d9-4201-bd10-055e442c6b59, response-code=40100] Authentication failed. Please verify the credentials and try again. | 
- 
之后通过这篇文章 rocketmq部署踩坑(二) acl配置 的介绍,需要在 rmq-proxy.json中增加如下配置:
| 1 | "enableAclRpcHookForClusterMode": true | 
- 
配置完成后,重启 Proxy,生产者发送消息果然没问题了,消费者启动也不会报错,但是就是接收不到任何消息。 
- 
之后通过这篇文章 关于RocketMq5.3.3开启ACL2.0通过proxy8081端口只能发消息,不能收消息问题简单处理 的说明,将所有 broker.conf中authorizationEnabled配置改为false,重启 Broker,问题解决。
后记
- 
笔者感觉当前 RocketMQ 的 ACL 2.0 认证机制还存在一些bug,就连官网也没有提供的文档说明,暂时先玩玩吧。 
 
 
 
 
 
 
 
 
 
