TDMQ RocketMQ 版通过 ACL(Access Control List)策略实现对集群中生产者和消费者权限的控制,您可以在集群下创建多个角色并为其赋予不同资源的生产或者消费权限,以达到不同用户之间权限隔离的目的。每种角色都有其对应的唯一密钥,用户可以通过在客户端中添加密钥来访问 RocketMQ 进行消息的生产消费,当客户端进行消息生产或消费时,系统会进行身份鉴权,未被授权的操作将被拒绝。
这种机制有效实现了不同业务单元之间的权限隔离,既保障了消息系统的安全性,又满足了多团队协作场景下的资源管控需求,通过权限最小化原则从根本上避免了越权访问导致的数据混乱问题。
使用场景
用户需要安全地使用 RocketMQ 进行消息的生产消费。
用户需要对同一集群设置不同角色的生产消费权限。
例如:一个公司有 A 部门和 B 部门,A 部门的系统产生交易数据,B 部门的系统根据这些交易数据做数据分析和展示。那么遵循权限最小化原则,可以配置两种角色,A 部门角色只授予往交易系统集群中生产消息的权限,B 部门则只授予消费消息的权限。这样可以很大程度避免由于权限不清带来的数据混乱、业务脏数据等问题。
使用限制
不同的集群类型支持配置权限的资源维度不同,具体说明如下表:
集群类型 | 可配置权限的资源维度 | 可配置的权限 |
5.x 体验版/基础版集群 | 集群 | 生产消息、消费消息 |
5.x 专业版/铂金版集群 | 集群 | 生产消息、消费消息 |
| Topic | 生产消息、消费消息 |
| Group | 消费消息 |
4.x 通用集群 | 集群 | 生产消息、消费消息 |
| Topic | 生产消息、消费消息 |
| Group | 消费消息 |
4.x 专享集群/虚拟集群 | 集群 | 生产权限、消费权限 |
若您的5.x 专业版/铂金版集群或者4.x 通用集群无法配置 Topic&Group 粒度权限,请提交工单申请。
操作步骤
添加角色并授权
1. 登录 TDMQ RocketMQ 版控制台。
2. 在左侧导航栏选择集群管理,选择地域后,点击要配置角色的集群的“ ID ”,进入基本信息页面。
3. 在页面上方选择集群权限(5.x 集群)或者角色管理(4.x 集群)页签,单击添加角色,输入角色名称,并配置好生产和消费权限。
参数 | 说明 |
角色 | 自定义角色名称,用于区分不同的用户。 需符合命名规则:只支持数字 大小写字母 分隔符("_","-"),不能超过 32 个字符。 用户名创建成功后,不可修改。 |
说明 | 角色的说明信息,不能超过 32 个字符 |
资源类型 | 集群:根据业务需求选择配置生产权限或者消费权限。 |
| Topic&Group(仅 5.x 专业版/铂金版集群和 4.x 通用集群支持):需要单独针对 Topic 和 Group 配置生产和消费权限。 Topic 操作类型:分为生产和消费两类: 生产消息:表示允许当前角色往选中 Topic 发送消息; 消费消息:表示允许当前角色消费选中 Topic 中的消息; 不勾选:表示当前角色使用任何 Group(即使在 Group 列表配置了消费权限)均无法消费选中的 Topic 中的消息。 Group 操作类型:只有消费选项: 勾选:表示允许当前角色消费选中 Topic 中的消息; 不勾选:表示当前角色使用任何 Group(即使在 Topic 列表配置了消费权限)均无法消费选中的 Topic。 综上所述,如果要保证当前角色可以使用 GroupA 消费 TopicA 的消息,需要在 Topic 列表选择 TopicA,同时勾选 “消费消息”,同时在 Group 列表选择 GroupA,同时勾选 “消费消息”。 |
4. 单击保存,完成角色创建。
检查权限是否生效
1. 在角色列表页面复制角色密钥。

注意:
密钥泄露很可能导致您的数据泄露,请妥善保管您的密钥。
2. 将复制的角色密钥添加到客户端的参数中。如何在客户端代码中添加密钥参数请参考 SDK 文档。
以下给出一种示例:
2.1 声明
ACL_SECRET_KEY和ACL_SECRET_ACCESS两个字段,使用各类框架的话建议从配置文件中读取。private static final String ACL_ACCESS_KEY = "ak****";private static final String ACL_SECRET_KEY = "sk****"; /
2.2 声明一个静态函数,用于载入一个 RocketMQ Client 的
RPCHook对象。static RPCHook getAclRPCHook() {return new AclClientRPCHook(new SessionCredentials(ACL_ACCESS_KEY, ACL_SECRET_KEY));}
2.3 在创建 RocketMQ
producer、pushConsumer或pullConsumer的时候,引入 RPCHook对象。2.4 以下为创建一个
producer 的代码示例:DefaultMQProducer producer = new DefaultMQProducer("rocketmq-mw***", "ProducerGroupName", getAclRPCHo
3. 运行配置好的客户端访问对应集群中的 Topic 资源,按照刚刚配置的权限进行生产或消费,看是否会产生没有权限的报错信息,如果没有即代表配置成功。
关闭 ACL 权限
5.x 集群支持在控制台上关闭 ACL 权限校验,关闭后集群将不会对客户端的收发消息的权限进行校验。为了保证集群安全性,关闭 ACL 前,请先前往集群管理页面关闭公网开关。
在角色列表中,单击左上角的 ACL 权限旁边的按钮,在弹窗中确认后,即可关闭 ACL 权限校验。

编辑权限
1. 在角色列表中,找到需要编辑权限的角色,单击操作列的编辑。

2. 在编辑的弹框中,修改权限信息后,单击保存。

删除角色
注意
删除角色后,原先使用该角色进行生产或消费消息的密钥( AccessKey 和 SecretKey )将立即失效。请确保当前业务已经没有使用该角色进行消息的生产消费,否则可能会出现客户端无法生产消费而导致的异常。
1. 在集群权限列表中,找到需要删除权限的角色,单击操作列的删除。
2. 在删除的弹框中,单击删除,即可删除该角色。

导入/导出角色
您可以通过角色列表页右上角的 
按钮直接导出元数据,元数据的导出格式为 .xlsx 格式的表格文件。

如果您需要将一个集群的角色和权限导入到另一个集群内,在导出元数据后,您可以单击角色列表页右上角的 
按钮,将权限数据导入到指定的集群内。如果您的数据来源不是腾讯云的 RocketMQ,可以参考文件模板链接处找到对应的模板,进行相应的字段编辑后再导入文件。

