当前位置: 首页 > 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…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

java高级——高阶函数、如何定义一个函数式接口类似stream流的filter

java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用&#xff08;Math::max&#xff09; 2 函数接口…...

【Docker 02】Docker 安装

&#x1f308; 一、各版本的平台支持情况 ⭐ 1. Server 版本 Server 版本的 Docker 就只有个命令行&#xff0c;没有界面。 Platformx86_64 / amd64arm64 / aarch64arm(32 - bit)s390xCentOs√√Debian√√√Fedora√√Raspbian√RHEL√SLES√Ubuntu√√√√Binaries√√√ …...

鸿蒙APP测试实战:从HDC命令到专项测试

普通APP的测试与鸿蒙APP的测试有一些共同的特征&#xff0c;但是也有一些区别&#xff0c;其中共同特征是&#xff0c;它们都可以通过cmd的命令提示符工具来进行app的性能测试。 其中区别主要是&#xff0c;对于稳定性测试的命令的区别&#xff0c;性能指标获取方式的命令的区…...

设计模式-观察着模式

观察者模式 观察者模式 (Observer Pattern) 是一种行为型设计模式&#xff0c;它定义了对象之间一种一对多的依赖关系&#xff0c;当一个对象&#xff08;称为主题或可观察者&#xff09;的状态发生改变时&#xff0c;所有依赖于它的对象&#xff08;称为观察者&#xff09;都…...

Electron通信流程

前言 今天讲Electron框架的通信流程&#xff0c;首先我们需要知道为什么需要通信。这得益于Electron的多进程模型&#xff0c;它主要模仿chrome的多进程模型如下图&#xff1a; 作为应用开发者&#xff0c;我们将控制两种类型的进程&#xff1a;主进程和渲染器进程 。 …...

前端验证下跨域问题(npm验证)

文章目录 一、背景二、效果展示三、代码展示3.1&#xff09;index.html3.2&#xff09;package.json3.3&#xff09; service.js3.4&#xff09;service2.js 四、使用说明4.1&#xff09;安装依赖4.2&#xff09;启动服务器4.3&#xff09;访问前端页面 五、跨域解决方案说明六…...