Apache Druid连接开通Kerberos认证的Kafka处理过程

Apache Druid连接开通Kerberos认证的Kafka处理过程

经验文章nimo972025-01-10 14:31:3610A+A-

前段时间公司的业务服务器进行了安全扫描,扫描出几个问题,需要整改,其中有一条,就是安装的大数据集群环境CDH需要开启kerberos认证。

我们的CDH版本是6.3.2,安装的服务有hdfs、zookeeper和kafka。开启kerberos认证前,所有的业务都是正常的。

开启了kerberos安全认证后,发现kafka客户端无法消费数据了。

系统用的kafka消费端主要有java程序、kafka-ui、Apache-druid。

经过几天的研究和网络搜索,终于解决了系统访问开通kerberos认证的kafka的访问问题。

其中解决起来比较困难的要属Apache druid的解决了,下面主要就Apache Druid讲解一下解决的过程。

Apache Druid是一个开源的时序数据库,用于存储原始数据明细的,可以从多种数据源加载数据,我们用的就是接入kafka broker,实时加载数据,原来在kafka没有开通kerberos认证的时候,这些都是正常的,可以很容易的通过web console配置实时加载任务。

kafka自从有了认证之后,druid中所有的kafka任务都停止了,处于无法消费数据的状态。

由于Apache Druid还是一个比较小众的数据库,网上的有价值的信息比较少,多数都是重复的和过时的问题,官网帮助文档中也没有提到如何接入kerberos认证的kafka。

但是网上倒是有很多关于java如何连接kerberos认证的kafka的例子,参照这些例子,再结合Apache Druid的配置参考资料,不断尝试,最终调试通过。

这里kerberos的认证方式,我采用的是keytab的方式,CDH开通kerberos后,默认生成了很多principal,也就是账号,但是这些账号都是随机密码,用keytab比较方便。

如果关于kerberos认证不是很了解的,建议先百度一下,有个基本的概念。

简单来说,就是本地需要一个密码文件, 认证的时候需要用一下,然后就可以访问kafka了。

第一步,生成keytab文件
先登录到kerberos的认证服务器上面,就是可以执行kadmin.local的服务器。

假设我们安装kafka集群的机器名为,host1、host2、host3,kerberos的域是JHT.COM。

我们用于访问kafka的一个账号是 kafka/host1@JHT.COM。

用root执行命令:

kadmin.local -q "xst -k kafka.keytab kafka/host1@JHT.COM"

这样就会在当前目录生成一个kafka.keytab的文件。

创建一个文件夹,比如 /home/keytabs

将kafka.keytab移动到/home/keytabs下


第二步, 准备其他配置文件
在/home/keytabs目录中,创建jaas.conf文件

文件内容如下:

KafkaClient{

com.sun.security.auth.module.Krb5LoginModule required

useKeyTab=true

keyTab="/home/keytabs/kafka.keytab"

useTicketCache=false

debug=true

principal="kafka/host1@JHT.COM";

};

再将/etc/krb5.conf也复制到/home/keytabs文件夹中。

这样,这个文件夹里面就有三个文件了, kafka.keytab、 jaas.conf、krb5.conf

第三步,修改Apache Druid的配置
1) 修改Apache Druid中各组件的jvm.config文件, 包括master、data、query下面的各组件,增加下面两行-Djava.security.auth.login.config=/home/keytabs/jaas.conf-Djava.security.krb5.conf=/home/keytabs/krb5.conf

2) 修改middleManager的runtime.properties文件

找到 # Task launch parameters

在druid.indexer.runner.javaOpts参数中增加-Djava.security.auth.login.config=/home/keytabs/jaas.conf -Djava.security.krb5.conf=/home/keytabs/krb5.conf

修改后,如下:

druid.indexer.runner.javaOpts=-server -Xms1g -Xmx1g -XX:MaxDirectMemorySize=1g -Duser.timezone=UTC -Dfile.encoding=UTF-8 -XX:+ExitOnOutOfMemoryError -Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager -Djava.security.auth.login.config=/home/keytabs/jaas.conf -Djava.security.krb5.conf=/home/keytabs/krb5.conf

修改完所有组件的配置之后,重启Druid的所有服务。

重启完成后,通过浏览器访问druid的web控制台

第四步,创建kafka加载任务

在web控制台,点击Load Data,选择Start a new spec,然后选择Apache kafka




点击右侧的Connect Data->

这时,需要输入连接kafka的参数

先输入Bootstrap servers,比如:host1:9092

Topic: test-topic

在下面的Consumer properties文本框中自动会填入下面的内容:

{ "bootstrap.servers": "host1:9092"}

我们这时,需要手动在Consumer properties中加入连接kerberos所需的参数信息,修改后如下:

{

"bootstrap.servers": "host1:9092",

"security.protocol": "SASL_PLAINTEXT",

"sasl.mechanism": "GSSAPI",

"sasl.kerberos.service.name": "kafka"

}




选择Start of stream


点击Apply, 再点击Next:Parse data->


后面的配置就和原来的配置一致了


至此,原来连接不上Kafka消费数据的Druid,就又可以正常了。

点击这里复制本文地址 以上内容由nimo97整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

尼墨宝库 © All Rights Reserved.  蜀ICP备2024111239号-7