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

Kafka - 启用安全通信和认证机制_SSL + SASL

文章目录

  • 官方资料
  • 概述
  • 制作kakfa证书
    • 1.1 openssl 生成CA
    • 1.2 生成server端秘钥对以及证书仓库
    • 1.3 CA 签名证书
    • 1.4 服务端秘钥库导入签名证书以及CA根证书
    • 1.5 生成服务端信任库并导入CA根数据
    • 1.6 生成客户端信任库并导入CA根证书
  • 2 配置zookeeper SASL认证
    • 2.1 编写zk_server_jass.conf配置
    • 2.2 修改zk启动脚本
    • 2.3 修改zoo.cfg 配置文件
    • 2.4 zk添加jar包
    • 2.5 启动zk验证服务
  • 3 配置kafka server端
    • 3.1 编写kafka_server_jaas.conf
    • 3.2 修改kafka启动脚本
    • 3.3 修改server.properties
    • 3.4 启动kafka
  • 4 配置kafka client 端
  • 5 验证
  • 6. 常见问题

在这里插入图片描述


官方资料

https://kafka.apache.org/documentation/#security
在这里插入图片描述


概述

Kafka的SASL-SSL配置主要用于保护集群的网络传输安全,确保客户端与服务器端的通信通过加密和认证机制来保证数据的安全性和访问控制.。

Kafka支持多种安全协议,最常见的包括SSL(加密传输)、SASL(认证)和ACL(访问控制列表)。配置SASL-SSL组合可以实现:

  • SSL(Secure Sockets Layer):为数据传输提供加密,防止传输过程中的数据泄露和篡改。
  • SASL(Simple Authentication and Security Layer):提供身份认证机制。通过配置不同的SASL机制(如PLAIN、SCRAM-SHA-256等),限制只有经过认证的用户才可以访问Kafka。

制作kakfa证书

1.1 openssl 生成CA

openssl req -x509 -config openssl-ca.cnf -newkey rsa:4096 -sha256 -nodes -out cacert.pem -outform PEM

openssl-ca.cnf内容如下

HOME            = .
RANDFILE        = $ENV::HOME/.rnd####################################################################
[ ca ]
default_ca    = CA_default      # 默认的 ca 部分[ CA_default ]
base_dir      = .               # 基本目录
certificate   = $base_dir/ca/cacert.pem   # CA 证书
private_key   = $base_dir/ca/cakey.pem    # CA 私钥
new_certs_dir = $base_dir              # 签名后的新证书位置
database      = $base_dir/index/index.txt    # 数据库索引文件
serial        = $base_dir/serial/serial.txt   # 当前序列号default_days     = 1000         # 证书有效期
default_crl_days = 30           # 下一个 CRL 之前的有效期
default_md       = sha256       # 使用的公钥摘要算法,默认为 sha256
preserve         = no           # 不保留传递的 DN 排序x509_extensions = ca_extensions # 添加到证书的扩展email_in_dn     = no            # 在 DN 中不包含电子邮件
copy_extensions = copy          # 从 CSR 复制 SAN 到证书####################################################################
[ req ]
default_bits       = 4096       # 默认密钥位数
default_keyfile    = cakey.pem  # 默认密钥文件
distinguished_name = ca_distinguished_name   # 默认的区分名
x509_extensions    = ca_extensions           # 默认的 X.509 扩展
string_mask        = utf8only   # 字符串掩码####################################################################
[ ca_distinguished_name ]
countryName         = Country Name (2 letter code)   # 国家/地区名(两个字母代码)
countryName_default = CN                            # 默认国家/地区stateOrProvinceName         = State or Province Name (full name)   # 州/省名(全名)
stateOrProvinceName_default = SD                      # 默认州/省名localityName                = Locality Name (eg, city)            # 地区/城市名
localityName_default        = JN                          # 默认地区/城市名organizationName            = Organization Name (eg, company)     # 组织名
organizationName_default    = UNKNOWN                       # 默认组织名organizationalUnitName         = Organizational Unit (eg, division)   # 组织单位名
organizationalUnitName_default = UNKNOWN                            # 默认组织单位名commonName         = Common Name (e.g. server FQDN or YOUR name)       # 通用名(例如服务器 FQDN 或您的姓名)
commonName_default = HUC                                        # 默认通用名emailAddress         = Email Address           # 电子邮件地址
emailAddress_default = test@test.com           # 默认电子邮件地址####################################################################
[ ca_extensions ]
subjectKeyIdentifier   = hash                  # 主题密钥标识符
authorityKeyIdentifier = keyid:always, issuer  # 授权密钥标识符
basicConstraints       = critical, CA:true     # 基本约束
keyUsage               = keyCertSign, cRLSign   # 密钥用途####################################################################
[ signing_policy ]
countryName            = optional
stateOrProvinceName    = optional
localityName           = optional
organizationName       = optional
organizationalUnitName = optional
commonName             = supplied
emailAddress           = optional####################################################################
[ signing_req ]
subjectKeyIdentifier   = hash                  # 主题密钥标识符
authorityKeyIdentifier = keyid,issuer           # 授权密钥标识符
basicConstraints       = CA:FALSE               # 基本约束
keyUsage               = digitalSignature, keyEncipherment      # 密钥用途

