python代码抒写开kerberos安全的kafka生产者消费

2023年1月17日11:25:22

艰辛三天的时间,终于走通了。

前提说明:

针对kafka server开启了 kerberos认证,协议使用的GSSAPI协议。

经常用java代码写消费者,java代码支持GSSAPI协议,可以通过代码去登陆用户。

python也支持gssapi协议,但是需要通过kerberos客户端去登陆用户。

阅读源码--conn.py,发现是支持 GSSAPI的。

 

操作系统:  CentOS Linux release 7.6.1810 (Core),非硬性要求

1、python环境的搭建

1.1、系统本身自带了---Python 2.7.5版本

1.2、升级下python到3.7.0

1.2.1下载 wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xz

1.2.2、在安装包中有一个README的文件,里面有写如何安装

tar Jxvf Python-3.7.0.tar.xz

cd Python-3.7.0

./configure --prefix=/usr/local/python3

make && make install

1.2.3、软连接到 python3命令

ln -s /usr/local/python3/bin/python3.7 /usr/local/bin/python3

到这里python安装完成。  使用 python3 -V 查看版本。 

1.2.4、软连接到pip命令

ln -s /usr/local/python3/bin/pip3.7 /usr/local/bin/pip

1.2.5、升级 pip

pip install --upgrade pip

2、kerberos认证客户端的准备

2.1、安装

yum install -y krb5-devel.x86_64

2.2、验证

krb5-config

kinit

klist 命令的是否可用

3、python-kafka生产者代码

3.1、代码运行需要导入 pip install gssapi ; pip install kafka-python

从kdc服务端拿来 keytab密钥以及用户。kinit 登陆用户,记得修改 /etc下面的 krb5.conf文件 ,和服务器的 krb5.conf保持一致。

from kafka import KafkaProducer

from kafka.errors import KafkaError

import os

class Kafka_Producer():

    def __init__(self, kafkahost, kafkaport, kafkatopic):

        self.kafkaHost = kafkahost

        self.kafkaPort = kafkaport

        self.kafkatopic = kafkatopic

        self.producer = KafkaProducer(

                bootstrap_servers = '{kafka_host}:{kafka_port}'.format(kafka_host=self.kafkaHost,kafka_port=self.kafkaPort),

                security_protocol="SASL_PLAINTEXT",

                sasl_mechanism="GSSAPI",

                sasl_kerberos_service_name="kafka"

                )

    def sendFileData(self, params):

        try:

             f = open(params,'rb')

             parmasMessage = f.read(-1).strip()

             producer = self.producer

             producer.send(self.kafkatopic, parmasMessage)

             producer.flush()

        except KafkaError as e:

             print (e)

     

def main():

    filePath = "/mnt/data/"

    topic = "demo"

    producer = Kafka_Producer("xxx","9092",topic)

    dirList = os.listdir(filePath)

    for fileName in dirList:

        producer.sendFileData(filePath+fileName)

    print('send success!!!')



if __name__=='__main__':

    main()

遇到的问题:

1、gssapi包导入不成功。因为krb5-devel.x86_64没有windows版本,在 window下导入gssapi会报“krb5-config --libs gssapi”。需要在linux环境下 安装krb5-devel.x86_64导入gssapi。

参考资料:

       https://www.cnblogs.com/feng18/p/5854912.html

       https://www.iteblog.com/archives/2148.html

  • 作者:waneyongfu
  • 原文链接:https://blog.csdn.net/waneyongfu/article/details/90518822
    更新时间:2023年1月17日11:25:22 ,共 2265 字。