Kafka3.3单机模式-Windows-SASL/PLAIN身份验证-使用自带zookeeper

1.安装Kafka

windows下安装kafka网上有很多教程,可以参考一下,因为这次使用的zk是kafka自带的,所以不再单独装zk。

2.Kafka、zookerper一键启动bat

第1步参考别的教程安装好kafka后记得测试kafka能不能正常启动,能不能正常首发信息。

当我们启动kafka或者自带的zookeeper时,需要在命令行界面(kafka文件夹)输入

.\bin\windows\kafka-server-start.bat .\config\server.properties

.\bin\windows\zookeeper-server-start.bat .\config\zookeeper.properties

我感觉很麻烦,每次都要输一大段,想模仿tomcat的启动方式直接一键启动,找了很久终于找到了

在kafka的目录下创建zk-start.bat,内容为

cd C:\programfiles\kafka
.\bin\windows\zookeeper-server-start.bat .\config\zookeeper.properties

创建kafka-start.bat,内容为

cd C:\programfiles\kafka
.\bin\windows\kafka-server-start.bat .\config\server.properties

其中cd的文件目录修改成自己的kafka文件夹路径。以后启动就可以一键启动了,先双击zk-start.bat启动,然后双击kafka-start.bat启动。启动后的命令行界面不能关闭!

网上还有一种更快的方法,将kafka加入windows的服务中,就能开机自动启动,但我看了还需要下载别的软件才能实现,而且我也不需要自启,就没用这个方法。

tips:如果运行一键bat文件时命令行界面报错:找不到系统路径,可以修改bin/windows目录下的kafka-run-class.bat,将其中的

IF ["%JAVA_HOME%"] EQU [""] (
	set JAVA=java
) ELSE (
	set JAVA="C:\Program Files\Java\jdk1.8.0_321\bin\java"
)

JAVA的值设置成你本机的jdk路径下bin文件夹中的java

3.zookeeper配置

3.1为啥要配置zookeeper

kafka使用zookeeper来存储元数据,其中包括了ACL。默认的情况下,任何可以访问网络的人,都可以访问zookeeper,这意味着任何人可以:

  • 通过修改配置ACL来升级特权
  • 通过恶意修改zookeeper的元数据,来使得kafka集群收到污染,崩溃
  • 开启认证后,可以阻止恶意修改,同时不妨碍正常访问zookeeper服务

3.2

打开config目录下的zookeeper.properties,在后面加上

authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider #开启认证功能
requireClientAuthScheme=sasl  #认证方式为sasl
jaasLoginRenew=3600000
zookeeper.sasl.client=true

在config目录中新建kafka_zoo_jaas.conf文件,内容

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

注意,配置项最后必须添加分号 " ; ",如果有配置user_admin(即user_xxx中的xxx和username的值一致)时,user_admin的值必须和password一致,下面kafka_cluster_jaas.conf文件同理

说明:username、password是给zookeeper自己用的,在kafka或其他zookeeper连接的时候,告诉它我的用户名是admin,密码是admin,可以不设置。user_admin1="admin1"是保存别人的信息,当有其他zookeeper集群或kafak连接到我时,如果它的用户名是admin1且密码是admin1才能通过权限验证,可以记录多个,user_admin2="admin2"等等。(我根据其他文章的资料推测的,有不对的地方望指出)

编辑bin/windows路径下的zookeeper-server-start.bat,在setLocal下一行增加

SET KAFKA_OPTS=-Djava.security.auth.login.config=C:/programfiles/kafka/config/kafka_zoo_jaas.conf

kafka_zoo_jaas.conf的路径改成自己的

3.3启动zookeeper

双击前面创建的zk-start.bat

Kafka3.3单机模式-Windows-SASL/PLAIN身份验证-使用自带zookeeper_第1张图片

出现红线上的信息表示给zookeeper增加权限验证成功

4.kafka配置

在config目录下,新建kafka_cluster_jaas.conf,内容

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

KafkaServer {
    org.apache.kafka.common.security.plain.PlainLoginModule required
    username="admin"
    password="admin"
    user_admin2="admin2"
    user_admin3="admin3";
};

猜测:Client模块是在kafka作为连接zk作客户端的时候使用的,告诉zk我的用户名admin1和密码admin1。KafkaServer模块是在启动kafka服务器时使用的,连接kafka客户端时告诉它我的用户名admin和密码admin,同时记录其他kafka客户端用户的用户名和密码。因为我们现在是用的kafka单机环境,生产者和消费者都是本机,所以都配置了,后面如果分布式配置后,集群分了生产者集群和消费者集群,可能只需要配置其中对应模块。纯猜测,没把握,仅供参考,若有大神,望评论指导。

打开config下的server.properties,增加

