RocketMQ ACL 2.0

摘要

  • 本文介绍 RocketMQ ACL 2.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 2.0 简介

配置步骤

  • 本文在 RocketMQ 的安装及使用 中 集群 安装完成之后,开始配置 ACL 2.0。

  • 在所有 Broker 的配置文件broker.conf中增加认证与授权配置:

1
2
3
4
5
6
7
8
9
10
11
# broker.conf
# 认证配置
authenticationEnabled = true
authenticationProvider = org.apache.rocketmq.auth.authentication.provider.DefaultAuthenticationProvider
initAuthenticationUser = {"username":"mqadmin","password":"1234567"}
innerClientAuthenticationCredentials = {"accessKey":"mqadmin","secretKey":"1234567"}
authenticationMetadataProvider = org.apache.rocketmq.auth.authentication.provider.LocalAuthenticationMetadataProvider
# 授权配置
authorizationEnabled = true
authorizationProvider = org.apache.rocketmq.auth.authorization.provider.DefaultAuthorizationProvider
authorizationMetadataProvider = org.apache.rocketmq.auth.authorization.provider.LocalAuthorizationMetadataProvider
参数定义 参数名称 参数描述
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
2
accessKey: mqadmin
secretKey: 1234567

用户管理

接口定义 接口名称 接口参数
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
2
3
4
5
6
7
8
9
10
11
12
13
14
# 创建用户
sh bin/mqadmin createUser -n 127.0.0.1:9876 -c DefaultCluster -u rocketmq -p rocketmq
# 创建用户,指定用户类型
sh bin/mqadmin createUser -n 127.0.0.1:9876 -c DefaultCluster -u rocketmq -p rocketmq -t Super
# 更新用户
sh bin/mqadmin updateUser -n 127.0.0.1:9876 -c DefaultCluster -u rocketmq -p 12345678
# 删除用户
sh bin/mqadmin deleteUser -n 127.0.0.1:9876 -c DefaultCluster -u rocketmq
# 查询用户详情
sh bin/mqadmin getUser -n 127.0.0.1:9876 -c DefaultCluster -u rocketmq
# 查询用户列表
sh bin/mqadmin listUser -n 127.0.0.1:9876 -c DefaultCluster
# 查询用户列表,带过滤条件
sh bin/mqadmin listUser -n 127.0.0.1:9876 -c DefaultCluster -f mq

权限管理

  • 管理员(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
2
3
4
5
6
7
8
9
10
11
12
13
14
# 创建授权
sh bin/mqadmin createAcl -n 127.0.0.1:9876 -c DefaultCluster -s User:rocketmq -r Topic:*,Group:* -a Pub,Sub -i 192.168.1.0/24 -d Allow
# 更新授权
sh bin/mqadmin updateAcl -n 127.0.0.1:9876 -c DefaultCluster -s User:rocketmq -r Topic:*,Group:* -a Pub,Sub -i 192.168.1.0/24 -d Deny
# 删除授权
sh bin/mqadmin deleteAcl -n 127.0.0.1:9876 -c DefaultCluster -s User:rocketmq
# 删除授权,指定资源
sh bin/mqadmin deleteAcl -n 127.0.0.1:9876 -c DefaultCluster -s User:rocketmq -r Topic:*
# 查询授权列表
sh bin/mqadmin listAcl -n 127.0.0.1:9876 -c DefaultCluster
# 查询授权列表,带过滤条件
sh bin/mqadmin listAcl -n 127.0.0.1:9876 -c DefaultCluster -s User:rocketmq -r Topic:*
# 查询授权详情
sh bin/mqadmin getAcl -n 127.0.0.1:9876 -c DefaultCluster -s User:rocketmq

Dashboard 配置

  • 此时在 Dashboard 中配置好认证信息并重启,即可正常访问RocketMQ集群,并且支持在web端配置ACL认证信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 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
2
3
4
5
6
7
8
9
{
"authenticationEnabled": true,
"authenticationProvider": "org.apache.rocketmq.auth.authentication.provider.DefaultAuthenticationProvider",
"authenticationMetadataProvider": "org.apache.rocketmq.proxy.auth.ProxyAuthenticationMetadataProvider",
"innerClientAuthenticationCredentials": "{\"accessKey\":\"mqadmin\", \"secretKey\":\"1234567\"}",
"authorizationEnabled": true,
"authorizationProvider": "org.apache.rocketmq.auth.authorization.provider.DefaultAuthorizationProvider",
"authorizationMetadataProvider": "org.apache.rocketmq.proxy.auth.ProxyAuthorizationMetadataProvider"
}
  • 异常信息如下:

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.
1
"enableAclRpcHookForClusterMode": true

后记

  • 笔者感觉当前 RocketMQ 的 ACL 2.0 认证机制还存在一些bug,就连官网也没有提供的文档说明,暂时先玩玩吧。