告别裸奔,聊聊主流消息队列的认证和鉴权!

大家好,我是君哥。

我们在使用消息队列时,经常关注的是消息队列收发消息的功能。但好多时候需要对客户端有一定的限制,比如只有持有令牌的客户端才能访问集权,不允许 Producer 发送消息到某一个 Topic,或者某一个 Topic 只能给固定 Consumer 消费。

为了能对客户端有一定限制,需要对消息队列进行认证和鉴权,今天我们就来聊一聊主流消息队列是怎么做认证和鉴权的。

1 认证

认证是指通过一定手段,对访问用户身份进行校验,只有校验通过的用户,才允许访问。

默认情况下,主流消息队列是不开启认证的,这也意味着只要网络能通,客户端就可以访问 Broker 集群,可以说集群处于“裸奔”的状态,有很大的风险。

消息队列的认证,是指对客户端进行身份确认,只有认证通过的客户端才可以访问 Broker 集群资源。

常见的认证的方式有很多,主流消息队列一般会定义一个认证框架来制定认证规则,然后通过实现这个框架来定义具体认证方式。

1.1 SSL/TLS

SSL(Secure Sockets Layer)是为网络通信提供安全及数据完整性的一种安全协议,消息队列基于 SSL 的认证是指 Broker 和客户端的认证,可以是单向认证,也可以是双向认证。

消息队列为了提升吞吐量,降低延迟,一般都是基于 TCP/IP 协议构建的,SSL 协议位于应用层和传输层之间。

图片

使用 SSL 进行通信前,客户端和 Broker 都需要引入各自的证书,并且引入对应编程语言的 SSL 库。通信时,客户端携带对应的证书和公钥信息,与 Broker 建立连接,Broker 则对客户端进行认证,认证成功后,客户端才能进行下一步操作。

Kafka 在早期的 0.9 版本引入了 SSL。

SSL3.0 版本后改名成 TLS,TLS 是 SSL 的升级版本。Pulsar 和 RabbitMQ 这 2 个消息队列支持 TLS。

1.2 SASL

SASL 全称是 Simple Authentication and Security Laye,是一种标准化的 C/S 身份认证协议,客户端和服务器基于这个协议交换身份信息,验证成功后才可以建立连接。

SASL 其实是一中认证框架,基于这个框架我们可以实现多种认证机制,比如用户名密码、Kerberos、NTLM、OAuth等。

Kafka 0.9.0.0 版本开始支持 SASL,并且基于 SASL 实现了多种认证插件。如下图:

图片

  • GSSAPI 是用来支持 Kerberos 协议的,如果公司已经做过 Kerberos 认证,那使用 GSSAPI 会非常方便。

  • PLAIN 是一种使用用户名密码的认证机制,可以跟 SSL 搭配使用,更加适合小公司的 Kafka 集群使用。PLAIN 有一个很大的缺点就是增加或删除用户,需要重启 Broker 集群才能生效,因为认证用户保存在静态文件中,Broker 集群不能动态加载。

  • SCRAM 将认证用户保存在 ZooKeeper,解决了 PLAIN 增加或删除用户需要重启集群的问题。

  • OAUTHBEARER 是 Kafka 在 2.0 版本引入的,主要是为了实现 OAuth2 认证机制。

  • Delegation Token 是 SASL 机制的补充,它是基于 Token 的一种认证机制,它的特点是非常轻量级,用户获取到一次 Token 之后,后面的请求过程中可以继续使用这个 Token(除了 Token 更新),无须再次获取。

1.3 AK/SK

RocketMQ 基于 AK/SK 实现认证方式,通过对称加密来验证客户端身份,保证认证密码不会以明文在网络上传输,提升认证安全。

客户端发送请求时,使用加密算法对请求参数进行加密,然后生成数字签名,在请求中发送用户名和签名信息。Broker 收到请求后,首先查询用户名是否在本地库(不存在则认证失败),如果存在,则用相同的算法对请求进行加密和签名,然后比较签名结果跟客户端请求中的签名信息是否一致。

1.4 自定义框架

RabbitMQ 和 Pulsar 都提供了自定义、可插拔的身份认证框架,然后基于框架的接口来实现各种认证插件,在配置文件中指定要使用的认证插件。

Pulsar 内置的认证插件包括 JWT、OAuth2.0、Athenz、Kerberos 等。

RabbitMQ 实现的认证插件包括 AMQPLAIN 和 PLAIN。

