之前写过一篇Kafka ACL使用实战,里面演示了如何配置SASL PLAIN + ACL来为Kafka集群提供认证/权限安全保障,但有一个问题经常被问到:这种方案下是否支持动态增加/移除认证用户——这里给出明确的答案:不可以!因为所有认证用户信息全部配置在静态的jaas文件中,故无法在不重启broker的情况下实现用户增减。这一次我以Kafka 2.1.0版本为例演示配置SASL SCRAM + ACL来实现如何动态增减用户,另外也想完善和优化上一篇中的一些不足之处(比如说不用再修改初始的.sh脚本,改用环境变量的方式来使设置生效)。
1. 环境准备
Kafka服务器:一台云主机,4 core,8GB RAM,1Gbps带宽
Kafka客户端:另一台云主机
客户端与服务器通过内网交互
2. 集群拓扑
启动两台Kafka服务器,由于我只在一台云主机上演示,故上面启动两个broker实例。客户端这边使用console-producer和console-consumer脚本来模拟客户端程序。
3. 创建用户
我们使用kafka-configs.sh来创建用户,Kafka的SCRAM实现机制会把用户认证信息保存在Zookeeper中。假设我要创建3个用户admin, writer, reader分别用于实现Kafka broker间通讯、生产消息和消费消息。下面我们开始具体的配置:首先启动Zookeeper,但不要启动Kafka broker,ZK启动成功后执行以下命令去创建3个用户:
创建writer用户,密码是writer-pwd:
$ bin/kafka-configs.sh --zookeeper 172.21.0.9:2181 --alter --add-config 'SCRAM-SHA-256=[iterations=8192,password=writer-pwd],SCRAM-SHA-512=[password=writer-pwd]' --entity-type users --entity-name writer
Completed Updating config for entity: user-principal 'writer'.
创建reader用户,密码是reader-pwd:
$ bin/kafka-configs.sh --zookeeper 172.21.0.9:2181 --alter --add-config 'SCRAM-SHA-256=[password=reader-pwd],SCRAM-SHA-512=[password=reader-pwd]' --entity-type users --entity-name reader
Completed Updating config for entity: user-principal 'reader'.
创建admin用户,密码是admin:
$ bin/kafka-configs.sh --zookeeper 172.21.0.9:2181 --alter --add-config 'SCRAM-SHA-256=[password=admin],SCRAM-SHA-512=[password=admin]' --entity-type users --entity-name admin
Completed Updating config for entity: user-principal 'admin'.
3个测试用户都创建好了,下面我们使用kafka-configs.sh查看一下writer用户的信息:
$ bin/kafka-configs.sh --zookeeper 172.21.0.9:2181 --describe --entity-type users --entity-name writer
Configs for user-principal 'writer' are SCRAM-SHA-512=salt=dTlvNzl4Y3BvZ3BuMmx5ODY0aWlzN2RsZg==,stored_key=Yc02SwxDkAKDQH01W98bkJLJcVO24q9vR5tS0nWaq5Jg2Z7DtzwrOt6J2Cr8Oib+dHq7TUIeG+NLiCAMnRlfVg==,server_key=Tu+iiosvJrDemOvjaDdzrh2GhLRg6r9zoTRDdvXZCMA7n7+D8DYsUz6Gnugcczsnz5Ut/jkkklEOXYRXIqOLCg==,iterations=4096,SCRAM-SHA-256=salt=Y2dpcnB4aTU5NWNwMDZjNmFvbHluMWJpOQ==,stored_key=GGMhtO1PhxZFpEHOaDiqA4AM16Ma19nky1UV/gFoC1s=,server_key=L0R1xkcULaWcGMu6TdtWi5mf5lu1VTS8imWvKPlM3i4=,iterations=8192
里面包含了writer用户加密算法SCRAM-SHA-256以及SCRAM-SHA-512对应的盐值(salt)、ServerKey和StoreKey等,总之都是S