Kafka SCRAM和PLAIN實戰
- 2019 年 10 月 3 日
- 筆記
1.概述
目前Kafka ACL支援多種許可權認證,今天筆者給大家介紹一下SCRAM和PLAIN的許可權認證。驗證環境如下:
- JDK:1.8
- Kafka:2.3.0
- Kafka Eagle:1.3.8
2.內容
2.1 PLAIN認證
首先,在$KAFAK_HOME/config目錄新建一個文本文件,名為kafka_server_plain_jaas.conf,配置內容如下:
KafkaServer { org.apache.kafka.common.security.plain.PlainLoginModule required username="admin" password="admin-secret" user_admin="admin-secret" user_ke="ke"; };
接著,將腳本文件kafka-server-start.sh重命名為kafka-server-plain-start.sh,並修改最後一行的內容為:
# 添加鑒權文件 exec $base_dir/kafka-run-class.sh $EXTRA_ARGS -Djava.security.auth.login.config=$base_dir/../config/kafka_server_plain_jaas.conf kafka.Kafka "$@"
然後,複製server.properties文件並重命名為plain.properties,接著修改服務端配置文件plain.properties,內容如下:
# Protocol listeners=SASL_PLAINTEXT://127.0.0.1:9092 security.inter.broker.protocol=SASL_PLAINTEXT sasl.mechanism.inter.broker.protocol=PLAIN sasl.enabled.mechanisms=PLAIN # ACL allow.everyone.if.no.acl.found=false super.users=User:admin authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer
最後,創建客戶端用戶認證文件,kafka_client_plain_jaas.conf內容如下:
KafkaClient { org.apache.kafka.common.security.plain.PlainLoginModule required username="ke" password="ke"; };
2.2 啟動PLAIN認證集群
2.2.1 啟動Zookeeper
# Zookeeper的配置比較簡單,這裡不多做介紹 zkServer.sh start
2.2.2 啟動Kafka集群
# 進入到Kafka安裝bin目錄 ./kafka-server-plain-start.sh ../config/plain.properties &
2.2.3 創建Topic
./kafka-topics.sh --create --zookeeper 127.0.0.1:2181/plain --replication-factor 1 --partitions 3 --topic test_plain
2.2.4 添加讀寫許可權
# 添加讀許可權 ./kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=127.0.0.1:2181/plain --add --allow-principal User:ke --operation Read --topic test_plain # 添加寫許可權 ./kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=127.0.0.1:2181/plain --add --allow-principal User:ke --operation Write --topic test_plain # 添加消費者組許可權 ./kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=127.0.0.1:2181/plain --add --allow-principal User:ke --operation Read --group g_plain_test # 查看許可權列表 ./kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=127.0.0.1:2181/plain --list
2.2.5 執行結果
2.3 SCRAM認證
PLAIN認證有個問題,就是不能動態新增用戶,每次添加用戶後,需要重啟正在運行的Kafka集群才能生效。為此,在生產環境,這種認證方式不符合實際業務場景。而SCRAM不一樣,使用SCRAM認證,可以動態新增用戶,添加用戶後,可以不用重啟正在運行的Kafka集群即可進行鑒權。
新增kafka_server_scram_jaas.conf,配置內容如下:
KafkaServer { org.apache.kafka.common.security.scram.ScramLoginModule required username="admin" password="admin-secret"; };
接著,將腳本文件kafka-server-start.sh重命名為kafka-server-scram-start.sh,並修改最後一行的內容為:
# 添加鑒權文件 exec $base_dir/kafka-run-class.sh $EXTRA_ARGS -Djava.security.auth.login.config=$base_dir/../config/kafka_server_scram_jaas.conf kafka.Kafka "$@"
然後在$KAFKA_HOME/config目錄中,複製server.properties文件並重命名為scram.properties,接著修改服務端配置文件scram.properties,內容如下:
# Protocol listeners=SASL_PLAINTEXT://dn1: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
2.3.1 啟動Zookeeper
# Zookeeper的配置比較簡單,這裡不多做介紹 zkServer.sh start
2.3.2 添加管理員許可權和普通用戶
# 添加管理員
./kafka-configs.sh --zookeeper 127.0.0.1:2181/scram --alter --add-config 'SCRAM-SHA-256=[password=admin-secret],SCRAM-SHA-512=[password=admin-secret]' --entity-type users --entity-name admin
# 添加普通用戶(ke)
./kafka-configs.sh --zookeeper 127.0.0.1:2181/scram --alter --add-config 'SCRAM-SHA-256=[iterations=8192,password=ke],SCRAM-SHA-512=[password=ke]' --entity-type users --entity-name ke
2.3.3 啟動SCRAM認證集群
./kafka-server-scram-start.sh ../config/scram.properties &
2.3.4 創建Topic
./kafka-topics.sh --create --zookeeper 127.0.0.1:2181/scram --replication-factor 1 --partitions 3 --topic test_scram
2.3.5 添加許可權
# 添加讀許可權
./kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=127.0.0.1:2181/scram --add --allow-principal User:ke --operation Read --topic test_scram
# 添加寫許可權 ./kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=127.0.0.1:2181/scram --add --allow-principal User:ke --operation Write --topic test_scram
# 添加消費者組許可權 ./kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=127.0.0.1:2181/scram --add --allow-principal User:ke --operation Read --group g_scram_test
# 查看許可權列表 ./kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=127.0.0.1:2181/scram --list
2.3.6 執行結果
3.Kafka許可權級別
Kafka許可權級別包含Topic、Group、Cluster、TransactionalId,每個維度涉及的許可權內容如下:
Resource | Operations |
Topic | Read,Write,Describe,Delete,DescribeConfigs,AlterConfigs,All |
Group | Read,Describe,All |
Cluster | Create,ClusterAction,DescribeConfigs,AlterConfigs,IdempotentWrite,Alter,Describe,All |
TransactionalId | Describe,Write,All |
例如,統計Topic的Capacity大小時,如果拋出異常“Cluster authorization failed”,這是由於沒有開啟Cluster級別的Describe許可權,執行如下命令即可:
./kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=127.0.0.1:2181/scram --add --allow-principal User:ke --operation Describe --cluster
4.Kafka Eagle集成SCRAM認證
那麼如何使用Kafka Eagle來集成有SCRAM認證的Kafka集群,進行監控呢?訪問http://www.kafka-eagle.org/,下載安裝包,解壓並配置如下內容:
# 這裡對啟動一個擁有SCRAM認證的Kafka集群(別名為cluster1)進行配置 cluster1.kafka.eagle.sasl.enable=true cluster1.kafka.eagle.sasl.protocol=SASL_PLAINTEXT cluster1.kafka.eagle.sasl.mechanism=SCRAM-SHA-256 cluster1.kafka.eagle.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username="ke" password="ke"; # 這裡ClientId如果不需要,可以不用配置 cluster1.kafka.eagle.sasl.client.id=
然後,執行ke.sh start進行啟動Kafka Eagle監控系統。
4.1 Topic預覽
4.2 使用KSQL查詢Topic
執行如下SQL語句,程式碼如下:
select * from "test_scram" where "partition" in (0) limit 1
執行結果如下:
5.總結
生產環境中,用戶可能隨著業務需要,增加或者刪除,此時動態控制用戶時很有必要的。而且,生產環境Kafka集群不可能隨隨便便重啟,因此採用SCRAM來進行Kafka鑒權非常適合。
6.結束語
這篇部落格就和大家分享到這裡,如果大家在研究學習的過程當中有什麼問題,可以加群進行討論或發送郵件給我,我會盡我所能為您解答,與君共勉!
另外,部落客出書了《Kafka並不難學》和《Hadoop大數據挖掘從入門到進階實戰》,喜歡的朋友或同學, 可以在公告欄那裡點擊購買鏈接購買部落客的書進行學習,在此感謝大家的支援。關注下面公眾號,根據提示,可免費獲取書籍的教學影片。