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的异常日志。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

除了 Postman,还有什么好用的 API 调试工具吗

尽管 Postman 拥有团队协作等实用特性,其免费版提供的功能相对有限,而付费版的定价可能对小团队或个人开发者而言显得偏高。此外,Postman 的访问速度有时较慢,这可能严重影响使用体验。 鉴于这些限制,Apifox 成为了一…

matlab建模入门指导

本文以水池中鸡蛋温度随时间的变化为切入点,对其进行数学建模并进行MATLAB求解,以更为通俗地进行数学建模问题入门指导。 一、问题简述 一个煮熟的鸡蛋有98摄氏度,将它放在18摄氏度的水池中,五分钟后鸡蛋的温度为38摄氏度&#x…

【C#设计模式(8)——过滤器模式(Adapter Pattern)】

前言 滤液器模式可以很方便地实现对一个列表中的元素进行过滤的功能&#xff0c;能方便地修改滤器的现实&#xff0c;符合开闭原则。 代码 //过滤接口public interface IFilter{List<RefuseSorting> Filter(List<RefuseSorting> refuseList);}//垃圾分类public cla…

事件循环 -- 资源总结(浏览器进程模型、事件循环机制、练习题)

!!! 理解学习&#xff0c;有问题/补充欢迎指出&#xff0c;随时改正 !!! 事件循环 一、进程与线程二、浏览器进程模型三、为什么会存在事件循环机制四、事件循环机制五、代码场景模拟事件循环机制六、练习题(明天补充...) 一、进程与线程 进程&#xff08;Process&#xff09;…

九州未来再度入选2024边缘计算TOP100

随着数智化转型的浪潮不断高涨&#xff0c;边缘计算作为推动各行业智能化升级的重要基石&#xff0c;正在成为支持万物智能化的关键点。近日&#xff0c;德本咨询(DBC)联合《互联网周刊》(CIW)与中国社会科学院信息化研究中心(CIS)&#xff0c;共同发布《2024边缘计算TOP100》榜…

使用 start-local 脚本在本地运行 Elasticsearch

警告&#xff1a;请勿将这些说明用于生产部署 本页上的说明仅适用于本地开发。请勿将此配置用于生产部署&#xff0c;因为它不安全。请参阅部署选项以获取生产部署选项列表。 使用 start-local 脚本在 Docker 中快速设置 Elasticsearch 和 Kibana 以进行本地开发或测试。 此设…

【Linux】TCP原理

tcp协议段格式 源/目的端口号: 表示数据是从哪个进程来, 到哪个进程去;4 位 TCP 报头长度: 表示该 TCP 头部有多少个 32 位 bit(有多少个 4 字节); 所以TCP 头部最大长度是 15 * 4 6016 位校验和: 发送端填充, CRC 校验. 接收端校验不通过, 则认为数据有问题. 此处的检验和不光…

阿里巴巴通义灵码推出Lingma SWE-GPT:开源模型的性能新标杆

阿里巴巴通义灵码团队最近开源了一款名为Lingma SWE-GPT的自动化软件改进模型。这一模型在软件工程领域的应用中表现出色&#xff0c;首次在SWE-bench基准测试中达到了30.20%的解决率&#xff0c;这一成绩比Llama 3.1 405B高出22.76%&#xff0c;标志着开源模型在这一领域的重大…

MySQL Workbench导入数据比mysql命令行慢

1.数据量 包含2812979条数据的csv文件 2.myql命令行用LOAD DATA INFILE命令导入 耗时1分钟13秒 3.用MySQL Workbench导入 从第一天晚上22点到次日下午16点才导入了45万条数据 4.原因 MySQL Workbench导入csv数据是使用自带的python和一系列的python代码&#xff0c;而mys…

Redis高可用-主从复制

这里写目录标题 Redis主从复制主从复制过程环境搭建从节点配置常见问题主从模式缺点 Redis主从复制 虽然 Redis 可以实现单机的数据持久化&#xff0c;但无论是 RDB 也好或者 AOF 也好&#xff0c;都解决不了单点宕机问题&#xff0c;即一旦 redis 服务器本身出现系统故障、硬…

