【kafka】docker容器bitnami/kafka使用SASL鉴权(无TLS)

server/2024/9/23 11:19:11/

背景

最近在学习kafka消息队列,了解到kafka是通过SASL来进行用户认证的。起初,因为btinami/kafka官方的一段内容让我以为SASL和TLS是绑定使用的,导致心思花在解决TLS配置上去,官方原文如下:

You must also use your own certificates for SSL. You can drop your Java Key Stores or PEM files into /opt/bitnami/kafka/config/certs. If the JKS or PEM certs are password protected (recommended), you will need to provide it to get access to the keystores:

后来发现其实是可以单独使用SASL,而且官方文档没有完整的配置资料,最后在Issue上找到解决方案。

过程

1.编写一个包含SASL配置的docker-compose.yml文件

version: "2"
services:kafka:image: 'bitnami/kafka:latest'hostname: localhostports:- '9092:9092'environment:- ALLOW_PLAINTEXT_LISTENER=yes- KAFKA_CFG_NODE_ID=0- KAFKA_CFG_PROCESS_ROLES=controller,broker- KAFKA_CLIENT_LISTENER_NAME=CLIENT- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER- KAFKA_CFG_LISTENERS=CLIENT://:9092,CONTROLLER://:9093- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,CLIENT:SASL_PLAINTEXT- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka:9093- KAFKA_CFG_SASL_ENABLED_MECHANISMS=SCRAM-SHA-512- KAFKA_CLIENT_USERS=test- KAFKA_CLIENT_PASSWORDS=123456

将容器跑起来看日志,发现报错:

Exception in thread "main" java.lang.IllegalArgumentException: requirement failed: inter.broker.listener.name must be a listener name defined in advertised.listeners. The valid options based on currently configured listeners are CLIENT

需要配置inter.broker.listener.name 参数,去官网看一下介绍。
以下是inter.broker.listener.name 参数的官方描述:

Name of listener used for communication between brokers. If this is unset, the listener name is defined by security.inter.broker.protocol. It is an error to set this and security.inter.broker.protocol properties at the same time.

以下是security.inter.broker.protocol参数的官方描述:

Security protocol used to communicate between brokers. Valid values are: PLAINTEXT, SSL, SASL_PLAINTEXT, SASL_SSL. It is an error to set this and inter.broker.listener.name properties at the same time.

以下是对两个参数关系的一些官方描述:

Inter-broker listener must be configured using the static broker configuration inter.broker.listener.name or security.inter.broker.protocol.

Among the listeners in this list, it is possible to declare the listener to be used for inter-broker communication by setting the inter.broker.listener.name configuration to the name of the listener. The primary purpose of the inter-broker listener is partition replication. If not defined, then the inter-broker listener is determined by the security protocol defined by security.inter.broker.protocol, which defaults to PLAINTEXT.

由上述可知,inter.broker.listener.namesecurity.inter.broker.protocol 参数的作用是一致的,都是为了设置broker之间通信的配置,由于security.inter.broker.protocol设置之后依然存在问题,本文暂不讨论,后续就以inter.broker.listener.name 参数进行处理。

2.设置inter.broker.listener.name

inter.broker.listener.name 可以设置为一个新的listener,也可以设置为现有的listener(controller除外),本文就以设置现有的listener为例,将改值设置为CLIENT:

version: "2"
services:kafka:image: 'bitnami/kafka:latest'hostname: localhostports:- '9092:9092'environment:- KAFKA_CFG_INTER_BROKER_LISTENER_NAME=CLIENT# ... 和上面的配置一样

此时把容器跑起来,会得到以下错误:

ERROR ==> When using SASL for inter broker comunication the mechanism should be provided using KAFKA_CFG_SASL_MECHANISM_INTER_BROKER_PROTOCOL

只需要设置KAFKA_CFG_SASL_MECHANISM_INTER_BROKER_PROTOCOL,可选值为PLAIN, SCRAM-SHA-256, SCRAM-SHA-512 。在官网介绍中,其实应该还有GSSAPI默认值的,但是这个值在容器使用中会出现错误,而且在bitnami/kafka文档中也没有写支持改值,因此不作讨论。

3.设置KAFKA_CFG_SASL_MECHANISM_INTER_BROKER_PROTOCOL

KAFKA_CFG_SASL_MECHANISM_INTER_BROKER_PROTOCOL设置为PLAINSCRAM-SHA-256SCRAM-SHA-512

version: "2"
services:kafka:image: 'bitnami/kafka:latest'hostname: localhostports:- '9092:9092'environment:- KAFKA_CFG_SASL_MECHANISM_INTER_BROKER_PROTOCOL=SCRAM-SHA-512# ... 和上面的配置一样

这里需要注意是,KAFKA_CFG_SASL_MECHANISM_INTER_BROKER_PROTOCOL 的值需要在KAFKA_CFG_SASL_ENABLED_MECHANISMS 范围内,否则你将看到以下错误:

Exception in thread "main" java.lang.IllegalArgumentException: requirement failed: sasl.mechanism.inter.broker.protocol must be included in sasl.enabled.mechanisms when SASL is used for inter-broker communication

KAFKA_CFG_SASL_ENABLED_MECHANISMS 支持多个值,以 , 隔开即可,如:
KAFKA_CFG_SASL_ENABLED_MECHANISMS=PLAIN,SCRAM-SHA-512

至此,一个简单的SASL的docker-compose.yml配置就完成了

完整配置文件

version: "2"
services:kafka:image: 'bitnami/kafka:latest'hostname: localhostports:- '9092:9092'environment:- ALLOW_PLAINTEXT_LISTENER=yes- KAFKA_CFG_NODE_ID=0- KAFKA_CFG_PROCESS_ROLES=controller,broker- KAFKA_CLIENT_LISTENER_NAME=CLIENT- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER- KAFKA_CFG_INTER_BROKER_LISTENER_NAME=CLIENT- KAFKA_CFG_LISTENERS=CLIENT://:9092,CONTROLLER://:9093- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,CLIENT:SASL_PLAINTEXT- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka:9093- KAFKA_CFG_SASL_MECHANISM_INTER_BROKER_PROTOCOL=SCRAM-SHA-512- KAFKA_CFG_SASL_ENABLED_MECHANISMS=SCRAM-SHA-512- KAFKA_CLIENT_USERS=test- KAFKA_CLIENT_PASSWORDS=123456

参考文章

  • Apache Kafka - security_sasl_config
  • Docker hub - bitnami/kafka
  • Github Issue - [bitnami/kafka] Kraft crashing when setting up secure connection PEM #26067

http://www.ppmy.cn/server/27857.html

相关文章

1. 深度学习笔记--神经网络中常见的激活函数

1. 介绍 每个激活函数的输入都是一个数字,然后对其进行某种固定的数学操作。激活函数给神经元引入了非线性因素,如果不用激活函数的话,无论神经网络有多少层,输出都是输入的线性组合。激活函数的意义在于它能够引入非线性特性&am…

解锁图像新维度:剑桥联手英特尔,利用大语言模型重构逆向图形学!

DeepVisionary 每日深度学习前沿科技推送&顶会论文分享,与你一起了解前沿深度学习信息! 引言:探索逆图形学的新视角 逆图形学(Inverse Graphics)是计算机视觉和图形学中的一个基本挑战,它涉及将图像…

第三十章:docker如何部署openresty

docker如何部署openresty 目标 了解docker 中volumes数据卷的读写控制通过 openresty 配置掌握挂载nginx.confOpenResty OpenResty(又称ngx_openresty)是一个基于Nginx的可伸缩的Web平台,由中国人章亦春发起。它利用了Nginx模块化、可扩展的特性,开发了一系列的增强模块,…

掌握技巧:Linux下通过命令查看系统时间

在Linux系统中,系统时间是至关重要的。程序员经常需要查看系统时间来进行调试、日志记录以及任务调度等操作。 虽然大多数Linux发行版都提供了图形化界面来查看系统时间,但是使用命令行来获取系统时间更加高效和便捷。 本文将介绍几种在Linux下通过命令…

探讨AIGC技术的发展现状和未来趋势

文章目录 每日一句正能量前言技术应用一、AIGC对未来产生了革命性影响二、AIGC将助力元宇宙数字经济的加速发展三、AIGC将加速出版业数字化智能化的转型升级四、AIGC的未来发展趋势及影响 伦理与风险未来展望后记 每日一句正能量 懒人做工作,越懒越费力。 前言 AIG…

[ log日志画图]分割模型训练结束生成相关日志运用代码画图

文章目录 [ log日志画图]分割模型训练结束生成相关日志运用代码画图我的log文件:画图:1.loss1.1 loss是干嘛的1.2 代码1.3 生成图 2.DICE.IOU2.1 DICE,IOU是干嘛的(常规介绍)2.2 代码2.3 生成图小白tip [ log日志画图]分割模型训练结束生成相关日志运用代…

蓝桥杯2022年第十三届决赛真题-最大数字

知识点: double -------(max)10的308次幂 long long ---------(max)10的18次幂 过 96% 的方法 贪心思想:根据数据范围,很容易想到应该用for遍历每一位,复杂度是O(1)。从前往后看每一位,比较通过到达9和通过-到达9的个…

容器安全-镜像扫描

前言 容器镜像安全是云原生应用交付安全的重要一环,对上传的容器镜像进行及时安全扫描,并基于扫描结果选择阻断应用部署,可有效降低生产环境漏洞风险。容器安全面临的风险有:镜像风险、镜像仓库风险、编排工具风险,小…