当前位置: 首页 > news >正文

如何为Kafka加上账号密码(一)

Kafka认证基本概念

一直以来,我们公司内网的Kafka集群都是在裸奔,只要知道端口号,任何人都能连上集群操作一番。直到有个主题莫名消失,才引起我们的警觉,是时候该考虑为它添加一套认证策略了。
认证和授权就是一对孪生兄弟,不过本文只讨论认证,对授权感兴趣的朋友快献上赞赞,点赞越多,更新越快,哈哈。

该如何为Kafka添加认证策略呢,我们考察了Kafka支持的认证方式如下:

  • SASL/GSSAPI (Kerberos) - starting at version 0.9.0.0
  • SASL/PLAIN - starting at version 0.10.0.0
  • SASL/SCRAM-SHA-256 and SASL/SCRAM-SHA-512 - starting at version 0.10.2.0
  • SASL/OAUTHBEARER - starting at version 2.0

因为我们的集群采用的是kraft模式部署,因此无需考虑ZooKeeper的认证问题。上面四种方式分别在不同的版本引入Kafka,考量使用哪个认证方式请先确认好你们的Kafka集群版本是否支持。

我在之前的文章中提到过4种安全协议,不要与这里的认证方式混淆,安全协议是配置到监听器端口上,声明了经过端口的流量是否需要认证和加密。

回顾四种安全协议:

  1. PLAINTEXT => 不需要认证,非加密通道传输
  2. SSL => 无需认证,使用SSL加密通道
  3. SASL_PLAINTEXT => 使用SASL认证,非加密通道传输
  4. SASL_SSL => 使用SASL认证并且SSL加密通道传输

既然我们讨论认证,那么留给我们的选择只有SASL_PLAINTEXT、SASL_SSL,也就是使用SASL认证有关的协议,其次考虑是否要走加密通道。如果走加密通道性能肯定是有损耗,因此大部分情况下都会选择认证不加密的方式,那我们只能选择SASL_PLAINTEXT这种安全协议。如果对于加密通道感兴趣的朋友多,后续也发文介绍一下,不过目前我们内部没有这个需求,现在只介绍认证策略。

何为SASL?

SASL全称是简单验证和安全层 (Simple Authentication and Security Layer, SASL),是一种网络协议,正式规范可以查看RFC 2222。简单来说,它是专为解决客户端与服务端的身份认证的协议。既然SASL是协议,那么上面的GSSAPI、PLAIN、SCRAM、OAUTHBEARER就是对该协议的4种实现。

GSSAPI

要使用GSSAPI,前提是有一套Kerberos服务。Kerberos是大数据生态中身份认证的一个组件,如果你们公司有大数据相关的部门,并且已经依托Kerberos搭建了身份认证系统,那么在此基础上接入Kafka的认证。如果没有的话,不建议使用该方式认证,因为这样会增加系统运维的复杂程度。

PLAIN

PLAIN是最简单的一种认证方式,只需要在节点启动前配置好用户名和密码。缺点是要修改用户名或密码只能重启集群。

SCRAM

为了解决PLAIN修改密码需要重启的问题,0.10.2.0版本中加入了SCRAM认证方式。允许在集群启动后添加删除用户或修改用户名及密码。

OAUTHBEARER

OAuth 2是一个授权框架,通常用于第三方应用程序获得对HTTP服务的有限访问。SASL/OAUTHBEARER使得该框架可以在SASL环境下使用,这样就不局限于HTTP协议了。从Kafka文档中了解到,该认证方式目前不建议用于生产环境,因此我们就不再叙述。

经过调研,我们认为PLAIN、SCRAM比较符合我们目前的情况,后面我们就分别演示这两种认证方式的配置方法。

什么是JAAS?

SASL在配置用到了JAAS,那什么是JAAS,它有什么作用呢?

JAAS全称是Java认证和授权服务(Java Authentication and Authorization Service),因为Kafka使用Jvm系语言开发,采用Java平台的方案也是水到渠成的事情。
我们不是为Kafka开发登录插件,因此无需深入了解JAAS,只需知道jaas配置文件的格式如何使用它即可。

1. Jaas配置文件的格式

下面是一个配置文件的例子:

段名 { 
模块名1 控制标志 选项1=值1 选项2=值2; 
模块名2 控制标志 选项1=值1 选项2=值2; 
};
  • 段名:登录上下文或安全域的名称。
  • 模块名:登录模块的完全限定类名。
  • 控制标志:指定登录模块的行为。常见的控制标志包括 “required”、“requisite”、“sufficient” 和 “optional”。
  • 选项X:传递给登录模块的特定选项。

