
kafka(2.3.1)-zookeeper(3.4.12)集群开启kerberos认证部署详解
前置条件:服务器及安装情况
IP地址 hostname 安装应用 principal
192.168.2.123 db-123 kerberos
192.168.2.124 db-124 zookeeper、kafka kafka/db-124@DB-123.COM
192.168.2.125 db-125 zookeeper、kafka kafka/db-125@DB-123.COM
192.168.2.126 db-126 zookeeper、kafka kafka/db-126@DB-123.COM
1
java version 1.8.0_241
2 zookeeper 版本:zookeeper-3.4.12 安装路径 /usr/local/kafka_zk/zookeeper-3.4.12
3 kafka 版本:kafka_2.12-2.3.1 安装路径 /usr/local/kafka_zk/kafka_2.12-2.3.1
4 配置文件路径: /usr/local/kafka_zk/config, 包括:
5 kafka124.keytab kafka与zookeeper所需的principal(两个principal放在了一起)
6 kafka.jaas kafka的jaas文件
7 ker.pro kafka的consumer与producer所需的认证文件
8 zookeeper.jaas zookeeper的jaas文件
一、安装kerberos服务
请参考
Kerberos认证原理与环境部署
二、创建principal导出keytable文件以及其他相关的配置
三台服务器分别按照前置条件 修改hostname与hosts
分别添加san’taisantai服务器的principal并生成ketable
将keytable文件放到三台服务器中对应的服务器的指定的位置/usr/local/kafka_zk/config下
三、部署zookeeper并开启kerberos
分别在三台服务器做以下配置,注意相关地址的修改,以下以db-124为例
3.1、修改zoo.cfg
添加以下安全相关的配置 追加下文
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
requireClientAuthScheme=sasl
jaasLoginRenew=3600000

1
#完整配置
2 tickTime=2000
3 initLimit=10
4 syncLimit=5
5 dataDir=/usr/local/kafka_zk/zookeeper-3.4.12/data
6 clientPort=2181
7
8
9
10 server.124=db-124:2888:3888
11 server.125=db-125:2888:3888
12 server.126=db-126:2888:3888
13
14 authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
15 requireClientAuthScheme=sasl
16 jaasLoginRenew=3600000
3.2、在conf目录创建java.env文件,添加以下内容
1
export JVMFLAGS="-
Djava.security.auth.login.config=/usr/local/kafka_zk/config/zookeeper.jaas"
3.3、在/usr/local/kafka_zk/config目录创建zookeeper.jaas文件
1
Server{
2 com.sun.security.auth.module.Krb5LoginModule required
3 useKeyTab=true
4 storeKey=true
5 keyTab="/usr/local/kafka_zk/config/kafka124.keytab"
6 principal="zookeeper/db-124@DB-123.COM"
7 userTicketCache=false;
8 };
9 Client{
10 com.sun.security.auth.module.Krb5LoginModule required
11 useKeyTab=true
12 storeKey=true
13 keyTab="/usr/local/kafka_zk/config/kafka124.keytab"
14 principal="zookeeper/db-124@DB-123.COM"
15 userTicketCache=false;
16 };
3.4、启动zookeeper服务
1
./bin/zkServer.sh start

由上图可知,服务端开启kerberos成功。
启动完毕 zookeeper 可以在 zk 节点上进入 zkCli
1
zkCli.sh -server db-124:2181
四、部署kafka
分别在三台服务器做以下配置,注意相关地址的修改,以下以db-124为例
4.1、配置kafka.jaas文件
1
KafkaServer {
2 com.sun.security.auth.module.Krb5LoginModule required
3 useKeyTab=true
4 storeKey=true
5 keyTab="/usr/local/kafka_zk/config/kafka124.keytab"
6 principal="kafka/db-124@DB-123.COM";
7 };
8
9 KafkaClient {
10 com.sun.security.auth.module.Krb5LoginModule required
11 useKeyTab=true
12 useKeyTab=true
13 keyTab="/usr/local/kafka_zk/config/kafka124.keytab"
14 principal="kafka/db-124@DB-123.COM";
15 };
16
17 Client {
18 com.sun.security.auth.module.Krb5LoginModule required
19 useKeyTab=true
20 storeKey=true
21 keyTab="/usr/local/kafka_zk/config/kafka124.keytab"
22 principal="kafka/db-124@DB-123.COM";
23 };
KakfaServer配置代表了kafka集群中Server彼此间通信所使用的通信认证方式。
Client配置代表了kafka集群中Server与Zookeeper通信时的认证方式。
KafkaClient配置代表了命令行客户端与kafka集群通信时的认证方式。
4.2、修改kafka-run-class.sh文件
在kafka-run-class.sh文件中找到KAKFA_JVM_PERFORMANCE_OPTS,并增加两个JVM参数:
1
-Djava.awt.headless=true -Djava.security.krb5.conf=/etc/krb5.conf -
Djava.security.auth.login.config=/usr/local/kafka_zk/config/kafka.jaas
如图所示:

4.3、创建生产者、消费者配置文件 ker.pro
1
security.protocol=SASL_PLAINTEXT
2 sasl.kerberos.service.name=kafka
3 sasl.mechanism=GSSAPI
4.4、修改Kafka Server配置文件
开启Kerberos服务,需要在配置文件中开启相应的配置项。修改server.properties文件,确保配置项的值如下:
authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer
security.inter.broker.protocol=SASL_PLAINTEXT
sasl.mechanism.inter.broker.protocol=GSSAPI
sasl.enabled.mechanisms=GSSAPI
sasl.kerberos.service.name=kafka
super.users=User:kafka
#暂时没发现此配置的作用,配不配都行
allow.everyone.if.no.acl.found=false
1
#完整配置
2 broker.id=124
3 listeners=SASL_PLAINTEXT://db-124:9092
4 advertised.listeners=SASL_PLAINTEXT://db-124:9092
5 num.network.threads=3
6 num.io.threads=8
7 socket.send.buffer.bytes=102400
8 socket.receive.buffer.bytes=102400
9 socket.request.max.bytes=104857600
10 ############################# Log Basics #############################
11 log.dirs=/usr/local/kafka_zk/kafka_2.12-2.3.1/data/kafka-logs
12 num.partitions=1
13 num.recovery.threads.per.data.dir=1
14 ############################# Internal Topic Settings #############################
15 offsets.topic.replication.factor=1
16 transaction.state.log.replication.factor=1
17 transaction.state.log.min.isr=1
18 ############################# Log Flush Policy #############################
19 log.retention.hours=168
20 log.segment.bytes=1073741824
21 log.retention.check.interval.ms=300000
22 ############################# Zookeeper #############################
23 zookeeper.connect=db-124:2181,db-125:2181,db-126:2181
24 #zookeeper.connect=db-124:2181
25 zookeeper.connection.timeout.ms=6000
26 ############################# Group Coordinator Settings #############################
27 group.initial.rebalance.delay.ms=0
28
29 authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer
30 security.inter.broker.protocol=SASL_PLAINTEXT
31 sasl.mechanism.inter.broker.protocol=GSSAPI
32 sasl.enabled.mechanisms=GSSAPI
33 sasl.kerberos.service.name=kafka
34 super.users=User:kafka
35
36 #暂时没发现此配置的作用,配不配都行
37 allow.everyone.if.no.acl.found=false
38
39 #此版本不能配置
40 #advertised.host.name=db-124
41 #zookeeper.set.acl=true
42 #zookeeper.sasl.clientconfig=kafka
43
4.5、启动Kafka Server
启动kafka之前确保Zookeeper集群已启动。 启动指令:
1
./bin/kafka-server-start.sh -daemon start config/server.properties
观察启动日志可以发现,权限认证已成功通过并登陆

后记:相关命令
1
kadmin.local
2
3 getprincs
4 ./bin/kafka-server-start.sh -daemon config/server.properties
5 ./bin/kafka-server-start.sh config/server.properties
6
7 ./bin/kafka-topics.sh --create --zookeeper db-124:2181,db-125:2181,db-126:2181 --
replication-factor 3 --partitions 3 --topic test
8 ./bin/kafka-console-consumer.sh --topic test1 --from-beginning --bootstrap-server db-
124:9092,db-125:9092,db-126:9092 --consumer.config ../config/ker.pro
9 ./bin/kafka-console-producer.sh --broker-list db-124:9092,db-125:9092,db-126:9092 --
topic test-zk --producer.config ../config/ker.pro
10 ./bin/kafka-topics.sh --zookeeper db-124:2181,db-125:2181,db-126:2181 --list
11 ./bin/kafka-topics.sh --zookeeper db-124:2181,db-125:2181,db-126:2181 --list
12 ./bin/kafka-acls.sh --authorizer-properties zookeeper.connect=db-124:2181,db-125:2181,db-
126:2181 --list
13
14 ./bin/kafka-acls.sh --authorizer-properties zookeeper.connect=db-124:2181,db-125:2181,db-
126:2181 --add --allow-principal User:zhangsan --operation Read --operation Write --
topic test
15 ./bin/kafka-acls.sh --authorizer-properties zookeeper.connect=db-124:2181,db-125:2181,db-
126:2181 --add --allow-principal User:zhangsan --group test
16
17
18 ./bin/zkServer.sh start
19 ./bin/zkServer.sh stop
20 ./bin/zkServer.sh status
21
22 rm -rf data/version-2/*
23 rm -rf data/kafka-logs/*
24
25 ./bin/zkCli.sh -server db-125:2181