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

news2024/12/23 22:34:54

文章目录

  • 官方资料
  • 概述
  • 制作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的异常日志。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ubuntu22.04安装DataEase

看到DataEase的驾驶舱,感觉比PowerBI要好用一点,于是搭建起来玩玩。Dataease推荐的操作系统是Ubuntu22.04/Centos 7。 下载了Ubuntu22.04和DataEase 最新版本的离线安装包 一.安装ubuntu22.04 在安装的时候,没有顺手设置IP地址信息&#xff…

使用iviewui组件库的坑

背景 使用view-design组件库的Input组件的时候,按照产品的要求,输入框中只能键入正整数。 使用效果 如果直接使用组件的type属性,设置类型为number时,乍一看没啥问题,但是当我们键入 小数点(.) 或者 e/E 后面没有跟任…

AI绘图最强软件stable diffusion,一文带你迅速了解!

有需要stable diffusion整合包可以扫描下方,免费获取 01 — 什么是 SD ​ Stable Difusion(简称 SD) 其三种概念。 1.用来指代稳定扩散(Stable Diffusion) 技术,如 Midjourney是基于Stable Difusion技术实现的就是指它运用了 Stable Diffusion 的技术原理。 …

Unity3D实现视频和模型融合效果

系列文章目录 unity工具 文章目录 系列文章目录👉前言👉一、效果展示如下👉二、VideoPlayer播放视频(一)👉2-1、Hieraechy面板右键创建videoPlayer👉2-2、Assets面板右键创建RenderTexture👉2-3、把设置好的RenderTexture拖到videoPlayer里面还有本地视频视频�…

stm32 ADC实例解析(3)-多通道采集互相干扰的问题

文章目录 一、问题现象:二、原因分析:1、测量值不准问题分析:2、采样干扰问题分析 三、解决办法:1、硬件:(1)、电源供电(2)、引脚电容(3)、减少采…

springboot 医院住院管理系统,计算机毕业设计项目源码035,计算机毕设程序(LW+开题报告、中期报告、任务书等全套方案)

摘 要 随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,医院当然也不例外。医院住院管理系统是以实际运用为开发背景,运用软件工程原理和开发方法,采用J…

Redis集群模式之Redis Sentinel vs. Redis Cluster

在分布式系统环境中,Redis以其高性能、低延迟和丰富的数据结构而广受青睐。随着数据量的增长和访问需求的增加,单一Redis实例往往难以满足高可用性和扩展性的要求。为此,Redis提供了两种主要的集群模式:Redis Sentinel和Redis Clu…

谷歌浏览器的自动翻译功能如何开启

在当今全球化的网络环境中,能够流畅地浏览不同语言的网页是至关重要的。谷歌浏览器(Google Chrome)提供了一项强大的自动翻译功能,可以帮助用户轻松跨越语言障碍。本文将详细介绍如何开启和使用谷歌浏览器的自动翻译功能&#xff…

中文书籍对《人月神话》的引用(161-210本):微软的秘密

中文书籍对《人月神话》的引用(第001到160本)>> 《人月神话》于1975年出版,1995年出二十周年版。自出版以来,该书被大量的书籍和文章引用,直到现在热潮不退。 2023年,清华大学出版社推出《人月神话》…

Docker了解

Docker是一种容器化技术,它可以将应用程序和其依赖项打包到一个独立的、可移植的容器中,以便在不同的环境中运行。Docker基于Linux操作系统的容器化技术,可以提供更轻量、更快速、更灵活、更一致的应用部署和管理方式。 Docker的基本概念包括…

【LLM Agents体验 3】利用Open-WebUI+Ollama本地部署Qwen2.5:7B大模型的安装指南

Open WebUI是一种基于 Web 的用户界面,用于管理和操作各种本地和云端的人工智能模型。它提供了一个直观的图形化界面,使用户可以方便地加载、配置、运行和监控各种 AI 模型,而无需编写代码或使用命令行界面。 Open-WebUI 是一款功能强大且易于…

新Activity启动时Task的位置(分屏场景)

目录 场景 场景 当类似上面的Task状态,我们自定义的三个按钮,启动新的Activity的时候,并没有去设置需要launche的task。 Intent intent new Intent();intent.setComponent(new ComponentName("com.android.dialer","com.and…

GitLab基于Drone搭建持续集成(CI/CD)

本文介绍了如何为 Gitee 安装 Drone 服务器。服务器打包为在 DockerHub 上分发的最小 Docker 映像。 1. 准备工作 创建OAuth应用 创建 GitLab OAuth 应用。Consumer Key 和 Consumer Secret 用于授权访问极狐GitLab 资源。 ps:授权回调 URL 必须与以下格式和路径匹配&…

检测敏感词功能

今天策划给我一个任务 —— 检测昵称中是否含有敏感词功能,然后丢给我两个压缩包,我解压一看: 有的txt文件是一行一个词: 有的txt文件是按逗号分隔开: 不管是什么格式的总之量非常多,把我这辈子脏话都囊括…

【OpenGL】OpenGL简介

文章目录 OpenGL概述OpenGL的本质OpenGL相关库核心库窗口管理glutfreeglutglfw 函数加载glewGLAD OpenGL概述 OpenGL(Open Graphics Library) 严格来说,本身并不是一个API,它是一个由Khronos组织制定并维护的规范(Specification)。OpenGL规范严格规定了…

python-24-一篇文章彻底掌握Python HTTP库Requests

python-24-一篇文章彻底掌握Python HTTP库Requests 一.简介 在 Python 中,Requests 是一个非常流行且易于使用的 Python HTTP 库,专门用于发送 HTTP/HTTPS 请求,获取请求响应; 可能觉得HTTP请求不是应该前端去做么?…

SpringMVC案例学习(一)--计算器设计登录页面设计

文章目录 1.计算器1.1.html代码1.2接口设计1.3前端测试1.4接口测试 2.登录页面设计2.1接口实现2.2查看前端页面效果2.3未进行前后端交互时候的代码2.4前后端交互设计2.5个人实践遇到的问题 3.lombok介绍3.1插件安装3.2导入依赖 1.计算器 1.1.html代码 下面的这个就是我们的前…

【Linux 麒麟系统 qt 程序通过root启动 桌面程序】

通过.desktop pkexec 启动程序 关键字方案一方案二第一步 修改.desktop第二步 xxx.sh实现 注意 关键字 pkexec .desktop qt 原始需求: 用户在麒麟系统上通过快捷方式(.desktop)启动程序后绑定系统的26端口,但是因为系统权限问题,26端口普通…

DevOps-Gitlab-私有代码仓库

1. 概述 1. 私有代码仓库 2. 精细化权限配置,让系统更安全 3. 控制用户/用户组是否可以提交到主分支 (PR Push Request) 4. 它使用Ruby语言写成。后来,一些部分用Go语言重写 2. Gitlab vs Github/Gitee GitlabGithub/Gitee共同点存放代码,git访问存放代码,git访问…

【AI声音克隆整合包及教程】第二代GPT-SoVITS V2:技术、应用与伦理思考

一、引言 在当今科技迅速发展的时代,声音克隆技术成为人工智能领域的一个备受瞩目的分支。GPT-SoVITS V2作为一种声音克隆工具,正逐渐进入人们的视野,它在多个领域展现出巨大的潜力,同时也引发了一系列值得深入探讨的问题。本文旨…