1.2 生成server端秘钥对以及证书仓库

keytool -genkeypair -keystore serverkeystore.jks -alias KafkaKeyStore -validity 3650 -keyalg RSA -storetype pkcs12

1.3 CA 签名证书

利用服务端秘钥库生成证书请求:

keytool -keystore serverkeystore.jks -alias Kafkakeystore -certreq -file cert-file.csr

CA签名生成签名证书:

openssl ca -config openssl-ca.cnf -policy signing_policy -extensions signing_req -out kafka-cert-signed.cert -days 3650 -infiles ../cert-file.csr

1.4 服务端秘钥库导入签名证书以及CA根证书

keytool -keystore serverkeystore.jks -alias Kafkakeystore -import -file kafka-cert-signed.cert
keytool -keystore serverkeystore.jks -alias CARoot -import -file ./ca/ca/cacert.pem

1.5 生成服务端信任库并导入CA根数据

keytool -keystore server_truststor.jks -alias CARoot -import -file ./ca/cacert.pem

1.6 生成客户端信任库并导入CA根证书

keytool -keystore client_truststor.jks -alias CARoot -import -file ./ca/cacert.pem

2 配置zookeeper SASL认证

2.1 编写zk_server_jass.conf配置

文件信息如下

Server {org.apache.kafka.common.security.plain.PlainLoginModule requiredusername="zk"password="1qax#EDC5tgb"user_kafka="234BCDefg#";
};

其中username与password为zk集群之前认证的用户名密码,user_kafka=“234BCDefg#” 代表用户为kafka,密码为234BCDefg#,kafka认证的用户名以及密码,kafka中需要配置

2.2 修改zk启动脚本

添加启动参数如下:

-Djava.security.auth.login.config=zk_server_jass.conf

2.3 修改zoo.cfg 配置文件

添加参数如下:

authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
requireClientAuthScheme=sasl
jaasLoginRenew=3600000

2.4 zk添加jar包

拷贝kafka lib目录下kafka-clients-2.3.0-SNAPSHOT.jar、lz4-.jar、slf4j-api-.jar、slf4j-log4j12-.jar、snappy-java-.jar 五个jar包到zk的lib目录下

2.5 启动zk验证服务


3 配置kafka server端

3.1 编写kafka_server_jaas.conf

添加jass配置文件,内容如下:

KafkaServer {org.apache.kafka.common.security.plain.PlainLoginModule requiredusername="admin"password="234BCDefg#"user_admin="234BCDefg#"user_alice="234BCDefg#";
};
Client {org.apache.kafka.common.security.plain.PlainLoginModule requiredusername="kafka"password="234BCDefg#";
};

