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,报错如下:
尝试设置所使用用户的组权限
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