Apache Druid连接开通Kerberos认证的Kafka处理过程
前段时间公司的业务服务器进行了安全扫描,扫描出几个问题,需要整改,其中有一条,就是安装的大数据集群环境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,就又可以正常了。