其中username与password 为kafka集群内部认证的用户名与密码,与user_admin或者其他用户保持一致
user_admin="234BCDefg#"与user_alice="234BCDefg#"配置用户,格式为user_用户名=密码
Client 配置zk认证的用户名与密码,必须与zk中配置的保持一致

3.2 修改kafka启动脚本

添加启动参数如下:

-Djava.security.auth.login.config=kafka_server_jaas.conf

3.3 修改server.properties

修改监听协议

listeners=SASL_SSL://:9093
advertised.listeners=SASL_SSL://10.11.106.63:9093

配置SSL

ssl.keystore.location=./ssl/kakfa-server-keystore.jks
ssl.keystore.password=1qaz#EDC5tgb
ssl.key.password=1qaz#EDC5tgb
ssl.truststore.location=./ssl/server_truststor.jks
ssl.truststore.password=1qaz#EDC5tgb
ssl.client.auth=required
ssl.enabled.protocols=TLSv1.2,TLSv1.1,TLSv1
ssl.keystore.type=JKS 
ssl.truststore.type=JKS 
ssl.endpoint.identification.algorithm=

配置SASL

security.inter.broker.protocol=SASL_SSL
sasl.mechanism.inter.broker.protocol=PLAIN
sasl.enabled.mechanisms=PLAIN

3.4 启动kafka

验证服务是否正常启动


4 配置kafka client 端

客户端添加参数如下:
指定SASL_SSL协议:

security.protocol=SASL_SSL

SASL认证:

sasl.mechanism=PLAIN
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username=\"alice\" password=\"234BCDefg#\";

SSL配置:

ssl.truststore.location=./ssl/client_truststor.jks
ssl.truststore.password=1qaz#EDC5tgb
ssl.endpoint.identification.algorithm=

5 验证

命令行执行:

 .\kafka-console-producer.bat --broker-list 127.0.0.1:9093  --topic artisanTest

未指定ssl参数,则server端日志中会出现以下异常:

[2024-05-24 10:20:55,334] INFO [SocketServer brokerId=0] Failed authentication with 127.0.0.1/127.0.0.1 (SSL handshake failed) (org.apache.kafka.common.network.Selector)

添加SSL 客户端配置文件 client-ssl.properties,内容如下:

security.protocol=SASL_SSL
sasl.mechanism=PLAIN
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username=\"alice\" password=\"234BCDefg#\";
ssl.truststore.location=./ssl/client_truststor.jks
ssl.truststore.password=1qaz#EDC5tgb
ssl.endpoint.identification.algorithm=

再次执行命令,添加配置参数:

 .\kafka-console-producer.bat --broker-list 127.0.0.1:9093  --topic artisanTest --producer.config client-ssl.properties

可正常发送消息


6. 常见问题

  • 测试连接:通过Kafka的console-producerconsole-consumer客户端工具测试SASL-SSL的连接是否配置正确。
  • SSL握手失败:若未正确配置SSL密钥库或信任库,可能会遇到SSL handshake failed错误。
  • 认证失败:若SASL用户名或密码不匹配,可能会出现Failed authentication的异常日志。

在这里插入图片描述

相关文章:

Kafka - 启用安全通信和认证机制_SSL + SASL

文章目录 官方资料概述制作kakfa证书1.1 openssl 生成CA1.2 生成server端秘钥对以及证书仓库1.3 CA 签名证书1.4 服务端秘钥库导入签名证书以及CA根证书1.5 生成服务端信任库并导入CA根数据1.6 生成客户端信任库并导入CA根证书 2 配置zookeeper SASL认证2.1 编写zk_server_jass…...

c++基础32输入和输出

输入和输出 C风格(使用printf和scanf)输出字符输入字符 C风格(使用cin和cout)输出字符输入字符 注意事项 在C和C中,字符的输入和输出可以通过多种方式实现,包括使用标准输入输出库函数如 printf和 scanf&…...

[C++] 函数详解