总结:认证框架的选择很多,Kafka 选择的 SASL 机制更加完善,功能更加强大,实现起来也更加复杂。而自定义的机制则实现更加简单,同时也能满足消息队列的认证需求。

下面对主流消息队列使用的认证方式总结如下:

消息队列认证方式
KafkaSASL:GSSAPI、PLAIN、SCRAM、OAUTHBEARER、Delegation Token
RocketMQAK/SK
RabbitMQAMQPLAIN、PLAIN
PulsarJWT、OAuth2.0、Athenz、Kerberos

2 鉴权

客户端通过认证后,就跟 Broker 建立了连接,但是并不是每个客户端都可以操作所有的集群资源,比如银行里面的不同业务数据不能给所有客户端访问。这就需要对客户端做资源访问限制。

授权是指对客户端赋予一定的权限,比如允许客户端从某一个 Topic 拉取消息。

消息队列对于资源的操作分为两种,一种是运维相关操作,比如创建 Topic、创建用户等,权限一般分配给运维人员。另一种是数据相关操作,包括生产消费消息,权限一般分配给业务系统客户端。

要实现资源控制,一般分成两种方式,下面详细介绍一下。

2.1 链路分开

如果分开两条链路来操作集群资源,一条链路由运维人员来通过 HTTP 来操作集群资源,另一条链路由业务系统客户端通过 TCP 来收发消息,这样实现权限控制就非常容易,成本很低。

图片

主流消息队列 Pulsar 和 RabbitMQ 就是这种方式实现的。

这种方式也有一个问题,就是集群中需要开启两个 Server 来服务两个链路。

2.2 一条链路

跟两条链路相对应的是,运维操作和业务客户端操作都通过一条链路来实现。

图片

一条链路的方式集群不用启动两个 Server,但是需要根据用户来分配权限,需要在代码层面实现集群的资源控制,实现难度较大。主流消息队列中的 Kafka 和 RocketMQ 就是用的这种方式。

2.3 访问控制

无论是两条链路还是一条链路,都无法细粒度地控制集群资源。比如运维操作要限制某个用户只能添加 Topic 而不能删除 Topic,业务系统客户端只被允许从某一个 Topic 发送和消费消息。

想要细粒度的控制集群资源,就需要引入鉴权模型,常见的鉴权模型如下:

  • ACL:Access Control List,也就是访问控制列表,特点是直接把用户和权限关联起来。

  • RBAC:Role Based Access Control,基于角色的权限控制,特点是引入了角色的概念,先将资源权限分配给角色,再把角色分配给用户。

  • ABAC:Attribute Based Access Control,基于属性的权限控制,是一种动态授权策略,他把用户要访问的资源跟资源的属性、环境因素结合起来,比如对一个资源的访问限制到时间级别。

  • PBAC:Policy Based Access Control,基于策略的权限控制,可以基于任务或事件等其他不同的场景灵活配置访问权限。

2.4 ACL

主流的消息队列都是基于 ACL 来实现鉴权的。要实现 ACL(Access Control List) ,首先需要定义好集群中有哪些资源或哪些操作需要做鉴权。

主流消息队列中,Kafka 的资源或操作定义非常细致,资源包括:Topic、消费者组、Broker 集群等,操作则包括:读、写、创建、删除、修改、订阅等。Kafka 对资源的操作定义成不同接口(比如创建 Topic),通过接口来做鉴权控制。见官网 KIP-11  下面链接。

https://cwiki.apache.org/confluence/display/KAFKA/KIP-11+-+Authorization+Interface

图片

Kafka 实现了可插拔的授权机制,该机制把所有 ACL 项保存在 ZooKeeper,Zookeeper 创建 /kafka-acl 节点进行保存。Kafka 提供了 kafka-acls 脚本,可以动态修改 ACL 配置项,并且可以立即生效。在 server.properties 中加入下面配置,就可以开启 ACL 鉴权:

authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer

其中 SimpleAclAuthorizer 是 Kafka 自带的鉴权实现类,这里也可以配置自定义的鉴权实现类。

RabbitMQ 的架构相对简单,定义的资源主要包括:Exchange、Queue 等,操作则包括读、写、配置。因为 RabbitMQ 的集群配置是通过 HTTP API 操作,所以并没有提供接口维度的权限控制。

Pulsar 的鉴权包括生产、消费、Lookup、Function、Source(从数据源读取数据)、Sink(数据存入下游)、Packages(保存用户代码包)。鉴权信息保存在 Zookeeper 的 /admin/policies/[namespace] 目录下。Pulsar 也支持可插拔的授权框架,默认实现类是 PulsarAuthorizationProvider。