JAAS配置可以包含多个段,每个段代表不同的安全上下文或登录场景。可以在单个段中指定多个登录模块,JAAS会按照指定的顺序使用它们。

Kafka 示例:

KafkaClient { 
org.apache.kafka.common.security.plain.PlainLoginModule required username="your_kafka_username" password="your_kafka_password"; 
};

这个 JAAS 配置文件定义了一个名为 KafkaClient 的登录上下文。它使用了 Kafka 提供的 PlainLoginModule,这是一种简单的用户名密码认证方式。在这个例子中,需要提供 Kafka 集群中的有效用户名和密码。

一般来说,Kafka JAAS 配置包括以下几个主要部分:

  1. 登录上下文名称:
    • 在上述例子中,登录上下文的名称为 KafkaClient。可以根据需要命名不同的登录上下文。
  2. 登录模块和选项:
    • org.apache.kafka.common.security.plain.PlainLoginModule 是 Kafka 提供的一个用于用户名密码认证的登录模块。
    • required 表示该模块是必需的,登录将失败(并且将不会尝试其他模块)如果它不成功。
  3. 模块特定选项:
    • 在这个例子中,usernamepasswordPlainLoginModule 的特定选项,用于指定 Kafka 集群中的用户名和密码。

2. 指定读取Jaas配置文件路径

Java程序通过JVM参数的指定Jaas配置文件:

KAFKA_OPTS=-Djava.security.auth.login.config==/opt/bitnami/kafka/config/kafka-server-jaas.conf

如果你是一个Java程序员,那么对于如何指定JVM参数就是小意思,即便不是Java程序员那也是小意思~

下面解释一下这段配置:

  1. Kafka提供了一个指定jvm参数的环境变量KAFKA_OPTS,Kafka启动脚本会把该参数传递给Kafka程序。
  2. -D是在命令行中指定jvm参数的前缀。
  3. java.security.auth.login.config 是具体参数。
  4. /opt/bitnami/kafka/config/kafka-server-jaas.conf jaas配置文件的绝对路径。
  5. == 用于覆盖JVM默认的参数。

下篇文章我们采用SASL/PLAIN认证方式实战搭建Kafka集群。

相关文章:

如何为Kafka加上账号密码(一)

Kafka认证基本概念 一直以来,我们公司内网的Kafka集群都是在裸奔,只要知道端口号,任何人都能连上集群操作一番。直到有个主题莫名消失,才引起我们的警觉,是时候该考虑为它添加一套认证策略了。 认证和授权就是一对孪生…...

Elasticsearch的Index Lifecycle Management(ILM)

Elasticsearch的Index Lifecycle Management(ILM)功能提供了一种自动化管理索引生命周期的方式。ILM使得用户可以基于特定的条件(如索引的年龄、大小等)来自动执行如回滚、删除等操作,进而优化存储和提高查询性能。ILM…...

2、学习 Nacos 注册中心

学习 Nacos 注册中心 一、使用Nacos作为注册中心1、父pom.xml文件配置SpringCloudAlibaba的dependency-management依赖2、在微服务中添加Nacos客户端依赖3、配置Nacos服务地址 二、服务的分级存储模型1、配置实例的集群属性2、权重配置 三、命名空间 一、使用Nacos作为注册中心…...

Java 如何操作 nginx 服务器上的文件?

随着Java技术的不断发展,越来越多的开发人员开始使用Java来操作服务器上的文件。其中,如何操作nginx服务器上的文件也是许多Java开发人员所关注的重点之一。本文将介绍Java操作nginx服务器上文件的基本方法。 一、使用Java的File类 Java的File类可以用…...

时序预测 | MATLAB实现基于CNN-GRU-AdaBoost卷积门控循环单元结合AdaBoost时间序列预测

时序预测 | MATLAB实现基于CNN-GRU-AdaBoost卷积门控循环单元结合AdaBoost时间序列预测 目录 时序预测 | MATLAB实现基于CNN-GRU-AdaBoost卷积门控循环单元结合AdaBoost时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于CNN-GRU-AdaBo…...

中创ET4410 台式LCR数字电桥 简单开箱测评

最近买了一台LCR电桥,完善一下自己实验室的设备,选了中创ET4410,这款性价比高一点。 1199元在PDD买的,好像胜利的VC4090C也是找中创代工的。 ET4410介绍 本系列LCR数字电桥是采用自动平衡电桥原理设计的元件参数分析仪&#xf…...

格式化dingo返回内容

dingo api返回的内容中添加code 和 message ,保持与异常返回的内容格式相一致。 失败会存在code 和 message ,我们只需要关注成功的情况 非分页返回,可以创建一个父类controller,通过调用sucess方法来返回 class Controller ext…...