VMware虚拟机安装Win7专业版保姆级教程(附镜像包)

一、Win7镜像下载: 链接&#xff1a;https://pan.baidu.com/s/1tvN9hXCVngUzpIC6b2OGrA 提取码&#xff1a;a66H 此镜像为Win7专业版(收藏级镜像 已自用几年)&#xff0c;官方纯净系统没有附带任何其他第三方软件。 二、配置虚拟机 1.创建新的虚拟机。 这里我们以最新的VMware…

【C++】C++11特性(上)

✨✨欢迎大家来到Celia的博客✨✨ &#x1f389;&#x1f389;创作不易&#xff0c;请点赞关注&#xff0c;多多支持哦&#x1f389;&#x1f389; 所属专栏&#xff1a;C 个人主页&#xff1a;Celias blog~ 目录 一、列表初始化 二、std::initializer_list 三、右值引用和移…

jmeter常用配置元件介绍总结之定时器

系列文章目录 安装jmeter jmeter常用配置元件介绍总结之定时器 5.定时器5.1.固定定时器5.2.统一随机定时器5.3.Precise Throughput Timer5.4.Constant Throughput Timer5.5.Synchronizing Timer5.6.泊松随机定时器5.7.高斯随机定时器 5.定时器 5.1.固定定时器 固定定时器Cons…

【含开题报告+文档+PPT+源码】基于Spring Boot智能综合交通出行管理平台的设计与实现

开题报告 随着城市规模的不断扩大和交通拥堵问题的日益严重&#xff0c;综合交通出行管理平台的研究与实现显得尤为重要。现代城市居民对于出行的需求越来越多样化&#xff0c;对于交通信息的获取和处理能力也提出了更高的要求。传统的交通管理方式已经难以满足这些需求&#…

并发基础:(淘宝笔试题)三个线程分别打印 A,B,C,要求这三个线程一起运行,打印 n 次,输出形如“ABCABCABC....”的字符串【举一反三】

🚀 博主介绍:大家好,我是无休居士!一枚任职于一线Top3互联网大厂的Java开发工程师! 🚀 🌟 在这里,你将找到通往Java技术大门的钥匙。作为一个爱敲代码技术人,我不仅热衷于探索一些框架源码和算法技巧奥秘,还乐于分享这些宝贵的知识和经验。 💡 无论你是刚刚踏…

万字长文解读深度学习——ViT、ViLT、DiT

文章目录 &#x1f33a;深度学习面试八股汇总&#x1f33a;ViT1. ViT的基本概念2. ViT的结构与工作流程1. 图像分块&#xff08;Image Patch Tokenization&#xff09;2. 位置编码&#xff08;Positional Encoding&#xff09;3. Transformer 编码器&#xff08;Transformer En…

嵌入式硬件杂谈(一)-推挽 开漏 高阻态 上拉电阻

引言&#xff1a;对于嵌入式硬件这个庞大的知识体系而言&#xff0c;太多离散的知识点很容易疏漏&#xff0c;因此对于这些容易忘记甚至不明白的知识点做成一个梳理&#xff0c;供大家参考以及学习&#xff0c;本文主要针对推挽、开漏、高阻态、上拉电阻这些知识点的学习。 目…

使用jmeter查询项目数据库信息,保存至本地txt或excel文件1108

知识点1&#xff1a;使用jmeter把项目数据库的数据导出&#xff0c;并使用jmeter导出数据库的数据 步骤1&#xff1a;使用jmeter把项目数据库的数据导出 &#xff08;1&#xff09;测试计划-添加- 线程组setUp线程组 setUp线程组&#xff1a;添加-配置元件-JDBC Connection …

Flink_DataStreamAPI_输出算子Sink

Flink_DataStreamAPI_输出算子Sink 1连接到外部系统2输出到文件3输出到Kafka4输出到MySQL&#xff08;JDBC&#xff09;5自定义Sink输出 Flink作为数据处理框架&#xff0c;最终还是要把计算处理的结果写入外部存储&#xff0c;为外部应用提供支持。 1连接到外部系统 Flink的D…

01-Ajax入门与axios使用、URL知识

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…