RocketMQ 中的 ACL 提供了 Topic 资源级别的用户访问控制。用户在使用 RocketMQ 权限控制时,可以在 Client 客户端通过 RPCHook 注入 AccessKey 和 SecretKey 签名,同时将对应的权限控制属性(包括 Topic 访问权限、IP 白名单和 AccessKey 和 SecretKey 签名等)设置在 distribution/conf/plain_acl.yml 的配置文件中。

RocketMQ 对 Topic 资源访问权限控制定义了四种,下面表格来自官网 ,

https://rocketmq.apache.org/zh/docs/4.x/bestPractice/04access/

权限含义
DENY拒绝
ANYPUB 或者 SUB 权限
PUB发送权限
SUB订阅权限

权限定义的关键属性参考 distribution/conf/plain_acl.yml 配置文件。

RocketMQ 的用户分为普通用户和管理员用户,跟普通用户相比,管理员用户具有更新或创建主题、更新 Broker 配置、删除主题、更新或创建订阅组信息、删除订阅组信息等权限。

2.5 超级用户

消息队列的超级用户能够访问集群中所有的资源,对集群运维非常方便。比如分配出去的用户密码被恶意修改了,集群无法访问,这时超级用户可以把密码再改回来。超级用户可以让运维人员方便地执行紧急性、临时性地操作。

超级用户一般固定在配置文件中,客户端对集群进行访问控制的时候,集群对用户是否是超级用户进行判断。

Kafka 和 Pulsar 都有超级用户的机制,RabbitMQ 则没有超级用户。

3 总结

默认情况下,主流消息队列都是不开启认证和鉴权的。但在复杂的业务架构中,为了保证队列中数据安全性,必须开启认证和鉴权。消息队列的认证机制有很多,鉴权则主要是通过 ACL 来实现。希望本文能对你理解消息队列的认证和鉴权有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/656034.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring源码编译常见问题解决方案

Spring源码编译常见问题 gradle下载太慢 使用镜像下载。 在gradle-wrappert.prtopertties文件中,将distributionUrl的值修改为镜像地址,这里使用了腾讯的gtrale镜像。 distributionUrlhttps\://mirrors.cloud.tencent.com/gradle/gradle-7.5.1-bin.zi…

H4022 12V24V36V40V4A同步降压芯片 Buck-DCDC 高效率95%

H4022 40V4A同步降压芯片是一款Buck-DCDC转换器,其高效率、高稳定性。以下是对该产品的详细分析: 一、产品优势 高效率:H4022的转换效率高达95%,这主要得益于其同步降压技术。同步降压技术相较于传统的异步降压技术,能…

区块链系统开发测试----链码部署开发、系统开发验证

一.检查配置环境 检查虚拟机环境,确保有正在运行的Hyperledger Fabric区块链,并且其中chaincode_basic、credit_chaincode链码可以正常调用 查看chaincode_basic、credit_chaincode链码调用 二.开发征信链码代码 基于现有征信链码,开发征信…

Debug-012-el-popover 使用 doClose() 关闭窗口不生效的处理方案

前言: 今天上午碰见一个非常奇怪的情况:一样的方法实现的功能,效果却不一样。 两个页面都是使用的doClose()去关闭的el-popover,其中有一个就是不生效,找不同找了半天,始终不得其解。请看效果吧&#xff1…

百度页面奔跑的白熊html、css