listeners=SASL_PLAINTEXT://localhost:9092
advertised.listeners=SASL_PLAINTEXT://127.0.0.1:9092
# 使用的认证协议
#kafka3.0版本之前
#authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer
#3.0版本之后
authorizer.class.name=kafka.security.authorizer.AclAuthorizer
#SASL_PLAINTEXT
sasl.enabled.mechanisms=PLAIN
security.inter.broker.protocol=SASL_PLAINTEXT
sasl.mechanism.inter.broker.protocol=PLAIN
# 如果没有找到ACL(访问控制列表)配置,则允许任何操作。
#allow.everyone.if.no.acl.found=true
super.users=User:admin
#开启ACL名单
zookeeper.set.acl=true

allow.everyone.if.no.acl.found=true 时,整个ACL机制为黑名单机制,即只有黑名单中的用户不能访问资源,非黑名中的用户都可以正常访问kafka的资源
allow.everyone.if.no.acl.found=false时, 也就是默认为false,ACL的机制是白名单机制,只有白名单中的用户才能访问kafka的资源,其他用户为未授权用户。
————————————————
版权声明:本文为CSDN博主「紫金小飞侠」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yangshengwei230612/article/details/106625842

修改config目录下的producer.properties和consumer.properties,增加

security.protocol=SASL_PLAINTEXT
sasl.mechanism=PLAIN

在cofig文件夹下新建kafka_producer_jaas.conf,如下,记住username和password要和KafkaServer模块中记录的某一个一致

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

在cofig文件夹下新建kafka_consumer_jaas.conf,如下,记住username和password要和KafkaServer模块中记录的某一个一致但要和上面kafka_producer_jaas.conf中的不一样

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

修改bin/windows路径下的kafka-server-start.bat,在SetLocal下一行增加(kafka_cluster_jaas.conf文件路径换成自己的)

SET KAFKA_OPTS=-Djava.security.auth.login.config=C:/programfiles/kafka/config/kafka_cluster_jaas.conf

修改bin/windows路径下的kafka-acls.bat,添加(kafka_cluster_jaas.conf文件路径换成自己的)

SET KAFKA_OPTS=-Djava.security.auth.login.config=C:/programfiles/kafka/config/kafka_cluster_jaas.conf

修改bin/windows路径下的kafka-console-producer.bat,在SetLocal下一行添加(kafka_producer_jaas.conf文件路径换成自己的)

set KAFKA_OPTS=-Djava.security.auth.login.config=C:/programfiles/kafka/config/kafka_producer_jaas.conf

修改bin/windows路径下的kafka-console-consumer.bat,在SetLocal下一行添加(kafka_consumer_jaas.conf文件路径换成自己的)

SET KAFKA_OPTS=-Djava.security.auth.login.config=C:/programfiles/kafka/config/kafka_consumer_jaas.conf

5.启动

先启动zk-start.bat,再启动kafka-start.bat

zookeeper的启动命令行界面出现(我的kafka用户名是admin,和上面例子不一样,具体看你自己在kafka_cluster_jaas.conf中的Client的配置)

Kafka3.3单机模式-Windows-SASL/PLAIN身份验证-使用自带zookeeper_第2张图片

kafka的启动命令行界面出现

Kafka3.3单机模式-Windows-SASL/PLAIN身份验证-使用自带zookeeper_第3张图片

 出现上面两个情况后证明zookeeper的权限验证、与kafka的连接完成。

使用offset explorer连接kafka(可选看)

offset explorer是一个kafka的可视化工具,免费,虽然界面比较简陋,但比起命令行界面感觉还是好不少,下载安装可以参考别的文章。

安装好之后,新建一个连接,如果是没设置任何东西的kafka和zookeeper,可以不用设置任何地方直接test测试能不能连,应该没问题。

Kafka3.3单机模式-Windows-SASL/PLAIN身份验证-使用自带zookeeper_第4张图片Kafka3.3单机模式-Windows-SASL/PLAIN身份验证-使用自带zookeeper_第5张图片

但我们现在的kafka和zookeeper已经加上了sasl认证,所以这几个地方要设置,如图

Kafka3.3单机模式-Windows-SASL/PLAIN身份验证-使用自带zookeeper_第6张图片Kafka3.3单机模式-Windows-SASL/PLAIN身份验证-使用自带zookeeper_第7张图片

 

 username和password的设置和kafka_cluster_jaas.conf中的KafkaServer的admin一致就行。(记住,需要新建一个连接,不能将原来kafka和zk没设置权限时的成功连接修改配置拿来用,亲测会连接失败)

Kafka3.3单机模式-Windows-SASL/PLAIN身份验证-使用自带zookeeper_第8张图片连接成功

6.测试

6.1topic测试

 在config下创建kafka_topic_jaas.properties文件,内容

sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="admin" password="admin";
security.protocol=SASL_PLAINTEXT
sasl.mechanism=PLAIN

 然后进入bin/windows目录,执行

kafka-topics.bat --list --bootstrap-server localhost:9092 --command-config ..\..\config\kafka_topic_jaas.properties

 

测试成功,如果之前没有创建topic,可以用前面说的offset explorer软件先创建一个或者执行完下面创建topic的命令再回来测试

创建topic

kafka-topics.bat --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic test1 --command-config ..\..\config\kafka_topic_jaas.properties

 