前言 今天zty带来的是函数的详解,搞了4个小时,大家给个赞呗,zty还要上学,发作品会少一点 先 赞 后 看 养 成 习 惯 先 赞 后 看 养 成 习 惯 先 赞 后 看 养 成 习 惯 演示用编译器及其…...

AMD CPU下pytorch 多GPU运行卡死和死锁解决

参考链接 https://medium.com/amitparekh/solving-ddp-deadlock-with-multiple-gpus-and-amd-cpus-442186632034 简要说明 AMD的IOMMU和NVIDIA的NCCL不兼容问题导致AMD的IOMMU是BIOS 级组件,它基本上充当将虚拟地址映射到 GPU 上的物理地址的接口,它的全部目的是让 CPU 和 G…...

Swift 开发教程系列 - 第12章:协议与协议扩展

协议(Protocol)是 Swift 的一种重要特性,它定义了实现特定功能的方法、属性或其他要求。通过协议,可以将行为定义从具体实现中分离,使代码更具可读性和扩展性。Swift 的协议支持协议扩展,这一特性允许我们为…...

麒麟V10,arm64,离线安装docker和docker-compose

文章目录 一、下载1.1 docker1.2 docker-compose1.3 docker.service 二、安装三、验证安装成功3.1 docker3.2 docker-compose 需要在离线环境的系统了里面安装docker。目前国产化主推的是麒麟os和鲲鹏的cpu,这块的教程还比较少,记录一下。 # cat /etc/ky…...

NUXT3学习日记二(样式配置、引入组件库、区分在服务端还是在客户端渲染)

上一章已经给大家分享官网下载的nuxt3了,下面正式进入我所要说的内容吧 一、初始化样式 想必大家从我的git下载下来的nuxt3,能看到nuxt.config.ts这个文件了吧。 这里我们有两种css配置方式 1、css:[~/assets/base.scss] 这种方式不能在scss文件中定义…...

FPGA/Verilog,Quartus环境下if-else语句和case语句RT视图对比/学习记录

基本概念 RTL(Register - Transfer - Level)视图:是一种硬件描述语言的抽象层次,用于描述数字电路中寄存器之间的数据传输和操作。在这个层次上,可以看到电路的基本结构,如寄存器、组合逻辑、多路复用器等…...

Javascript高级—闭包问题

闭包问题 循环中赋值为引用的问题 for (var i 1; i < 5; i) {setTimeout(function timer() {console.log(i)}, i * 1000) }解决方法有3种 第一种&#xff0c;使用立即执行函数方式 for (var i 1; i < 5; i) {(fuction(j){setTimeout(function timer() {console.log…...

C#入门 017 字段,属性,索引器,常量

字段&#xff0c;属性&#xff0c;索引器&#xff0c;常量都表示数据 字段 什么是字段 字段(field)是一种表示与对象或类型(类与结构体)关联的变量字段是类型的成员&#xff0c;又称“成员变量&#xff0c;写在类体里面与对象关联的字段亦称“实例字段&#xff0c;表示某个对…...

磐石云语音助手拦截介绍

呼叫中心用户实际应用场景下最高会有超过30%的和语音助手&#xff1b;无声主要是进入了语音信箱;如&#xff1a;“听到滴声后留言”&#xff0c;”漏话提醒““发送请按1&#xff0c;重录请按2”以及拨打过程中客户主动拒接产生的”您拨打的用户正忙“&#xff0c;”关机“”停…...

JSP执行过程及其与Servlet执行效率的比较

JSP&#xff08;Java Server Pages&#xff09;和Servlet都是Java Web开发中常用的技术&#xff0c;它们都用于动态生成Web页面。然而&#xff0c;JSP和Servlet在执行过程和效率上存在一些差异。本文将详细探讨JSP的执行过程&#xff0c;并比较JSP与Servlet的执行效率。 一、J…...

open3d

