(架构实战)你的RocketMQ集群是安全的吗?

简介: (架构实战)你的RocketMQ集群是安全的吗?

RocketMQ是一款非常优秀的主流中间件,本文是RocketMQ系列的第52篇文章,重点阐述笔者在公司升级RocketMQ集群并开启ACL的真实经历,并且遇到的一些问题及其解决方案,实战性非常强。


1、ACL机制的重要性


某一天突然接到安全团队的通知,公司内网部署的RocketMQ集群安全性非常低,需要立马整改。


接到安全团队的通知,马上开启了复盘,公司内部的RocketMQ集群还是基于RocketMQ4.1搭建的,存在重大安全隐患,因为生产环境的任意一台机器,不需要知道RocketMQ集群所在机器的密码,就能拥有最高的控制权,说明如下:

9ee54525c985e48ebf873cc37610508d.png

试想一下,如果在生产环境任意一台机器上部署一个rocketmq-console,就可以通过rocketmq-console新增、删除topic,其危害性非常之大,是不是后背发凉


出现这个问题的本质原因:MQ集群没有开启授权访问


2、迎来曙光


为了解决上述重大安全问题,RocketMQ官方在4.4.0版本引入了ACL,提供访问控制,客户端在创建TOPIC、发送消息、消息消息时首先会判断该客户端是否拥有权限,安全性得到增强。


关于如何搭建ACL已在 ACL使用详解已有详细介绍,本文不做详细介绍,本文主要是阐述从4.1.0版本升级到4.8.0之后,开启ACL的可行性研究。


在升级之前,公司几千个应用客户端使用的是4.1.0版本,升级成4.8.0并开启ACL,我们需要重点验证其兼容性。升级后的部署架构如下图所示:

408950e09239f702a456f6ad576d1fb1.png



主要几个测试用例:


  • 客户端不开启ACL,服务端开启ACL
  • 客户端开启ACL,服务端不开启ACL


在进一步深入讲解这些用例把背后的的诉求前,说明一下客户端开启ACL是指在构建消息发送者、消息消费者时,传入与ACL相关的参数,截图如下:

8ef3887260991790e3b853f8a2603982.png

接下来逐步分析上述测试用例的目的。


2.1 客户端不开启ACL,服务端开启ACL


例如像我们公司的技术架构,涉及到数据的流转,重度依赖MQ,目前应用中存在太多的低版本的MQ客户端,例如4.1.0,如果服务端开启了ACL,如果能兼容低版本客户端,那这样升级起来就会显得非常容易,但经过测试:结果为不兼容。其实这个也好理解,服务端开启了ACL,客户端没有授权信息,是肯定不会让你通过的。


2.2 客户端开启ACL,服务端不开启ACL


经过测试,服务端如果不开启ACL的话,尽管客户端在消息发送、消息消费等场景下发送了授权信息,但服务端会忽略这些信息,并不会触发ACL校验


3、优雅升级与弊端


基于开源版本,通过上面的验证,其优雅升级思路:为各个客户端规划好用户名与密钥,并且对所有客户端进行改造,等待所有客户端都完成改造后,服务端再开启ACL。


通常在具体实践中,由于涉及所有客户端改造,可以分集群进行改造,由上到下推动该事项的执行,统一定好一个客户端改造的最后时间点,在该时间点后,服务端开启ACL,至此完成RocketMQ集群的授信访问。、


上述方案的缺点也是显而易见的,需要客户端先行改动,只有等所有客户端全部改造完成后,服务端才能开启ACL。


4、自定义ACL校验器


由于当时项目的升级的迫切性,基于官方版本这种升级方案显然无法满足我们当时的需求。回到文章开头部分说的紧迫诉求:当务之急是要限制生产环境任意一台机器对MQ集群的管理权限,即限制对MQ中topic、消费组的创建与删除,对Broker相关配置的修改。


为了解决上述问题,需要利用RocketMQ自定义的ACL校验机制,其策略概况如下:


  • 对于需要admin权限的操作,服务端必须开启校验。
  • 对于不需要admin权限的操作,例如消息的发送、消费,如果客户端没有上传校验信息,默认放行


基于上述这样的改造,暂时可以解决问题。


RocketMQ的acl校验器是基于SPI机制,可插拔,提供了org.apache.rocketmq.acl.AccessValidator接口,并且需要将具体实现类写入到broker/src/main/resources/META-INF.service /org.apache.rocketmq.acl. AccessValidat or文件中。

