Kafka SASL/SCRAM+ACL實現動態創建用戶及許可權控制
kafka系列文章
第一章 linux單機安裝kafka
第二章 kafka——集群安裝部署(自帶zookeeper)
第三章 Kafka SASL/SCRAM+ACL實現動態創建用戶及許可權控制
Kafka SASL/SCRAM+ACL實現動態創建用戶及許可權控制**
使用SASL / SCRAM進行身份驗證
請先在不配置任何身份驗證的情況下啟動Kafka
1. 創建SCRAM Credentials
Kafka中的SCRAM實現使用Zookeeper作為憑證(credential)存儲。 可以使用kafka-configs.sh在Zookeeper中創建憑據。 對於啟用的每個SCRAM機制,必須通過添加具有機制名稱的配置來創建憑證。 必須在啟動Kafka broker之前創建代理間通訊的憑據。 可以動態創建和更新客戶端憑證,並使用更新的憑證來驗證新連接。
1.創建broker建通訊用戶(或稱超級用戶)
bin/kafka-configs.sh --zookeeper 10.2.36.42:2181,10.2.36.149:2181,10.2.36.168:2181 --alter --add-config 'SCRAM-SHA-256=[password=admin-sec],SCRAM-SHA-512=[password=admin-sec]' --entity-type users --entity-name admin
2.創建客戶端用戶producer
bin/kafka-configs.sh --zookeeper 10.2.36.42:2181,10.2.36.149:2181,10.2.36.168:2181 --alter --add-config 'SCRAM-SHA-256=[iterations=8192,password=prod-sec],SCRAM-SHA-512=[password=prod-sec]' --entity-type users --entity-name producer
3.創建客戶端用戶consumer
bin/kafka-configs.sh --zookeeper 10.2.36.42:2181,10.2.36.149:2181,10.2.36.168:2181 --alter --add-config 'SCRAM-SHA-256=[iterations=8192,password=prod-sec],SCRAM-SHA-512=[password=cons-sec]' --entity-type users --entity-name consumer
4.查看SCRAM證書
[root@node002229 kafka]# bin/kafka-configs.sh --zookeeper 10.2.36.42:2181,10.2.36.149:2181,10.2.36.168:2181 --describe --entity-type users --entity-name producer
Configs for user-principal 'fanboshi' are SCRAM-SHA-512=salt=MWwwdWJqcjBncmUwdzY1Mzdoa2NwNXppd3A=,stored_key=mGCJy5k3LrE2gs6Dp4ALRhgy37l1WYPUIdoOncCF+B3Ti3wL2sQNmzg8oEz3tUs9DFsclFCygjbysb0S0BU9bA==,server_key=iTyX0U0Jt02dkddUm6QrVwNf3lJk72dBNs9EDHTqe8kLlNGIp9ypzRkcgkc+WVMd1bkAF3cg8vk9Q1LrJ/2i/A==,iterations=4096,SCRAM-SHA-256=salt=ZDg5MHVlYW40dW9jbXJ6MndvZDVlazd3ag==,stored_key=cgX1ldpXnDL1+TlLHJ3IHn7tAQS/7pQ7BVZUtECpQ3A=,server_key=i7Mcnb5sPUqfIFs6qKWWHZ2ortoKiRc7oabHOV5dawI=,iterations=8192
5.刪除SCRAM證書
[root@node002229 kafka]# bin/kafka-configs.sh --zookeeper 10.2.36.42:2181,10.2.36.149:2181,10.2.36.168:2181 --alter --delete-config 'SCRAM-SHA-512' --entity-type users --entity-name producer
2. 配置Kafka Brokers
1.在每個Kafka broker的config目錄中添加一個類似下面的JAAS文件,我們稱之為kafka_server_jaas.conf:
[root@node002229 config]# cat kafka_server_jaas.conf
KafkaServer {
org.apache.kafka.common.security.scram.ScramLoginModule required
username="admin"
password="admin-secret";
};
註:不要少寫了分號
2.將JAAS配置文件位置作為JVM參數傳遞給每個Kafka broker:
修改 /usr/local/kafka/bin/kafka-server-start.sh
將exec $base_dir/kafka-run-class.sh $EXTRA_ARGS kafka.Kafka "$@" 注釋, 增加下面的內容
#exec $base_dir/kafka-run-class.sh $EXTRA_ARGS kafka.Kafka "$@"
exec $base_dir/kafka-run-class.sh $EXTRA_ARGS -Djava.security.auth.login.config=$base_dir/../config/kafka_server_jaas.conf kafka.Kafka "$@"
或者不修改kafka-server-start.sh腳本, 而是將下面的內容添加到~/.bashrc
export KAFKA_PLAIN_PARAMS="-Djava.security.auth.login.config=/usr/local/kafka/config/kafka_server_jaas.conf"
export KAFKA_OPTS="$KAFKA_PLAIN_PARAMS $KAFKA_OPTS"
註:未嘗試過,有興趣的老鐵可以試試
3.如此處所述,在server.properties中配置SASL埠和SASL機制。 例如:
# 認證配置
hostname=ip地址
listeners=SASL_PLAINTEXT://ip地址: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=true
super.users=User:admin
authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer
在官方文檔中寫的是
listeners=SASL_SSL://host.name:port
security.inter.broker.protocol=SASL_SSL
我們可以根據自己的需求選擇SSL或PLAINTEXT, 我這裡選擇PLAINTEXT不加密明文傳輸, 省事, 性能也相對好一些。
3.重啟ZK/Kafka
到這一步整個kafka集群已經啟動了SASL/SCRAM身份認證及許可權控制功能。
4.客戶端配置
1.修改 config/consumer.properties文件,增加
[root@node002229 kafka]# vim config/consumer.properties
security.protocol=SASL_PLAINTEXT
sasl.mechanism=SCRAM-SHA-256
2.修改 config/producer.properties文件,增加
[root@node002229 kafka]# vim config/producer.properties
security.protocol=SASL_PLAINTEXT
sasl.mechanism=SCRAM-SHA-256
3.創建config/kafka_client_producer_jaas.conf文件用於設置生產者客戶端的用戶名及密碼
[root@node002229 kafka]# vim config/kafka_client_producer_jaas.conf
KafkaClient {
org.apache.kafka.common.security.scram.ScramLoginModule required
username="producer"
password="prod-sec"
};
4.修改kafka-console-producer.sh腳本
vim bin/kafka-console-producer.sh
#exec $(dirname $0)/kafka-run-class.sh kafka.tools.ConsoleProducer "$@"
exec $(dirname $0)/kafka-run-class.sh -Djava.security.auth.login.config=$(dirname $0)/../config/kafka_client_producer_jaas.conf kafka.tools.ConsoleProducer "$@"
註:文件路徑也可使用絕對路徑
5.創建config/kafka_client_consumer_jaas.conf文件用於設置消費者客戶端的用戶名及密碼
[root@node002229 kafka]# vim config/kafka_client_consumer_jaas.conf
KafkaClient {
org.apache.kafka.common.security.scram.ScramLoginModule required
username="consumer"
password="cons-sec"
};
6.修改kafka-console-consumer.sh腳本
vim bin/kafka-console-consumer.sh
#exec $(dirname $0)/kafka-run-class.sh kafka.tools.ConsoleProducer "$@"
exec $(dirname $0)/kafka-run-class.sh -Djava.security.auth.login.config=$(dirname $0)/../config/kafka_client_consumer_jaas.conf kafka.tools.ConsoleProducer "$@"
註:文件路徑也可使用絕對路徑
7.創建測試topic
bin/kafka-topics.sh -create --zookeeper 10.2.36.42:2181,10.2.36.149:2181,10.2.36.168:2181 -replication-factor 3 --partitions 3 --topic test
8.測試生產消息
bin/kafka-console-producer.sh --bootstrap-server 10.2.36.42:9092,10.2.36.149:9092,10.2.36.168:9092 --topic test --producer.config config/producer.properties
註:需給用戶授權才可進行發布消息
9.測試消費消息
bin/kafka-console-consumer.sh --bootstrap-server 10.2.36.42:9092,10.2.36.149:9092,10.2.36.168:9092 --topic test --from-beginning --consumer.config config/consumer.properties
註:需給用戶授權才可消費消息
ACL配置
1.授予producer用戶對test topic 寫許可權, 只允許 192.168.2.* 網段
bin/kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=10.2.36.42:2181,10.2.36.149:2181,10.2.36.168:2181 --add --allow-principal User:producer --operation Write --topic test --allow-host 192.168.2.*
註:網段限制可以不加
授予consumer用戶對test topic 讀許可權, 只允許 192.168.2.* 網段
bin/kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=10.2.36.42:2181,10.2.36.149:2181,10.2.36.168:2181 --add --allow-principal User:consumer--operation Read --topic test --allow-host 192.168.2.*
授予consumer用戶, consumer-group 消費者組 對test topic 讀許可權, 只允許 192.168.2.* 網段
bin/kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=10.2.36.42:2181,10.2.36.149:2181,10.2.36.168:2181 --add --allow-principal User:consumer--operation Read --group consumer-group --allow-host 192.168.2.*
查看acl配置
[root@node002229 kafka]# bin/kafka-acls.sh --list --authorizer-properties zookeeper.connect=10.2.36.42:2181,10.2.36.149:2181,10.2.36.168:2181
Current ACLs for resource `ResourcePattern(resourceType=TOPIC, name=test1, patternType=LITERAL)`:
(principal=User:producer, host=*, operation=WRITE, permissionType=ALLOW)
Current ACLs for resource `ResourcePattern(resourceType=GROUP, name=consumer-group, patternType=LITERAL)`:
(principal=User:consumer, host=*, operation=READ, permissionType=ALLOW)
(principal=User:abcconsumer, host=*, operation=READ, permissionType=ALLOW)
Current ACLs for resource `ResourcePattern(resourceType=TOPIC, name=10000082, patternType=LITERAL)`:
(principal=User:producer, host=*, operation=WRITE, permissionType=ALLOW)
(principal=User:abcconsumer, host=*, operation=READ, permissionType=ALLOW)
Current ACLs for resource `ResourcePattern(resourceType=TOPIC, name=test, patternType=LITERAL)`:
(principal=User:producer, host=*, operation=WRITE, permissionType=ALLOW)
(principal=User:consumer, host=*, operation=READ, permissionType=ALLOW)
刪除配置
bin/kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.c
(完)
---------------------------------歡迎留言--------------------------------------------
---------------------如果對你有幫助,請點個贊---------------------------------
文檔資訊
版權聲明:自由轉載-非商用-非衍生-保持署名(創意共享3.0許可證)
發表日期: 2021年2月5日