注意,这时候创建的topic是没有用户有权限的,所有用户都不能对它进行读写操作,查看topic权限

kafka-acls.bat --bootstrap-server localhost:9092 --list --topic test1 --command-config ..\..\config\kafka_topic_jaas.properties

 

我们给用户名为admin的kafka客户端(能选择的用户在kafka_cluster_jaas.conf中的KafkaServer模块已经定义好了,不能写没记录的用户)配置权限 

kafka-acls.bat --bootstrap-server localhost:9092 --add --allow-principal User:admin --operation Read --operation Write --topic test1 --command-config ..\..\config\kafka_topic_jaas.properties

 Kafka3.3单机模式-Windows-SASL/PLAIN身份验证-使用自带zookeeper_第9张图片

 给admin用户增加了对test1的读写权限

再次查看test1的权限设置

成功加入的admin。

思考:猜测topic权限默认没有角色有的原因可能是在kafka的server.properties中设置的 allow.everyone.if.no.acl.found=false(默认false)

删除topic

kafka-topics.bat --bootstrap-server localhost:9092 --delete --topic test --command-config ..\..\config\kafka_topic_jaas.properties

疑问:

Kafka3.3单机模式-Windows-SASL/PLAIN身份验证-使用自带zookeeper_第10张图片

我第一次删除test后kafka命令行界面奔溃了。。。不知道什么原因,后面再次启动kafka-start.bat一直报错 

NodeExistsException: KeeperErrorCode = NodeExists

解决不了,只能把zk和kafka的日志目录下所有文件全部删除才解决,有知道原因的大佬可以说一下吗?

6.2生产者消费者测试

根据6.1创建好两个topic并分别给预先定义好的kafka用户(KafkaServer模块里面记录的用户)分配读写权限,然后启动生产者

kafka-console-producer.bat --bootstrap-server localhost:9092 --topic oserver --producer.config ..\..\config\producer.properties

然后启动消费者,报错没有group的权限

kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic oserver --consumer.config ..\..\config\consumer.properties

没错,producer不需要group的权限,只需要topic的权限,而consumer还要加一个group的权限。

运行下面语句给消费者的kafka客户端用户admin2增加group id为test-consumer-group的读权限

kafka-acls.bat --bootstrap-server localhost:9092 --add --allow-principal User:admin2 --operation Read --group test-consumer-group --command-config ..\..\config\kafka_topic_jaas.properties

查看权限

kafka-acls.bat --bootstrap-server localhost:9092 --list --command-config ..\..\config\kafka_topic_jaas.properties

Kafka3.3单机模式-Windows-SASL/PLAIN身份验证-使用自带zookeeper_第11张图片

可以看到,这个查看权限的命令不仅显示了group的权限用户,也显示了topic的权限用户,包含了前面topic的相关功能(也同样可以设置topic的权限用户,见参考文章),所以以后权限操作直接使用这个就可以

再次启动消费者

kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic oserver --consumer.config ..\..\config\consumer.properties

Kafka3.3单机模式-Windows-SASL/PLAIN身份验证-使用自带zookeeper_第12张图片

发送消息成功

结束语

本来只想写个简单的kafka权限设置文章,没想到查了网上很多资料后发现里面设计到的操作太多太繁琐,而且和我本身的情况没有完美符合的,所以把参考文章里面对我有用的部分提取出了一个完整的流程,然后发现kafka的 sasl设置文章国内搜索没法精细情景,就把我的情景关键词作为了标题,如果有想设置分布式kafka集群的sasl或者不设置zk的权限或者kafka版本比较旧的可以参考我下面贴的参考文章。

本来还要接入到一个已有的springboot项目,但发现文章已经不短了,内容再加就很杂了,就下一篇文章写吧。

这次配置比较繁杂,可能有的步骤有遗漏,若您发现望指出

参考文章

kafka sasl认证配置及其client实现_yinxuep的博客-CSDN博客_kafka client sasl

Kafka SASL_PLAINTEXT权限管理,并整合SpringBoot_紫金小飞侠的博客-CSDN博客

开启zookeeper的安全认证功能,并配置kafka对zookeeper的身份验证_龟速扣代码的博客-CSDN博客_zookeeper安全认证

kafka用户认证与权限管理(SASL/PLAIN+ACL) - 粒子先生 - 博客园 (cnblogs.com)

Kafka配置2--Windows下配置Kafka的SASL-PLAIN身份验证_qubernet的博客-CSDN博客_requireclientauthscheme

Window下kafka 单机SASL_SCRAM加密及身份认证_cristan_lsy的博客-CSDN博客

zookeeper和kafka安全机制:java.lang.ClassNotFoundException: kafka.security.auth.SimpleAclAuthorizer_Geray-zsg的博客-CSDN博客

offset explorer连接kerberos认证模式的kafka_桃子さん的博客-CSDN博客_offset explorer 用户名密码

Kafka SASL/PLAIN加密 及Kafka-Python整合-pudn.com

你可能感兴趣的:(kafka,kafka,java-zookeeper,zookeeper)