QGIS编译(跨平台编译)之四十六:minizip编译(Windows、Linux、MacOS环境下编译)

文章目录 一、minizip介绍二、minizip下载三、Linux下编译四、MacOS下编译五、Windows下编译一、minizip介绍 Minizip 是一个用于处理 ZIP 文件的开源库,它基于 zlib 库构建。zlib 是一个广泛使用的、免费的、开源的压缩库,提供数据压缩和解压缩功能。Minizip 扩展了 zlib 的…...

MySQL进阶查询篇(1)-索引的类型与创建

MySQL数据库索引是提高查询效率的重要手段之一。索引是一种特殊的数据结构,用于快速定位数据。通过创建索引,可以大大提高查询性能,减少数据库的IO操作。 MySQL数据库支持多种不同类型的索引,常用的索引类型包括: B-…...

【STL】list模拟实现

vector模拟实现 一、接口大框架函数声明速览二、结点类的模拟实现1、构造函数 三、迭代器类的模拟实现1、迭代器类存在的意义2、迭代器类的模板参数说明3、构造函数4、运算符的重载(前置和后置)(1)前置(2)后…...

常用的文件系统、存储类型小整理

最近接触到了五花八门的文件系统、存储类型,名词听得头大,趁假期整理学习一番~ 名称OSSFastDFSJuiceFSCIFSCephFSEFSNFS全称Object Storage Service (对象存储服务)Fast Distributed File System (快速分布式文件系统)Juice File System (Juice 文件系统…...

Java写标准输出进度条

学Java这么久了,突发奇想写一个 进度条 玩玩,下面展示一下成功吧! Java代码实现如下 public class ProcessBar {public static void main(String[] args) {//进度条StringBuilder processBarnew StringBuilder();//进度条长度int total100;/…...

leetcode 算法 69.x的平方根(python版)

需求 给你一个非负整数 x ,计算并返回 x 的 算术平方根 。 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。 注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。 示例 1&#…...

【golang】24、go get 和 go mod:indrect 与 go mod tidy

文章目录 go get 会执行如下操作: 操作 go.mod 文件(add、update、remove)下载依赖到 $GOPATH/pkg/mod 中若已安装,则更新该包,到最新版本 试验前置准备:首先删除已下载的依赖,rm -rf $GOPATH…...

AI算法工程师-非leetcode题目总结

AI算法工程师-非leetcode题目总结 除了Leetcode你还需要这些实现nms旋转矩形IOU手动实现BN手动实现CONV实现CrossEntropyLoss 除了Leetcode你还需要这些 希望大家留言,我可以进行补充。持续更新~~~ 实现nms import numpy as np def nms(dets, threshold):x1 dets…...

2.6:冒泡、简选、直插、快排,递归,宏

1.冒泡排序、简单选择排序、直接插入排序、快速排序(升序) 程序代码&#xff1a; 1 #include<stdio.h>2 #include<string.h>3 #include<stdlib.h>4 void Bubble(int arr[],int len);5 void simple_sort(int arr[],int len);6 void insert_sort(int arr[],in…...

FastDFS安装并整合Openresty

FastDFS安装并整合Openresty 一、安装环境准备【CentOS7.9】二、FastDFS--tracker安装2.1.下载fastdfs2.2.FastDFS安装环境2.3.安装FastDFS依赖libevent库2.4.安装libfastcommon2.5.安装 libserverframe 网络框架2.6.tracker编译安装2.7.安装之后文件目录介绍2.8.错误处理2.9.配…...

93 log4j-slf4j-impl 搭配上 log4j-to-slf4j 导致的 StackOverflow

前言 呵呵 最近想要 做一个 mongo 低版本的客户端读取高版本的服务端传递过来的数据造成的一个错误的时候, 出现了这样的问题 引入了 mongo-java-driver 之后, 使用相关 api 的时候会触发 com.mongo.internal.connection.BaseCluser 的初始化, 其依赖的 Loggers 间接的依赖…...

客户端会话技术-Cookie

一、会话技术 1.1 概述 会话&#xff1a;一次会话中包含多次**请求和响应** 一次会话&#xff1a;浏览器第一次给服务器资源发送请求&#xff0c;此时会话建立&#xff0c;直到有一方断开为止 会话的功能&#xff1a;在一次会话的范围内的多次请求间&#xff0c;共享数据 …...

rsa加密登录解决方案

1.问题 账密登录方式中用户输入密码后&#xff0c;把账号、密码通过http传输到后端进行校验&#xff0c;然而密码属于敏感信息&#xff0c;不能以明文传输&#xff0c;否则容易被拦截窃取&#xff0c;因此需要考虑如何安全传输密码 2.解决方案 使用rsa加密方式&#xff0c;r…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...