Python confluent kafka客户端配置kerberos认证流程详解


Posted in Python onOctober 12, 2020

kafka的认证方式一般有如下3种:

1.SASL/GSSAPI 从版本0.9.0.0开始支持

2.SASL/PLAIN 从版本0.10.0.0开始支持

3.SASL/SCRAM-SHA-256 以及 SASL/SCRAM-SHA-512 从版本0.10.2.0开始支持

其中第一种SASL/GSSAPI的认证就是kerberos认证,对于java来说有原生的支持,但是对于python来说配置稍微麻烦一些,下面说一下具体的配置过程,confluent kafka模块底层依赖于librdkafka,这是使用c编写的高性能的kafka客户端库,有好多语言的库都是依赖于这个,所以GSSAPI接口的开启也需要在librdkafka编译的时候支持

librdkafka源码:https://github.com/edenhill/librdkafka

编译之前需要先安装必要的开发包,否则相关的接口编译不进去

首先是openssl库,使用yum安装为:yum -y install openssl openssl-devel,编译openssl只能支持默认的PLAIN还有SCRAM这两种机制,无法支持GSSAPI的机制,还需要编译libsasl2依赖,yum安装命令如下:

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

在ubuntu下使用命令:apt-get install libsasl2-modules-gssapi-mit libsasl2-dev安装libsasl2开发包

然后确认一下是否有zlib库,这个是方便对kafka消息压缩使用的,一般都会存在,安装命令:yum install zlib-devel,如果需要更高的性能可以手动编译安装zstd并且启用压缩,这里不再详细叙述

上面的库都安装成功就可以开始编译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是否被开启,如下:

Python confluent kafka客户端配置kerberos认证流程详解

这里libssl以及libsasl2都显示ok说明是可以的,现在SSL和SASL SCRAM以及SASL GSSAPI都已经支持了,执行configure阶段没指定prefix则默认安装位置为/usr/local,动态库位置就为:/usr/local/lib,需要将这个目录添加到动态库连接列表中,比如加到/etc/ld.so.conf,保存后执行ldconfig生效

最后可以编译和安装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 相关文章推荐
Python代码的打包与发布详解
Jul 30 Python
Python正则简单实例分析
Mar 21 Python
Python实现随机选择元素功能
Sep 14 Python
python使用标准库根据进程名如何获取进程的pid详解
Oct 31 Python
Python查看微信撤回消息代码
Jun 07 Python
python 求一个列表中所有元素的乘积实例
Jun 11 Python
python pytest进阶之fixture详解
Jun 27 Python
解决python 文本过滤和清理问题
Aug 28 Python
使用wxpy实现自动发送微信消息功能
Feb 28 Python
Python使用struct处理二进制(pack和unpack用法)
Nov 12 Python
python实现数学模型(插值、拟合和微分方程)
Nov 13 Python
matplotlib交互式数据光标实现(mplcursors)
Jan 13 Python
Django如何使用asyncio协程和ThreadPoolExecutor多线程
Oct 12 #Python
使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二)
Oct 12 #Python
使用Python将xmind脑图转成excel用例的实现代码(一)
Oct 12 #Python
使用python把xmind转换成excel测试用例的实现代码
Oct 12 #Python
Python Sqlalchemy如何实现select for update
Oct 12 #Python
浅析PyCharm 的初始设置(知道)
Oct 12 #Python
Pandas替换及部分替换(replace)实现流程详解
Oct 12 #Python
You might like
桌面中心(四)数据显示
2006/10/09 PHP
表单复选框向PHP传输数据的代码
2007/11/13 PHP
How do I change MySQL timezone?
2008/03/26 PHP
PHP实现的下载远程图片自定义函数分享
2015/01/28 PHP
php单一接口的实现方法
2015/06/20 PHP
smarty模板数学运算示例
2016/12/11 PHP
jquery 简单应用示例总结
2013/08/09 Javascript
jquery单行文字向上滚动效果的实现代码
2014/09/05 Javascript
jQuery中dom元素上绑定的事件详解
2015/04/24 Javascript
AngularJS进行性能调优的7个建议
2015/12/28 Javascript
基于Bootstrap3表格插件和分页插件实例详解
2016/05/17 Javascript
jQuery快速高效制作网页交互特效
2017/02/24 Javascript
完美实现js选项卡切换效果(二)
2017/03/08 Javascript
微信小程序 参数传递实例代码
2017/03/20 Javascript
vue.js 嵌套循环、if判断、动态删除的实例
2018/03/07 Javascript
在 Typescript 中使用可被复用的 Vue Mixin功能
2018/04/17 Javascript
AngularJS自定义过滤器用法经典实例总结
2018/05/17 Javascript
JS+HTML5 Canvas实现简单的写字板功能示例
2018/08/30 Javascript
django使用channels2.x实现实时通讯
2018/11/28 Javascript
在element-ui的select下拉框加上滚动加载
2019/04/18 Javascript
jQuery冲突问题解决方法
2021/01/19 jQuery
python在windows下实现ping操作并接收返回信息的方法
2015/03/20 Python
详解python之heapq模块及排序操作
2019/04/04 Python
Python 将json序列化后的字符串转换成字典(推荐)
2020/01/06 Python
Python3交互式shell ipython3安装及使用详解
2020/07/11 Python
关于Python3爬虫利器Appium的安装步骤
2020/07/29 Python
利用CSS3的定位页面元素
2009/08/29 HTML / CSS
详解HTML5中的元素与元素
2015/08/17 HTML / CSS
HTML5实现无刷新修改URL的方法
2019/11/14 HTML / CSS
华硕新加坡官方网上商店:ASUS Singapore
2020/07/09 全球购物
室内设计专业个人的自我评价
2013/12/18 职场文书
房地产项目策划书
2014/02/05 职场文书
高中运动会入场词
2014/02/14 职场文书
初中优秀班集体申报材料
2014/05/01 职场文书
2014年转正工作总结
2014/11/08 职场文书
Linux中如何安装并部署Redis
2022/04/18 Servers