一、相关知识-动画 1.基本使用:先定义再调用 2. 调用动画 用keyframes定义动画(类似定义类选择器) keyframes动画名称{ 0%{ width:100px; } 100%{ width:200px; } } 使用动画 div { width:200px; height:200px; background-…

从华为云Redis到AWS ElastiCache的操作方法

越来越多企业选择出海,那么就涉及到IT系统的迁移,本文将详细介绍如何将华为云Redis顺利迁移到AWS ElastiCache的操作方法,九河云将为您介绍迁移步骤以帮助您顺利完成这一重要任务。 **1. 确定迁移计划** 在开始迁移之前,首先要制…

身为UI设计老鸟,不学点3D,好像要被潮流抛弃啦,卷起来吧。

当前3D原则在UI设计中运用的越来越多,在UI设计中,使用3D元素可以为界面带来以下几个价值: 增强视觉冲击力:3D元素可以通过立体感和逼真的效果,为界面增添视觉冲击力,使得设计更加生动、吸引人,并…

在VS Code中进行Java的单元测试

在VS Code中可以使用 Test Runner for Java扩展进行Java的测试执行和调试。 Test Runner for Java的功能 Test Runner for Java 结合 Language Support for Java by Red Hat 和 Debugger for Java这两个插件提供如下功能: 运行测试: Test Runner for …

protobuf —— 快速上手

protobuf —— 快速上手 创建 .proto 文件添加注释指定proto3语法package 声明符定义消息(message) 定义消息字段字段定义基本格式字段名称命名规范字段类型字段唯一编号示例 转换关系示例:增加姓名和年龄字段 字段唯一编号字段编号范围编码效…

短视频真人配音:成都科成博通文化传媒公司

短视频真人配音:情感传递的新维度 随着数字化媒体的飞速发展,短视频已经成为人们日常生活中不可或缺的一部分。而在这个视觉盛宴的时代,真人配音的加入为短视频注入了新的活力,不仅丰富了内容形式,更使得情感传递达到…

Oracle EBS API创建AP发票报错:ZX_TAX_STATUS_NOT_EFFECTIVE和ZX_REGIME_NOT_EFF_IN_SUBSCR-

背景 由创建国外业务实体财务未能提供具体国家地区会计税制,而是实施人员随便选择其它国外国家地区会计税制。导致客户化创建AP发票程序报错:UNEXPECTED TAX ERROR-导入时出现意外的税务错误ZX_TAX_STATUS_NOT_EFFECTIVE-ZX_REGIME_NOT_EFF_IN_SUBSCR-ZX…

基于双向长短期记忆BiLSTM对消费者投诉进行多类分类

前言 系列专栏:【深度学习:算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域,讨论了各种复杂的深度神经网络思想,如卷积神经网络、循环神经网络、生成对抗网络、门控循环单元、长短期记…

ssm150旅游网站的设计与实现+jsp

旅游网站设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本旅游网站就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞…

STM32学习和实践笔记(30):窗口看门狗(WWDG)实验

1.WWDG介绍 1.1 WWDG简介 上一章我们已经介绍了IWDG,知道它的工作原理就是一个12位递减计数器不断递减计数,当减到0之前还未进行喂狗的话,产生一个MCU复位。 窗口看门狗WWDG其实和独立看门狗类似,它是一个7位递减计数器不断的往…

学至乎没而后止也

开场白 学至后没而后止也这个题目的原话来自与荀子《劝学》。大家知道什么意思吗?学习要学到你人没了,才算停止了。通俗点说就是只要没学死就往死里学,高雅点说就是要保持终身学习。 在以前说终身学习好像是一种良好习惯或品德,…

Android NDK系列(一)手动搭建Native Project

使用NDK编写的本地代码具有高性能等特性,在游戏、图形处理等领域有广泛应用,下面介绍如何手动搭建一个纯C版的Android项目,通过该项目可以理解Android的项目结构。 一、创建settings.gradle Android项目是基于Gradle构建的,首先得…

【go项目01_学习记录15】

重构MVC 1 Article 模型1.1 首先创建 Article 模型文件1.2 接下来创建获取文章的方法1.3 新增 types.StringToUint64()函数1.4 修改控制器的调用1.5 重构 route 包1.6 通过 SetRoute 来传参对象变量1.7 新增方法:1.8 控制器将 Int64ToString 改为 Uint64ToString1.9…

ubuntu24.04LVM扩容问题

目录 一、 开机前设置:扩展 二、 开机后设置:分区管理 通过gparted管理分区有效做法。 一、 开机前设置:扩展 虚拟机关机。打开虚拟机设置。 挂起状态是不能扩容的 这里选择扩容到40G 二、 开机后设置:分区管理 使用gpar…

基于Matlab的车道线检测系统 (文末有代码获取链接)【含Matlab源码 MX_001期】

运行环境:Matlab2014b 部分代码: %% 视频流循环处理 % 创建一个循环过程来对给定视频进行车道线检测 % 该循环使用之前初始化的系统对象 warningTextColors {[1 0 0], [1 0 0], [0 0 0], [0 0 0]}; while ~isDone(hVideoSrc) RGB step(hVideoSrc);% …

Java入门基础学习笔记43——包

什么是包? 包是用来分门别类的管理各种不同程序的,类似文件夹,建包有利于程序的管理和维护。 建包的语法规则: package cn.ensource.javabean;public class Car() {} 在自己的程序中调用其他包下的程序的注意事项: 1…