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 required
   username="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 required
   username="admin"
   password="234BCDefg#"
   user_admin="234BCDefg#"
   user_alice="234BCDefg#";
};
Client {
   org.apache.kafka.common.security.plain.PlainLoginModule required
   username="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的异常日志。

在这里插入图片描述

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

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

相关文章

STM32H503开发(1)----开发板测试

STM32H503开发----1.开发板测试 概述硬件准备视频教学样品申请源码下载产品特性参考程序生成STM32CUBEMX串口配置LED配置堆栈设置串口重定向主循环演示 概述 STM32H503 & SENSOR是一款基于STM32H5系列微控制器的评估套件。该微控制器采用了40nm工艺制造,具有更…

3.1 > Shell

本节概览 在 上一节 中我们了解了 Linux 的桌面环境,包括 GUI 、 TTY 和 VNC 等的介绍和使用。在本节中将介绍 Shell 是个什么东西,我们到底是如何通过 Shell 来操作计算机的,以及一些常见的 Shell 版本有哪些和它们有什么特点。 目录 本节…

C++ -- 多态与虚函数

多态 概念 多态(polymorphishm):通常来说,就是指事物的多种形态。在C中,多态可分为编译时多态(静态多态)和运行时多态(动态多态),这里我们重点讲的是运行时多…

利用游戏引擎的优势

大家好,我是小蜗牛。 在当今快速发展的游戏产业中,选择合适的游戏引擎对开发者来说至关重要。Cocos Creator作为一款功能强大且灵活的游戏引擎,为开发者提供了丰富的工具和资源,使他们能够高效地开发出优秀的游戏。本文将探讨如何…

uniapp配置h5路由模式为history时404

为了不让URL中出现#,让uniapp项目配置h5路由模式为hisory 然而本地好好的,放到服务器上却404了。 解决方法是给nginx配置一个伪静态: location /xxx-html/ {alias /home/nginx_web/xxx_new_html/;try_files $uri $uri/ /xxx-html/index.ht…

架构师备考-概念背诵(软件工程)

软件工程 软件开发生命周期: 软件定义时期:包括可行性研究和详细需求分析过程,任务是确定软件开发工程必须完成的总目标,具体可分成问题定义、可行性研究、需求分析等。软件开发时期:就是软件的设计与实现,可分成概要设计、详细设计、编码、测试等。软件运行和维护:就是…

小白docker入门简介

Dockerfile入门使用分享 一、docker是啥二、镜像仓库三、自定义镜像四、动手做机甲玩偶五、帮我做数学题六、计算功能的写法七、咒语翻译器八、放屁九、解决问题 一、docker是啥 最开始我和你一样,围着镜像、容器、docker的名词团团转,其实没那么复杂。…

一文学习Android中的Property

在 Android 系统中,Property 是一种全局的键值对存储系统,允许不同组件和进程间以轻量级的方式进行数据传递。它主要用于系统配置、状态标识等场景,使得不同进程能够通过属性的设置或获取来通信。property 的核心特性是快速、高效&#xff0…

node.js安装配置(Windows)

1、下载 CNPM Binaries Mirror 2、安装 3、验证 win R 进入cmd 4、配置环境变量 4.1、创建两个文件夹 4.2、安装目录进入cmd(配置全局属性) 配置两个命令: npm config set prefix "D:\liyunqing\nodejs\node_global"npm config set cache "D:\l…

mp3格式音频怎么做成二维码?扫码获取音频文件的制作方法

随着二维码的广泛使用,现在很多内容都会通过生成二维码的方式来传输内容,通过这种方式可以更快捷的实现内容分享,简化其他人获取内容的流程,有效提高效率。音频是目前常见的一种内容分享方式,比如录音、听力、音乐等类…

【css flex 多行均分有间隙布局】

小程序、web均可使用&#xff0c;我当前用的是小程序 <view class"job_tab_container flex_between"><view class"job_tab_item"></view><view class"job_tab_item"></view><view class"job_tab_item&qu…

单臂路由技术,eNSP实验讲解

单臂路由技术&#xff0c;eNSP实验讲解 一、简要介绍1、概念2、工作原理3、优点4、缺点5、应用场景举例 二、eNSP仿真实验1、步骤一&#xff1a;2、步骤二&#xff1a;3、步骤三&#xff1a;4、步骤四&#xff1a; 三、总结。 一、简要介绍 1、概念 单臂路由&#xff08;Rout…

微服务day03

导入黑马商城项目 创建Mysql服务 由于已有相关项目则要关闭DockerComponent中的已开启的项目 [rootserver02 ~]# docker compose down WARN[0000] /root/docker-compose.yml: version is obsolete [] Running 4/4✔ Container nginx Removed …

Mac如何实现最简单的随时监测实时运行状态的方法

Mac book有着不同于Windows的设计逻辑与交互设计&#xff0c;使得Mac book有着非常棒的使用体验&#xff0c;但是在Mac电脑的使用时间过长时&#xff0c;电脑也会出现响应速度变慢或应用程序崩溃的情况&#xff0c;当发生的时候却不知道什么原因导致的&#xff0c;想要查询电脑…

无需云端!国产开源大语言模型llama.cpp本地实战

作者&#xff1a;高瑞冬 注&#xff1a; 文章是2023年底写的。代码和运行方式虽有些旧&#xff0c;但基本原理一样。现在出来ollama&#xff0c;vllm等工具框架用来本地部署大模型&#xff0c;顺便更新一下。 [TOC](最后有彩蛋) 背景 上海人工智能实验室与商汤科技…

初始JavaEE篇 —— 网络编程(2):了解套接字,从0到1实现回显服务器

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;JavaEE 目录 TCP 与 UDP Socket套接字 UDP TCP 网络基础知识 在一篇文章中&#xff0c;我们了解了基础的网络知识&#xff0c;网络的出…

PVE纵览-从零开始:了解Proxmox Virtual Environment

PVE纵览-从零开始&#xff1a;了解Proxmox Virtual Environment 文章目录 PVE纵览-从零开始&#xff1a;了解Proxmox Virtual Environment摘要什么是Proxmox Virtual EnvironmentPVE的核心功能PVE 优势如何开始使用PVEPVE应用案例总结 关键字&#xff1a; PVE、 虚拟机、 Pr…

08 Oracle数据库故障应对与恢复策略:全面掌握RMAN恢复方法

文章目录 Oracle数据库故障应对与恢复策略&#xff1a;全面掌握RMAN恢复方法一、故障场景及恢复策略1.1 实例失败1.2 介质故障1.3 数据丢失 二、RMAN恢复方法详解2.1 全库恢复2.2 增量恢复2.3 时间点恢复 三、实践与总结 Oracle数据库故障应对与恢复策略&#xff1a;全面掌握RM…

MYSQL隔离性原理——MVCC

表的隐藏字段 表的列包含用户自定义的列和由系统自动创建的隐藏字段。我们介绍3个隐藏字段&#xff0c;不理解也没有关系&#xff0c;理解后面的undo log就懂了&#xff1a; DB_TRX_ID &#xff1a;6 byte&#xff0c;最近修改( 修改/插入 )事务ID&#xff0c;记录创建这条记…

Git超详细教程

Git初始 概念 一个免费开源&#xff0c;分布式的代码版本控制系统&#xff0c;帮助开发团队维护代码 作用 记录代码内容&#xff0c;&#xff0c;切换代码版本&#xff0c;多人开发时高效合并代码内容 如何学&#xff1a; 个人本机使用&#xff1a;Git基础命令和概念 多…