f1ccb662ac043a2583ff63370cfe37c6.png

但需要注意的是,如果该文件中配置了多个校验器,会自动组装成链条。


在实际使用过程中,发现这种扩展机制从使用层面来看并不优好,校验器(策略)尽量参数化,即在broker中使用参数来指定。



相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
2月前
|
消息中间件 存储 Java
RocketMQ(一):消息中间件缘起,一览整体架构及核心组件
【10月更文挑战第15天】本文介绍了消息中间件的基本概念和特点,重点解析了RocketMQ的整体架构和核心组件。消息中间件如RocketMQ、RabbitMQ、Kafka等,具备异步通信、持久化、削峰填谷、系统解耦等特点,适用于分布式系统。RocketMQ的架构包括NameServer、Broker、Producer、Consumer等组件,通过这些组件实现消息的生产、存储和消费。文章还提供了Spring Boot快速上手RocketMQ的示例代码,帮助读者快速入门。
|
23天前
|
消息中间件 Java Kafka
实时数仓Kappa架构:从入门到实战
【11月更文挑战第24天】随着大数据技术的不断发展,企业对实时数据处理和分析的需求日益增长。实时数仓(Real-Time Data Warehouse, RTDW)应运而生,其中Kappa架构作为一种简化的数据处理架构,通过统一的流处理框架,解决了传统Lambda架构中批处理和实时处理的复杂性。本文将深入探讨Kappa架构的历史背景、业务场景、功能点、优缺点、解决的问题以及底层原理,并详细介绍如何使用Java语言快速搭建一套实时数仓。
113 4
|
1月前
|
运维 NoSQL Java
后端架构演进:微服务架构的优缺点与实战案例分析
【10月更文挑战第28天】本文探讨了微服务架构与单体架构的优缺点,并通过实战案例分析了微服务架构在实际应用中的表现。微服务架构具有高内聚、低耦合、独立部署等优势,但也面临分布式系统的复杂性和较高的运维成本。通过某电商平台的实际案例,展示了微服务架构在提升系统性能和团队协作效率方面的显著效果,同时也指出了其带来的挑战。
75 4
|
1月前
|
监控 安全 Cloud Native
云原生安全:Istio在微服务架构中的安全策略与实践
【10月更文挑战第26天】随着云计算的发展,云原生架构成为企业数字化转型的关键。微服务作为其核心组件,虽具备灵活性和可扩展性,但也带来安全挑战。Istio作为开源服务网格,通过双向TLS加密、细粒度访问控制和强大的审计监控功能,有效保障微服务间的通信安全,成为云原生安全的重要工具。
47 2
|
2月前
|
Kubernetes 安全 微服务
使用 Istio 缓解电信 5G IoT 微服务 Pod 架构的安全挑战
使用 Istio 缓解电信 5G IoT 微服务 Pod 架构的安全挑战
63 8
|
2月前
|
存储 前端开发 API
DDD领域驱动设计实战-分层架构
DDD分层架构通过明确各层职责及交互规则,有效降低了层间依赖。其基本原则是每层仅与下方层耦合,分为严格和松散两种形式。架构演进包括传统四层架构与改良版四层架构,后者采用依赖反转设计原则优化基础设施层位置。各层职责分明:用户接口层处理显示与请求;应用层负责服务编排与组合;领域层实现业务逻辑;基础层提供技术基础服务。通过合理设计聚合与依赖关系,DDD支持微服务架构灵活演进,提升系统适应性和可维护性。
|
3月前
|
运维 持续交付 API
深入理解并实践微服务架构:从理论到实战
深入理解并实践微服务架构:从理论到实战
146 3
|
3月前
|
存储 缓存 负载均衡
亿级流量架构理论+秒杀实战系列(二)
亿级流量架构理论+秒杀实战系列(二)
|
2月前
|
消息中间件 数据采集 中间件
RabbitMQ的使用—实战
RabbitMQ的使用—实战
93 0
|
3月前
|
运维 监控 持续交付
深入浅出:微服务架构的设计与实战
微服务,一个在软件开发领域如雷贯耳的名词,它代表着一种现代软件架构的风格。本文将通过浅显易懂的语言,带领读者从零开始了解微服务的概念、设计原则及其在实际项目中的运用。我们将一起探讨如何将一个庞大的单体应用拆分为灵活、独立、可扩展的微服务,并分享一些实践中的经验和技巧。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的视角和深入的理解。
84 3