SASL/SCRAM验证方法可以在Kafka服务启动之后,动态的新增用户分并配权限,在业务变动频繁,开发人员多的情况下比SASL/PLAIN方法更加灵活。
Zookeeper:3.4.13,kafka依赖zookeeper,
Kafka:kafka_2.12-2.8.1
ZooInspector:zookeeper客户端查看工具
安装根目录:/app/kafka/
Zookeeper下载地址:Apache ZooKeeper
Kafka下载地址:Apache Kafka
1.安装zookeeper
1.1.上传到目录并解压
-- 进入zookeeper安装目录
cd /app/kafka
-- 选择zookeeper压缩包上传
rz
-- 解压文件
tar -zxvf zookeeper-3.4.13.tar.gz
-- 重命名
mv zookeeper-3.4.13 zookeeper
1.2.修改配置
-- 进入配置文件根目录
cd /app/kafka/zookeeper/conf
-- 复制配置文件
cp zoo_sample.cfg zoo.cfg
-- 修改配置文件zoo.cfg
vi zoo.cfg
-- 配置2个配置项
dataDir=/app/kafka/zookeeper/data
dataLogDir=/app/kafka/zookeeper/logs
1.3.服务脚本
-- 进入zookeeper的bin目录
cd /app/kafka/zookeeper/bin
-- 启动服务,指定配置文件
./zkServer.sh start ../conf/zoo.cfg
-- 停止服务
./zkServer.sh stop
-- 查看状态
./zkServer.sh status
-- 启动客户端
./zkCli.sh
-- 查看zookeeper中的所有topic主题
ls /brokers/topics/
-- 删除test-topic主题
delete /brokers/topics/test-topic
2.安装kafka
2.1.上传到目录并解压
-- 进入kafka安装目录
cd /app/kafka
-- 选择kafka压缩包上传
rz
-- 解压文件
tar -zxvf kafka_2.12-2.8.1.tgz
-- 重命名
mv kafka_2.12-2.8.1 kafka
2.2.修改配置
-- 进入配置文件根目录
cd /app/kafka/kafka/config
-- 修改配置文件
vi server.properties
broker.id=0 # broker.id属性在kafka集群中必须要是唯一
listeners=PLAINTEXT://localhost:9092 # kafka部署的ip和端口号
log.dir=/kafka/kafka-logs # kafka的消息存储文件
zookeeper.connect=localhost:2181 # kafka连接zookeeper服务的地址
2.3.服务脚本
-- 进入kafka的bin目录
cd /app/kafka/kafka/bin
-- 非后台启动脚本
./kafka-server-start.sh ../config/server.properties
-- 后台启动脚本
./kafka-server-start.sh -daemon ../config/server.properties 1>> kafka-server.log 2>> kafka-server.log &
-- 停止服务
./kafka-server-stop.sh
-- 创建test_topic主题
./kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 11 --topic test_topic
-- 扩容分区
./kafka-topics.sh -alter --partitions 20 --zookeeper localhost:2181 --topic test_topic
-- 查看主题列表
./kafka-topics.sh --list --zookeeper localhost:2181
-- 查看test_topic情况
./kafka-topics.sh --describe --zookeeper localhost:2181 --topic test_topic
-- 删除test_topic主题
./kafka-topics.sh --delete --topic test_topic --zookeeper localhost:2181
-- 给test_topic主题生产消息
./kafka-console-producer.sh --broker-list localhost:9092 --topic test_topic
-- 从test_topic主题消费消息
./kafka-console-consumer.sh --bootstrap-server localhost:9092 --from-beginning --topic test_topic
3.配置SASL/SCRAM动态认证
SASL/SCRAM认证是把凭证(credential)存储在Zookeeper,使用kafka-configs.sh在Zookeeper中创建凭据。对于每个SCRAM机制,必须添加具有机制名称的配置来创建凭证,在启动Kafka broker之前创建代理间通信的凭据。所以第一步,在没有设置任何权限的配置下启动Kafka和Zookeeper。
3.1.SCRAM用户证书配置
-- 进入kafka的bin目录
cd /app/kafka/kafka/bin
-- 创建broker通信用户:admin(在使用sasl之前必须先创建,否则启动报错)
./kafka-configs.sh --zookeeper localhost:2181 --alter --add-config 'SCRAM-SHA-256=[password=admin-sec]' --entity-type users --entity-name admin
-- 创建生产者证书
./kafka-configs.sh --zookeeper localhost:2181 --alter --add-config 'SCRAM-SHA-256=[password=producer-sec]' --entity-type users --entity-name producer
-- 创建消费者证书
./kafka-configs.sh --zookeeper localhost:2181 --alter --add-config 'SCRAM-SHA-256=[password=consumer-sec]' --entity-type users --entity-name consumer
-- 查看用户[producer]的SCRAM证书
./kafka-configs.sh --zookeeper localhost:2181 --describe --entity-type users --entity-name producer
-- 删除用户[producer]的SCRAM证书
./kafka-configs.sh --zookeeper localhost:2181 --alter --delete-config 'SCRAM-SHA-256' --entity-type users --entity-name producer
3.2.服务端配置
-- 进入kafka目录
cd /app/kafka/kafka
-- 创建JAAS配置文件
vi config/kafka-server-jaas.conf
-- 文件内容如下
KafkaServer {
org.apache.kafka.common.security.scram.ScramLoginModule required
username="admin"
password="admin-sec";
};
-- 创建sasl启动脚本
cp bin/kafka-server-start.sh bin/kafka-server-start-sasl.sh
-- 修改sasl启动脚本
vi bin/kafka-server-start-sasl.sh
-- 最后一行配置修改为如下
exec $base_dir/kafka-run-class.sh $EXTRA_ARGS -Djava.security.auth.login.config=/app/kafka/kafka/config/kafka-server-jaas.conf kafka.Kafka "$@"
-- 创建sasl服务属性配置
cp config/server.properties config/server-sasl.properties
-- 修改sasl服务属性配置
vi config/server-sasl.properties
-- 配置修改如下
# 认证配置
listeners=SASL_PLAINTEXT://localhost:9092
security.inter.broker.protocol=SASL_PLAINTEXT
sasl.mechanism.inter.broker.protocol=SCRAM-SHA-256
sasl.enabled.mechanisms=SCRAM-SHA-256
# ACL配置
allow.everyone.if.no.acl.found=false
super.users=User:admin
authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer
-- 重启Kafka和Zookeeper
cd /app/kafka/kafka/bin
./kafka-server-stop.sh
./kafka-server-start-sasl.sh ../config/server-sasl.properties
# 后台启动
./kafka-server-start-sasl.sh -daemon ../config/server-sasl.properties 1>> kafka-server-sasl.log 2>> kafka-server-sasl.log &
cd /app/kafka/zookeeper/bin
./zkServer.sh stop
./zkServer.sh start ../conf/zoo.cfg
3.3.客户端配置
-- 进入kafka目录
cd /app/kafka/kafka
-- 创建admin用户客户端JAAS配置文件
vi config/kafka-client-scram-admin-jaas.conf
-- 文件内容如下
KafkaServer {
org.apache.kafka.common.security.scram.ScramLoginModule required
username="admin"
password="admin-sec";
};
-- 创建producer用户客户端JAAS配置文件
vi config/kafka-client-scram-producer-jaas.conf
-- 文件内容如下
KafkaServer {
org.apache.kafka.common.security.scram.ScramLoginModule required
username="producer"
password="producer-sec";
};
-- 创建consumer用户客户端JAAS配置文件
vi config/kafka-client-scram-consumer-jaas.conf
-- 文件内容如下
KafkaServer {
org.apache.kafka.common.security.scram.ScramLoginModule required
username="consumer"
password="consumer-sec";
};
-- 创建生产者sasl启动脚本
cp bin/kafka-console-producer.sh bin/kafka-console-producer-sasl.sh
-- 修改生产者sasl启动脚本
vi bin/kafka-console-producer-sasl.sh
-- 配置修改为如下
exec $(dirname $0)/kafka-run-class.sh -Djava.security.auth.login.config=/app/kafka/kafka/config/kafka-client-scram-producer-jaas.conf
-- 创建消费者sasl启动脚本
cp bin/kafka-console-consumer.sh bin/kafka-console-consumer-sasl.sh
-- 修改消费者sasl启动脚本
vi bin/kafka-console-consumer-sasl.sh
-- 配置修改为如下
exec $(dirname $0)/kafka-run-class.sh -Djava.security.auth.login.config=/app/kafka/kafka/config/kafka-client-scram-consumer-jaas.conf
-- 修改属性配置consumer.properties和producer.properties,修改方式相同
vi consumer.properties
-- 修改配置如下
security.protocol=SASL_PLAINTEXT
sasl.mechanism=SCRAM-SHA-256
3.4.读写权限配置
-- 进入kafka的bin目录
cd /app/kafka/kafka/bin
-- 对生产者producer指定主题(test-topic)赋予写的权限
./kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=localhost:2181 --add --allow-principal User:producer --operation Write --topic test-topic
-- 对消费者consumer指定主题(test-topic)赋予读的权限
./kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=localhost:2181 --add --allow-principal User:consumer --operation Read --topic test-topic
-- 对消费者组(groupid='test-group')授权
./kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=localhost:2181 --add --allow-principal User:consumer --operation Read --group test-group
-- 查看权限
./kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=localhost:2181 --list
4.测试
4.1.Kafka自带客户端测试
-- 启动zookeeper服务(如未启动)
cd /app/kafka/zookeeper/bin
./zkServer.sh start zoo.cfg
-- 启动kafka服务(如未启动)
cd /app/kafka/kafka/bin
./kafka-server-start-sasl.sh -daemon ../config/server-sasl.properties 1>> kafka-server-sasl.log 2>> kafka-server-sasl.log &
-- 创建主题
./kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test-topic
-- 启动生产者
./kafka-console-producer.sh --broker-list localhost:9092 --topic test-topic
-- 启动消费者
./kafka-console-consumer.sh --bootstrap-server localhost:9092 --from-beginning --topic test-topic
-- 消息服务验证测试
#生产者窗口输入内容,消费者窗口能马上消费到
参考:
https://blog.youkuaiyun.com/qq_41688840/article/details/123031628
https://www.cnblogs.com/niun/articles/15504275.html
https://blog.youkuaiyun.com/qq_38616503/article/details/117529690
https://blog.youkuaiyun.com/weixin_30367543/article/details/98409382