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实现批量把SVG格式转成png、pdf格式的代码分享
Aug 21 Python
Python实现截屏的函数
Jul 25 Python
Python编程实现删除VC临时文件及Debug目录的方法
Mar 22 Python
Python Flask-web表单使用详解
Nov 18 Python
使用anaconda的pip安装第三方python包的操作步骤
Jun 11 Python
Python简单读写Xls格式文档的方法示例
Aug 17 Python
Python基于Logistic回归建模计算某银行在降低贷款拖欠率的数据示例
Jan 23 Python
手机使用python操作图片文件(pydroid3)过程详解
Sep 25 Python
Django 解决distinct无法去除重复数据的问题
May 20 Python
python神经网络编程实现手写数字识别
May 27 Python
Python 解析简单的XML数据
Jul 24 Python
python IP地址转整数
Nov 20 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
php 分页类 扩展代码
2009/06/11 PHP
PHP中func_get_args(),func_get_arg(),func_num_args()的区别
2013/09/30 PHP
Laravel 5框架学习之Eloquent (laravel 的ORM)
2015/04/08 PHP
php微信开发之上传临时素材
2016/06/24 PHP
javascript 有用的脚本函数
2009/05/07 Javascript
基于jQuery的Spin Button自定义文本框数值自增或自减
2010/07/17 Javascript
关于JavaScript中var声明变量作用域的推断
2010/12/16 Javascript
jquery插件 autoComboBox 下拉框
2010/12/22 Javascript
multiSteps 基于Jquery的多步骤滑动切换插件
2011/07/22 Javascript
如何设置iframe高度自适应在跨域情况下的可用方法
2013/09/06 Javascript
Jquery中find与each方法用法实例
2015/02/04 Javascript
探寻JavaScript中this指针指向
2016/04/23 Javascript
Bootstrap栅格系统的使用和理解2
2016/12/14 Javascript
react-native之ART绘图方法详解
2017/08/08 Javascript
Vue+Flask实现简单的登录验证跳转的示例代码
2018/01/13 Javascript
vuex actions传递多参数的处理方法
2018/09/18 Javascript
vue实现一个炫酷的日历组件
2018/10/08 Javascript
JavaScript中filter的用法实例分析
2019/02/27 Javascript
vue slot与传参实例代码讲解
2019/04/28 Javascript
深入理解JavaScript 箭头函数
2019/05/30 Javascript
微信小程序实现弹出菜单动画
2019/06/21 Javascript
JavaScript单线程和任务队列原理解析
2020/02/04 Javascript
angular中的post请求处理示例详解
2020/06/30 Javascript
浅谈Vuex的this.$store.commit和在Vue项目中引用公共方法
2020/07/24 Javascript
Python实现读取txt文件并画三维图简单代码示例
2017/12/09 Python
Django接收自定义http header过程详解
2019/08/23 Python
利用OpenCV和Python实现查找图片差异
2019/12/19 Python
pycharm配置python 设置pip安装源为豆瓣源
2021/02/05 Python
如何判断计算机可能已经中马
2013/03/22 面试题
小学教师岗位职责
2013/11/25 职场文书
2014年纪检监察工作总结
2014/11/11 职场文书
毕业感言怎么写
2015/07/31 职场文书
劳动保障事务所个人工作总结
2015/08/12 职场文书
如何起草一份正确的合伙创业协议书?
2019/07/04 职场文书
关于Python OS模块常用文件/目录函数详解
2021/07/01 Python
MySQL分布式恢复进阶
2022/07/23 MySQL