open3d open3d用于 3D 数据处理的现代库。 简介 Open3D 是一个开源库&#xff0c;支持快速开发处理 3D 数据的软件。Open3D 前端公开了一组精心挑选的 C 和 Python 数据结构和算法。后端经过高度优化&#xff0c;并设置为并行化。Open3D 是从零开始开发的&#xff0c;具有一更…...

Vue中优雅的使用Echarts的三种方式

一、原始方法直接使用 1、安装ECharts&#xff1a; npm install echarts --save 2、创建一个Vue公共组件 EChart.vue&#xff1a; <template><div :style"{width: 100%, height: 300px}" ref"chart"></div> </template><scri…...

SpringBoot配置文件/日志

目录 一,SpringBoot配置文件 1,配置文件的格式: 2,properties 3,yml 1,properties与yml的转换 2,读取配置选哪个中的内容 3,单双引号的差异: 4,配置对象: 5,配置集合/配置map 6,yml的优缺点: 二,验证码: 学习目的: 实现样例: 接口定义: 代码总结: 三,日志: 1,概…...

微服务架构面试内容整理-SpringCloud Netflix‌与Spring Cloud Alibaba比较

Spring Cloud Netflix 和 Spring Cloud Alibaba 都是用于构建微服务架构的解决方案,但它们在设计理念、组件和使用场景上存在一些差异。以下是它们的比较: 1. 服务注册与发现 ● Spring Cloud Netflix:使用 Eureka 作为服务注册和发现的组件。Eureka 是基于 REST 的,适合服…...

JDBC魔法:连接MySQL数据库与数据操作的秘籍

文章目录 一. JDBC介绍二. 数据库驱动1.DriverManager2.Connection3.PreparedStatement4.ResultSet 三. JDBC连接MySQL1. 加载驱动2. 获得连接3. 关闭连接 四. JDBC实现数据新增五. JDBC实现数据删除 一. JDBC介绍 JDBC&#xff08;Java Database Connectivity&#xff09;是Ja…...

深入了解Scratch:引导初学者开启编程之旅

引言 在当今数字化时代&#xff0c;编程已不再是成年人的专利&#xff0c;而是一项逐渐向低年龄段普及的技能。Scratch作为一款面向儿童和青少年的图形化编程语言&#xff0c;以其简单易用且充满趣味性的特点&#xff0c;成为了许多初学者学习编程的首选工具。本文将深入探讨S…...

js复制内容到剪切板

复制内容到剪切板 最近预报一个需求需要点击按钮复制当前到行的内容到剪切板&#xff0c; 所以写了这个工具 export function copyText(text: string, prompt: string | null 已成功复制到剪切板!) {if (navigator.clipboard) {return navigator.clipboard.writeText(text).th…...

代码 RNN原理及手写复现

29、PyTorch RNN的原理及其手写复现_哔哩哔哩_bilibili 笔记连接: https://pan.baidu.com/s/1_Sm7ptEiJtTTq3vQWgOTNg?pwd2rei 提取码: 2rei import torch import torch.nn as nn bs,T2,3 # 批大小&#xff0c;输入序列长度 input_size,hidden_size 2,3 # 输入特征大小&a…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

用鸿蒙HarmonyOS5实现中国象棋小游戏的过程

下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...

【Veristand】Veristand环境安装教程-Linux RT / Windows

首先声明&#xff0c;此教程是针对Simulink编译模型并导入Veristand中编写的&#xff0c;同时需要注意的是老用户编译可能用的是Veristand Model Framework&#xff0c;那个是历史版本&#xff0c;且NI不会再维护&#xff0c;新版本编译支持为VeriStand Model Generation Suppo…...

解析“道作为序位生成器”的核心原理

解析“道作为序位生成器”的核心原理 以下完整展开道函数的零点调控机制&#xff0c;重点解析"道作为序位生成器"的核心原理与实现框架&#xff1a; 一、道函数的零点调控机制 1. 道作为序位生成器 道在认知坐标系$(x_{\text{物}}, y_{\text{意}}, z_{\text{文}}…...