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,就连官网也没有提供的文档说明,暂时先玩玩吧。