TDMQ RocketMQ 版通过 ACL(Access Control List)策略实现对集群中生产者和消费者权限的控制,您可以在集群下创建多个角色并为其赋予不同资源的生产或者消费权限,以达到不同用户之间权限隔离的目的。每种角色都有其对应的唯一密钥,用户可以通过在客户端中添加密钥来访问 RocketMQ 进行消息的生产消费,当客户端进行消息生产或消费时,系统会进行身份鉴权,未被授权的操作将被拒绝。
这种机制有效实现了不同业务单元之间的权限隔离,既保障了消息系统的安全性,又满足了多团队协作场景下的资源管控需求,通过权限最小化原则从根本上避免了越权访问导致的数据混乱问题。
使用场景
- 用户需要安全地使用 RocketMQ 进行消息的生产消费。
- 用户需要对同一集群设置不同角色的生产消费权限。
例如:一个公司有 A 部门和 B 部门,A 部门的系统产生交易数据,B 部门的系统根据这些交易数据做数据分析和展示。那么遵循权限最小化原则,可以配置两种角色,A 部门角色只授予往交易系统集群中生产消息的权限,B 部门则只授予消费消息的权限。这样可以很大程度避免由于权限不清带来的数据混乱、业务脏数据等问题。
操作步骤
新增角色
- 登录 RocketMQ 控制台。
- 在左侧导航栏选择集群管理,选择地域后,点击要配置角色的集群的“ ID ”,进入基本信息页面。
- 在页面上方选择集群权限(5.x 集群)或者角色管理(4.x 集群)页签,单击添加角色,输入角色名称,并配置好生产和消费权限。
- 单击保存,完成当前集群角色的创建。
角色授权
在角色列表页面复制角色密钥。
注意
密钥泄露很可能导致您的数据泄露,请妥善保管您的密钥。
将复制的角色密钥添加到客户端的参数中。
以下给出一种推荐的方式。声明
ACL_SECRET_KEY和ACL_SECRET_ACCESS两个字段,使用各类框架的话建议从配置文件中读取。private static final String ACL_ACCESS_KEY = "eyJr****"; private static final String ACL_SECRET_KEY = "bigdata"; //使用上图页面的角色名称即可声明一个静态函数,用于载入一个 RocketMQ Client 的
RPCHook对象static RPCHook getAclRPCHook() { return new AclClientRPCHook(new SessionCredentials(ACL_ACCESS_KEY, ACL_SECRET_KEY)); }在创建 RocketMQ
producer、pushConsumer或pullConsumer的时候,引入RPCHook对象
以下为创建一个 producer 的代码示例:
``` java
DefaultMQProducer producer = new DefaultMQProducer("rocketmq-mw***|namespace", "ProducerGroupName", getAclRPCHook());
```
- (仅 4.x 集群需操作)在 TDMQ RocketMQ 控制台选择之前设定了角色的集群后,切换到命名空间,选择需要配置生产消费权限的一个命名空间,单击操作列的配置权限。单击添加角色,在下拉列表中找到刚刚新创建的角色,勾选上需要的权限,单击保存。
- 检查权限是否生效。
- 您可以运行配置好的客户端访问对应命名空间中的 Topic 资源,按照刚刚配置的权限进行生产或消费,看是否会产生没有权限的报错信息,如果没有即代表配置成功。
编辑权限
- 在角色列表中,找到需要编辑权限的角色,单击操作列的编辑。
- 在编辑的弹框中,修改权限信息后,单击保存。
删除权限
注意
删除角色后,原先使用该角色进行生产或消费消息的密钥( AccessKey 和 SecretKey )将立即失效。请确保当前业务已经没有使用该角色进行消息的生产消费,否则可能会出现客户端无法生产消费而导致的异常。
- 在角色列表中,找到需要删除权限的角色,单击操作列的删除。
- 在删除的弹框中,单击删除,即可删除该角色。
导入/导出角色
您可以通过角色列表页右上角的
按钮直接导出元数据,元数据的导出格式为 .xlsx 格式的表格文件。
如果您需要将一个集群的角色和权限导入到另一个集群内,在导出元数据后,您可以单击角色列表页右上角的
按钮,将权限数据导入到指定的集群内。如果您的数据来源不是云平台的 RocketMQ,可以参考文件模板链接处找到对应的模板,进行相应的字段编辑后再导入文件。