Apache RocketMQ ACL 2.0 全新升级
引言
Aliware
RocketMQ 作为一款流行的分布式消息中间件,被广泛应用于各种大型分布式系统和微服务中,承担着异步通信、系统解耦、削峰填谷和消息通知等重要的角色。随着技术的演进和业务规模的扩大,安全相关的挑战日益突出,消息系统的访问控制也变得尤为重要。然而,RocketMQ 现有的 ACL 1.0 版本已经无法满足未来的发展。因此,我们推出了 RocketMQ ACL 2.0 升级版,进一步提升 RocketMQ 数据的安全性。本文将介绍 RocketMQ ACL 2.0 的新特性、工作原理,以及相关的配置和实践。
升级的背景
Aliware
缺少集群组件间访问控制:在 RocketMQ 架构中,涵盖了 NameServer、Broker 主从节点、Proxy 等多个关键组件。目前,这些组件之间的互相访问缺失了关键的的权限验证机制。因此,一但旦在集群外自行搭建 Broker 从节点或 Proxy 组件,便可以绕过现有的安全机制,访问并获取集群内的敏感数据,这无疑给系统的数据安全和集群的稳定性造成巨大的威胁。
特性与原理
Aliware
主体模型
统一主体模型的抽象:为了实现不同实体的访问控制和权限管理,设计了统一的主体接口,允许系统中多个实例作为资源访问的主体。用户作为访问资源的主体之一,按照该模型实现了主体的接口。这为未来新实体类型的权限适配提供了扩展能力。 角色分级与权限赋予:
超级用户:为了简化管理流程,超级用户被自动授予了全部权限,无需单独配置,从而简化了系统的初始化和日常的运维管理工作。 普通用户:普通用户的权限则需要明确授权。ACL 2.0 提供了相关的权限管理工具,可以根据组织的政策和安全需求,为普通用户赋予合适的权限。
支持用户状态管理:为了应对可能出现的安全风险,比如用户密码泄露,ACL 2.0 提供了用户的启用与禁用功能。当发生安全事件,可以通过禁用用户状态,快速进行止血,从而达到阻止非法访问的目的。
认证流程
客户端流程:
客户端在构建 RPC 请求时,检查是否设置了用户名和密码,若未配置,则直接发送请求; 若已配置,则使用预设的加密算法对请求参数进行加密处理,并生成对应的数字签名(Signature)。 在请求中附加用户名和 Signature,并将其发送至服务端以进行身份验证。
服务端接收到请求后,首先检查是否开启认证,若未开启,则不校验直接通过;若已开启了,则进入下一步。 服务端对请求进行认证相关的参数进行解析和组装,获取包括用户名和 Signature 等信息。 通过用户名在本地库中查询用户相关信息,用户不存在,则返回处理无;用户存在,则进入下一步。 获取用户密码,采用相同的加密算法对请求进行加密生成 Signature,并和客户端传递的 Signature 进行比对,若两者一致,则认证成功,不一致,则认证失败。
核心概念
权限模型
授权流程
客户端流程:
客户端在构建 RPC 请求时,构建本次调用的接口入参,接口对应权限背后的操作定义。 客户端在接口入参中设置本次访问的资源信息,然后将用户和资源等参数传递到服务端。
服务端在收到请求后,首先检查是否开启授权,若未开启,则不校验直接通过;若已开启了,则进入下一步。 服务端对请求中和授权相关的参数进行解析和组装,这些数据包括用户信息、访问的资源、执行的操作,以及请求的环境等。 通过用户名在本地数据存储中查询用户相关信息,若用户不存在,则返回错误;若用户存在,则进入下一步。 判断当前用户是否是超级用户,若超级用户,则直接通过请求,无需做授权检查,若普通用户,则进入下一步进行详细的授权检查。 根据用户名获取相关的授权策略列表,并对本次请求的资源、操作,以及环境进行匹配,同时按照优先级进行排序。 根据优先级最高的授权策略做出决策,若授权策略允许该操作,则返回授权成功,若拒绝该操作,则返回无权限错误。
授权参数的解析
权限策略优先级
认证日志
# 认证成功日志[AUTHENTICATION] User:rocketmq is authenticated success with Signature = eMX/+tH/7Bc0TObtDYMcK9Ls+gg=.# 认证失败日志[AUTHENTICATION] User:rocketmq is authenticated failed with Signature = eMX/+tH/7Bc0TObtDYMcK9Ls+xx=.
授权日志
# 授权成功日志[AUTHORIZATION] Subject = User:rocketmq is Allow Action = Pub from sourceIp = 192.168.0.2 on resource = Topic:TP-TEST for request = 10.# 授权失败日志[AUTHORIZATION] Subject = User:rocketmq is Deny Action = Sub from sourceIp = 192.168.0.2 on resource = Topic:GID-TEST for request = 10.
配置与使用
Aliware
存算一体架构
存算分离架构
认证配置
参数列表
Broker 配置
authenticationEnabled = trueauthenticationProvider = org.apache.rocketmq.auth.authentication.provider.DefaultAuthenticationProviderinitAuthenticationUser = {"username":"rocketmq","password":"12345678"}innerClientAuthenticationCredentials = {"accessKey":"rocketmq","secretKey":"12345678"}authenticationMetadataProvider = org.apache.rocketmq.auth.authentication.provider.LocalAuthenticationMetadataProvider
Proxy 配置
{"authenticationEnabled": true,"authenticationProvider": "org.apache.rocketmq.auth.authentication.provider.DefaultAuthenticationProvider","authenticationMetadataProvider": "org.apache.rocketmq.proxy.auth.ProxyAuthenticationMetadataProvider","innerClientAuthenticationCredentials": "{\"accessKey\":\"rocketmq\", \"secretKey\":\"12345678\"}"}
授权配置
参数列表
Broker 配置
authorizationEnabled = trueauthorizationProvider = org.apache.rocketmq.auth.authorization.provider.DefaultAuthorizationProviderauthorizationMetadataProvider = org.apache.rocketmq.auth.authorization.provider.LocalAuthorizationMetadataProvider
Proxy 配置
{"authorizationEnabled": true,"authorizationProvider": "org.apache.rocketmq.auth.authorization.provider.DefaultAuthorizationProvider","authorizationMetadataProvider": "org.apache.rocketmq.proxy.auth.ProxyAuthorizationMetadataProvider"}
命令行使用
用户管理
接口定义
使用案例
# 创建用户sh mqadmin createUser -n 127.0.0.1:9876 -c DefaultCluster -u rocketmq -p rocketmq# 创建用户,指定用户类型sh mqadmin createUser -n 127.0.0.1:9876 -c DefaultCluster -u rocketmq -p rocketmq -t Super# 更新用户sh mqadmin updateUser -n 127.0.0.1:9876 -c DefaultCluster -u rocketmq -p 12345678# 删除用户sh mqadmin deleteUser -n 127.0.0.1:9876 -c DefaultCluster -u rocketmq# 查询用户详情sh mqadmin getUser -n 127.0.0.1:9876 -c DefaultCluster -u rocketmq# 查询用户列表sh mqadmin listUser -n 127.0.0.1:9876 -c DefaultCluster# 查询用户列表,带过滤条件sh mqadmin listUser -n 127.0.0.1:9876 -c DefaultCluster -f mq
ACL 管理
接口定义
使用案例
# 创建授权sh 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 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 mqadmin deleteAcl -n 127.0.0.1:9876 -c DefaultCluster -s User:rocketmq# 删除授权,指定资源sh mqadmin deleteAcl -n 127.0.0.1:9876 -c DefaultCluster -s User:rocketmq -r Topic:*# 查询授权列表sh mqadmin listAcl -n 127.0.0.1:9876 -c DefaultCluster# 查询授权列表,带过滤条件sh mqadmin listAcl -n 127.0.0.1:9876 -c DefaultCluster -s User:rocketmq -r Topic:*# 查询授权详情sh mqadmin getAcl -n 127.0.0.1:9876 -c DefaultCluster -s User:rocketmq
客户端使用
消息发送
ClientServiceProvider provider = ClientServiceProvider.loadService();StaticSessionCredentialsProvider sessionCredentialsProvider =new StaticSessionCredentialsProvider(ACCESS_KEY, SECRET_KEY);ClientConfiguration clientConfiguration = ClientConfiguration.newBuilder().setEndpoints(ENDPOINTS).setCredentialProvider(sessionCredentialsProvider).build();Producer producer = provider.newProducerBuilder().setClientConfiguration(clientConfiguration).setTopics(TOPICS).build();
消息消费
ClientServiceProvider provider = ClientServiceProvider.loadService();ClientConfiguration clientConfiguration = ClientConfiguration.newBuilder().setEndpoints(ENDPOINTS).setCredentialProvider(sessionCredentialsProvider).build();FilterExpression filterExpression = new FilterExpression(TAG, FilterExpressionType.TAG);PushConsumer pushConsumer = provider.newPushConsumerBuilder().setClientConfiguration(clientConfiguration).setConsumerGroup(CONSUMER_GROUP).setSubscriptionExpressions(Collections.singletonMap(TOPIC, filterExpression)).setMessageListener(messageView -> {return ConsumeResult.SUCCESS;}).build();
扩容
接口定义
使用案例
# 拷贝用户sh mqadmin copyUser -n 127.0.0.1:9876 -f 192.168.0.1:10911 -t 192.168.0.2:10911# 拷贝授权sh mqadmin copyAcl -n 127.0.0.1:9876 -f 192.168.0.1:10911 -t 192.168.0.2:10911
迁移
配置定义
在 Broker 的配置文件中开启以下配置:
migrateAuthFromV1Enabled = true特别说明
规划与总结
Aliware
丰富的认证和授权扩展:市场上存在丰富的认证和授权解决方案,其他的存储或计算产品也都采用了各种各样的实现方式。为了紧跟行业的发展趋势,RocketMQ ACL 未来也将努力创新,以满足更为广泛和多变的客户需求。同时,也将持续深化研究和发展更加出色的认证和授权策略,以达到安全性和性能之间的理想平衡。
可视化的用户权限操作:当前,在 ACL 中进行用户和权限的配置仅能通过命令行工具,不够友好。未来我们希望能在 RocketMQ Dashboard 上提供一个清晰、易用的可视化管理界面,从而简化配置流程并降低管理的技术门槛。另一方面,现有的 Dashboard 尚未集成 ACL 访问控制体系,后续也要将它纳入进来,以实现用户在 Dashboard 上对各项资源进行操作的访问权限。
相关链接: