zookeeper集群SASL认证&KAFKA权限配置SASL/PLAIN身份验证

配置环境
JKD: 1.8
Kafka: 2.3.0
Zookeeper: 3.4.14

服务器名

kafka内网IP:PORT

kafka外网IP:PORT

zookeeper内网IP:PORT

KAFKA01

192.168.1.157:9092

116.155.153.185:19092

192.168.1.157:2181

KAFKA02

192.168.1.158:9092

116.155.153.185:29092

192.168.1.157:2181

KAFKA03

192.168.1.159:9092

116.155.153.185:39092

192.168.1.157:2181

以上外网地址是将各自内网地址在SLB中单独监听产生

关闭kafka
[root@KAFKA01 ~]# cd /opt/kafka
[root@KAFKA01 kafka]# bin/kafka-server-stop.sh
关闭zookeeper
[root@KAFKA01 ~]# cd /opt/bigdata/zookeeper-3.4.14/
[root@KAFKA01 zookeeper-3.4.14]# bin/zkServer.sh stop
修改zookeeper配置文件

在配置文件zoo.cfg添加

authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
requireClientAuthScheme=sasl
jaasLoginRenew=3600000

在conf目录新建zk_server_jaas.conf

touch zk_server_jaas.conf

添加内容

Server {
	org.apache.kafka.common.security.plain.PlainLoginModule required
	username="admin"
	password="admin"
	user_alice="alice";
};

username和paasword是zk集群之间的认证密码。
user_alice=“alice"定义了一个用户"alice”,密码是"alice",是用于kafka客户端访问ZK的。

修改zkEnv.sh,添加内容

export SERVER_JVMFLAGS=" -Djava.security.auth.login.config=/opt/bigdata/zookeeper-3.4.14/conf/zk_server_jaas.conf "
导入相关jar
[root@QG-KAFKA-UAT-TEMP01 ~]# cd /opt/bigdata/zookeeper-3.4.14/lib
[root@QG-KAFKA-UAT-TEMP01 ~]# cp /opt/kafka/libs/kafka-clients-2.3.0.jar ./
[root@QG-KAFKA-UAT-TEMP01 ~]# cp /opt/kafka/libs/lz4-java-1.6.0.jar ./
[root@QG-KAFKA-UAT-TEMP01 ~]# cp /opt/kafka/libs/slf4j-api-1.7.26.jar ./
[root@QG-KAFKA-UAT-TEMP01 ~]# cp /opt/kafka/libs/snappy-java-1.1.7.3.jar ./
[root@QG-KAFKA-UAT-TEMP01 ~]# cp /opt/kafka/libs/slf4j-log4j12-1.7.26.jar ./
修改kafka配置文件

kafka/config路径下新增配置文件kafka_server_jaas.conf

touch kafka_server_jaas.conf

添加内容

KafkaServer {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="admin"
password="admin"
user_admin="admin"
user_alice="alice";
};

说明:在KafkaServer部分,username和password是broker用于初始化连接到其他的broker,在上面配置中,admin用户为broker间的通讯,user_userName定义了所有连接到broker和 broker验证的所有的客户端连接,包括其他broker的用户密码,user_userName必须配置admin用户,否则报错.

kafka/config路径下新增配置文件kafka_client_jaas.conf

touch kafka_client_jaas.conf

添加内容

KafkaClient {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="alice"
password="alice";
};

说明:在KafkaClient部分,username和password是客户端用来配置客户端连接broker的用户,在上面配置中,客户端使用alice用户连接到broker.

修改server.properties

listeners=SASL_PLAINTEXT://kafka内网IP:PORT
advertised.listeners=SASL_PLAINTEXT://kafka外网IP:PORT

添加内容

# 使用的认证协议 
security.inter.broker.protocol=SASL_PLAINTEXT
#SASL机制 
sasl.enabled.mechanisms=PLAIN  
sasl.mechanism.inter.broker.protocol=PLAIN   
# 完成身份验证的类 
authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer 
# 如果没有找到ACL(访问控制列表)配置,则允许任何操作。 
#allow.everyone.if.no.acl.found=true
super.users=User:admin

修改配置文件consumer.properties和producer.properties,分别增加如下配置

security.protocol=SASL_PLAINTEXT
sasl.mechanism=PLAIN

修改consumer.propertie中group.id=group-1,若有多个消费客户端需保证groupid不重复,否则无法同时消费消息.

修改 kafka-server-start.sh

添加内容:
export KAFKA_OPTS=" -Djava.security.auth.login.config=/opt/kafka/config/kafka_server_jaas.conf"

修改kafka-console-consumer.sh和kafka-console-producer.sh,分别增加如下配置

添加内容:
export KAFKA_OPTS=" -Djava.security.auth.login.config=/opt/kafka/config/kafka_client_jaas.conf"
启动zookeeper
[root@KAFKA01 ~]# cd /opt/bigdata/zookeeper-3.4.14/
[root@KAFKA01 zookeeper-3.4.14]# bin/zkServer.sh start
启动kafka
[root@KAFKA01 zookeeper-3.4.14]# cd /opt/kafka
[root@KAFKA01 kafka]# bin/kafka-server-start.sh -daemon config/server.properties &
验证

开启生产者

bin/kafka-console-producer.sh --broker-list KAFKA01:9092 --topic myTopic --producer.config config/producer.properties

开启消费者

bin/kafka-console-consumer.sh --bootstrap-server KAFKA02:9092 --topic myTopic --from-beginning --consumer.config config/consumer.properties
bin/kafka-console-consumer.sh --bootstrap-server KAFKA03:9092 --topic myTopic --from-beginning --consumer.config config/consumer.properties
bin/kafka-console-consumer.sh --bootstrap-server 116.155.153.185:19092 --topic myTopic --from-beginning --consumer.config config/consumer.properties

如果消费者启动不了或者无法消费指定topic,报错如下:

helm 安装 docker image helm 安装kafka关闭sasl_zookeeper


尝试设置所使用用户的组权限

bin/kafka-acls.sh --authorizer-properties zookeeper.connect=KAFKA01:2181,KAFKA02:2181,KAFKA03:2181 --add --allow-principal User:alice --group  group-1 --topic myTopic

其他权限操作例子

增加权限:

# 为用户 alice 在 myTopic(myTopic)上添加读写的权限
bin/kafka-acls.sh --authorizer-properties zookeeper.connect=KAFKA01:2181,KAFKA02:2181,KAFKA03:2181 --add --allow-principal  User:alice --operation Read --operation Write --topic myTopic
# 对于 topic 为 myTopic 的消息队列,拒绝来自 KAFKA01 为192.168.3.107账户为 forrest 进行 read 操作,其他用户都允许
bin/kafka-acls.sh --authorizer-properties zookeeper.connect=KAFKA01:2181 --add --allow-principal KAFKA01 User:* --allow-host * --deny-principal KAFKA01 User:forrest --deny-host 192.168.3.107 --operation Read --topic myTopic
# 为 forrest 和 alice 添加all,以允许来自 KAFKA01 为192.168.3.107或者192.168.1.101的读写请求
bin/kafka-acls.sh --authorizer-properties zookeeper.connect=KAFKA01:2181 --add --allow-principal KAFKA01 User:forrest --allow-principal KAFKA01 User:alice --allow-host 192.168.3.107 --allow-host 192.168.1.101 --operation Read --operation Write --topic myTopic

获取权限列表

# 列出 topic 为 myTopic 的所有权限账户
bin/kafka-acls.sh --authorizer-properties zookeeper.connect=KAFKA01:2181 --list --topic myTopic

移除权限

# 移除 acl
bin/kafka-acls.sh --authorizer-properties zookeeper.connect=KAFKA01:2181 --remove --allow-principal KAFKA01 User:forrest --allow-principal KAFKA01 User:Alice --allow-host 192.168.3.107 --allow-host 192.168.1.101 --operation Read --operation Write --topic myTopic