Python confluent-kafka 配置 Kerberos (SASL/GSSAPI) 认证完整指南

周叙
周叙
发布时间:2026-10-14 | 4人浏览过
原创

本文详细介绍如何在 Python 中使用 confluent-kafka 客户端配置 Kerberos (SASL/GSSAPI) 认证。由于 Python 客户端依赖 librdkafka,需先编译支持 GSSAPI 的底层库。文章涵盖 openssl、libsasl2 等依赖的安装,librdkafka 源码编译及动态库配置,最后给出 Python 代码示例及关键配置参数说明,帮助开发者顺利完成安全连接配置。

Kafka 支持的 SASL 认证机制概述

Kafka 目前主要支持三种 SASL 认证机制。

第一种是 SASL/GSSAPI,该机制从版本 0.9.0.0 开始提供支持。

第二种是 SASL/PLAIN,从版本 0.10.0.0 开始提供支持。

第三种包括 SASL/SCRAM-SHA-256 和 SASL/SCRAM-SHA-512,从版本 0.10.2.0 开始提供支持。

Python 客户端配置 Kerberos 认证难点

其中,SASL/GSSAPI 对应的是 Kerberos 认证机制。Java 客户端对此有原生支持,但 Python 客户端的配置相对复杂。Python 的 confluent-kafka 模块底层依赖于 librdkafka,这是一个用 C 编写的高性能 Kafka 客户端库,许多其他语言的客户端也基于此库。因此,要在 Python 中启用 GSSAPI 接口,必须在编译 librdkafka 时确保支持该功能。

librdkafka 源码仓库地址:https://github.com/edenhill/librdkafka

librdkafka 编译前的依赖环境准备

在编译源码之前,必须先安装必要的开发依赖包,否则相关接口无法被编译进库中。

首先需要安装 openssl 库。在 CentOS/RHEL 系统下,使用以下命令安装:yum -y install openssl openssl-devel。需要注意的是,仅编译 openssl 只能支持默认的 PLAIN 和 SCRAM 两种机制,无法支持 GSSAPI。因此,还需要编译 libsasl2 依赖。在 CentOS/RHEL 系统下,使用以下命令安装:

yum install cyrus-sasl-gssapi cyrus-sasl-devel

如果在 Ubuntu 系统下,使用以下命令安装 libsasl2 开发包:apt-get install libsasl2-modules-gssapi-mit libsasl2-dev

接下来确认是否已安装 zlib 库,该库用于支持 Kafka 消息压缩功能。大多数系统默认已包含此库,安装命令为:yum install zlib-devel。如果需要更高的压缩性能,可以手动编译安装 zstd 并启用压缩支持,此处不再展开叙述。

librdkafka 源码编译与动态库配置

上述依赖库安装成功后,即可开始编译 librdkafka 源码。本文使用的源码包版本为 librdkafka-1.2.1.tar.gz,安装命令如下:


# 解压包
tar -xvzf librdkafka-1.2.1.tar.gz
cd librdkafka-1.2.1
# 编译源码
./configure
make
make install

执行命令 ./configure 后,请根据输出信息确认 libssl 以及 libsasl2 是否已成功启用,参考输出如下:

若 libssl 及 libsasl2 均显示 ok,说明配置正确。此时,SSL、SASL SCRAM 以及 SASL GSSAPI 均已支持。如果在 configure 阶段未指定 prefix 参数,默认安装路径为 /usr/local,动态库位于 /usr/local/lib。需要将此目录添加到动态库连接列表中,例如写入 /etc/ld.so.conf 文件,保存后执行 ldconfig 命令使配置生效。

confluent-kafka 安装与测试验证

最后,编译并安装 Python 的 confluent-kafka 模块,本文安装版本为 1.2.0。安装完成后,可运行以下代码进行测试:


#!/usr/bin/env python3
# coding=utf-8
from confluent_kafka import Producer

def delivery_report(err, msg):
  """ Called once for each message produced to indicate delivery result.
    Triggered by poll() or flush(). """
  if err is not None:
    print('Message delivery failed: {}'.format(err))
  else:
    print('Message delivered to {} [{}]'.format(msg.topic(), msg.partition()))

if __name__ == '__main__':
  producer_conf = {
    "bootstrap.servers": '192.168.0.3:9092,192.168.0.4:9092,192.168.0.5:9092',
    "security.protocol": 'sasl_plaintext',
    'sasl.kerberos.service.name': 'kafka',
    'sasl.kerberos.keytab': '/opt/user.keytab',
    'sasl.kerberos.principal': 'kafkauser',
  }
  p = Producer(producer_conf)

  p.poll(0)
  p.produce('testTopic', 'confluent kafka test'.encode('utf-8'),
    callback=delivery_report)

  p.flush()
  print('done')

若能正常生产消息,则表明配置成功。使用 GSSAPI 认证时,仅需配置 security.protocol 以及 keytab 文件路径即可。其他认证参数(如用户名和密码)需根据具体的认证机制进行配置。更多配置参数请参考官方文档:

https://github.com/edenhill/librdkafka/blob/master/CONFIGURATION.md

关于 librdkafka SASL 认证的详细配置流程,可参考:https://github.com/edenhill/librdkafka/wiki/Using-SASL-with-librdkafka

以上即为本文的全部内容,希望对读者有所帮助,欢迎继续支持本站。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表