kafka(2.3.1)-zookeeper(3.4.12)集群开启kerberos认证部署详解

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 页)

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

笔记插图(第 3 页)

由上图可知,服务端开启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 页)

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

观察启动日志可以发现,权限认证已成功通过并登陆

笔记插图(第 6 页)

后记:相关命令

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