基于 SASL/SCRAM 讓 Kafka 實現(xiàn)動態(tài)授權(quán)認證的方法
一、說明
在大數(shù)據(jù)處理和分析中 Apache Kafka
已經(jīng)成為了一個核心組件。然而在生產(chǎn)環(huán)境中部署 Kafka
時,安全性是一個必須要考慮的重要因素。SASL
(簡單認證與安全層)和 SCRAM
(基于密碼的認證機制的鹽化挑戰(zhàn)響應(yīng)認證機制)提供了一種方法來增強 Kafka
集群的安全性。
本文將從零開始部署 ZooKeeper
和 Kafka
并通過配置 SASL/SCRAM
和 ACL
(訪問控制列表)來增強 Kafka
的安全性。
二、Kafka 的安全機制
kafka 社區(qū)在 0.9.0.0
版本正式添加了安全特性,可以滿足各種安全性的要求,包括:
- Kafka 與 ZooKeeper 之間的安全通信;
- Kafka 集群 ZooKeeper 之間的安全通信;
- 客戶端與服務(wù)端之間的安全通信;
- 消息級別的權(quán)限控制,可以控制客戶端(生產(chǎn)者或消費者)的讀寫操作權(quán)限。
認證方式 | 引入版本 | 適用場景 |
---|---|---|
SSL | 0.9.0 | SSL做信道加密比較多,SSL認證不如SASL所以一般都會使用SSL來做通信加密。 |
SASL/GSSAPI | 0.9.9 | 主要是給 Kerberos 使用的。如果你的公司已經(jīng)做了 Kerberos 認證(比如使用 Active Directory),那么使用 GSSAPI 是最方便的了。因為你不需要額外地搭建 Kerberos,只要讓你們的 Kerberos 管理員給每個 Broker 和要訪問 Kafka 集群的操作系統(tǒng)用戶申請 principal 就好了。 |
SASL/PLAIN | 0.10.2 | 簡單的用戶名密碼認證,通常與SSL結(jié)合使用,對于小公司來說,沒必要搭建公司級別的Kerberos,使用它就比較合適。 |
SASL/SCRAM | 0.10.2 | PLAIN的加強版本,支持動態(tài)的用戶增減。 |
Deleation Token | 1.1 | Delegation Token 是在 1.1 版本引入的,它是一種輕量級的認證機制,主要目的是補充現(xiàn)有的 SASL 或 SSL 認證。如果要使用 Delegation Token,你需要先配置好 SASL 認證,然后再利用 Kafka 提供的 API 去獲取對應(yīng)的 Delegation Token。這樣 Broker 和客戶端在做認證的時候,可以直接使用這個 token,不用每次都去 KDC 獲取對應(yīng)的 ticket(Kerberos 認證)或傳輸 Keystore 文件(SSL 認證)。 |
SASL/OAUTHBEARER | 2.0 | OAuth 2框架的集成。 |
三、環(huán)境和軟件準備
從 Apache Kafka 官網(wǎng) 下載對應(yīng)版本的 Kafka 并解壓到你選擇的目錄。
確保已經(jīng)安裝 Java 才能運行 Kafka,可以通過運行
java -version
來檢查 Java 環(huán)境。
四、部署 Zookeeper
使用 Kafka 內(nèi)置的 Zookeeper
4.1. 啟用 SASL 認證
進入 config 目錄,修改 zookeeper.properties
配置文件增加以下內(nèi)容:
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider jaasLoginRenew=3600000 requireClientAuthScheme=sasl zookeeper.sasl.client=true
4.2. 配置 JAAS
在 config 目錄下創(chuàng)建 zk_jaas.conf
文件,內(nèi)容如下:
Server { org.apache.zookeeper.server.auth.DigestLoginModule required username="admin" password="admin" user_admin="admin" user_zkclient="zkclient"; };
其作用是創(chuàng)建了一個 Server 節(jié)點,其中
org.apache.zookeeper.server.auth.DigestLoginModule required
是認證邏輯的處理類;username、password
是zookeeper之間通訊的用戶名和密碼;user_admin="admin"
的結(jié)構(gòu)是 user_[username]=[password] 定義 kafka-broker(zookeeper客戶端)連接到 zookeeper 時用的用戶名和密碼。
注意:Server 內(nèi)部最后一行的
;
和 } 后的;
不能缺少!
4.3. 修改啟動文件
進入 bin 目錄,修改 zookeeper-server-start.sh
文件;
在 export KAFKA_HEAP_OPTS=
配置項的參數(shù)后添加 JAAS
的配置:
export KAFKA_HEAP_OPTS="-Xmx512M -Xms512M -Djava.security.auth.login.config=../config/zk_jaas.conf"
4.4. 啟動 Zookeeper
執(zhí)行命令:./zookeeper-server-start.sh -daemon ../config/zookeeper.properties
-daemon 參數(shù)配置后臺運行
4.5. 測試
可以從官網(wǎng) Apache ZooKeeper 下載對應(yīng)版本的 ZooKeeper 并解壓;
添加 JAAS
配置,在 confi 目錄下創(chuàng)建 zk_client_jaas.conf
文件:
Client{ org.apache.zookeeper.server.auth.DigestLoginModule required username="zkclient" password="zkclient"; };
修改 bin 目錄下的 zkCli.sh
文件,在啟動命令中增加 JAAS 的配置:
"$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" "-Dzookeeper.log.file=${ZOO_LOG_FILE}" \ -cp "$CLASSPATH" $CLIENT_JVMFLAGS $JVMFLAGS \ "-Djava.security.auth.login.config=../conf/zk_client_jaas.conf" \ org.apache.zookeeper.ZooKeeperMain "$@"
執(zhí)行 zkCli.sh
連接本機已經(jīng)啟動好的 ZooKeeper
進入 Kafka 的 log 目錄,查看內(nèi)置 zk 的日志 zookeeper.out
顯示以下內(nèi)容:
INFO adding SASL authorization for authorizationID: zkclient (org.apache.zookeeper.server.ZooKeeperServer)
代表 ZooKeeper 的 SASL 認證已經(jīng)配置成功。
五、部署 Kafka
5.1. 配置 Kafka Broker
進入 config 目錄,修改 server.properties
配置文件增加以下內(nèi)容:
listeners=SASL_PLAINTEXT://:9092 advertised.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 authorizer.class.name=kafka.security.authorizer.AclAuthorizer allow.everyone.if.no.acl.found=false super.users=User:admin
authorizer.class.name
開啟 ACL 授權(quán)機制并指定實現(xiàn)類;allow.everyone.if.no.acl.found
如果沒有找到ACL(訪問控制列表)配置,是否允許任何操作;這里設(shè)置為false
指除了超級管理員,其他用戶必須配置 ACL 才能訪問資源;super.users
超級管理員,無需配置 ACL 擁有所有權(quán)限的用戶。
5.2. 配置 JAAS
在 config 目錄下創(chuàng)建 kafka_server_jaas.conf
文件,內(nèi)容如下:
KafkaServer { org.apache.kafka.common.security.scram.ScramLoginModule required username="admin" password="admin"; }; Client{ org.apache.kafka.common.security.plain.PlainLoginModule required username="zkclient" password="zkclient"; };
KafkaServer
中的username,password
用于 Kafka 集群 Broker 節(jié)點之間通信用的賬號密碼;KafkaServer
中的user_test="test"
用于 Kafka 客戶端(producer,consumer)連接broker時,用該配置下user_[username]=[password]結(jié)構(gòu)配置的賬號密碼登錄;Client
用于 broker 和 zookeeper 之間的認證,對應(yīng) zk_jaas.conf 中的 【user_zkclient="zkclient"】 配置;user_admin="admin"
的結(jié)構(gòu)是 user_[username]=[password] 定義 kafka-broker(zookeeper客戶端)連接到 zookeeper 時用的用戶名和密碼。
5.3. 修改啟動文件
進入 bin 目錄,修改 kafka-server-start.sh
文件;
在 export KAFKA_HEAP_OPTS=
配置項的參數(shù)后添加 JAAS
的配置:
export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G -Djava.security.auth.login.config=../config/kafka_server_jaas.conf"
5.4. 創(chuàng)建 SCRAM 用戶
在啟動 Kafka 之前需要先創(chuàng)建好用戶,在 bin 目錄下執(zhí)行以下內(nèi)容:
分別創(chuàng)建
admin
(超級管理員) 和test
(客戶端用戶)
./kafka-configs.sh --zookeeper localhost:2181 --alter --add-config 'SCRAM-SHA-256=[password=admin]' --entity-type users --entity-name admin ./kafka-configs.sh --zookeeper localhost:2181 --alter --add-config 'SCRAM-SHA-256=[password=test]' --entity-type users --entity-name test
SASL/SCRAM
認證的用戶信息是動態(tài)創(chuàng)建存儲在 ZooKeeper 中, 由于上面的配置kafka_server_jaas.conf
中 Broker 之間的通信是通過admin
用戶的,如果該用戶不存在會 啟動報錯。
5.5. 啟動 Kafka
執(zhí)行命令:./kafka-server-start.sh -daemon ../config/server.properties
-daemon 參數(shù)配置后臺運行
六、驗證 SASL/SCRAM 鑒權(quán)
6.1. 客戶端認證配置
6.1.1. 管理員配置
進入 config 目錄創(chuàng)建 cmd.properties
內(nèi)容如下:
security.protocol=SASL_PLAINTEXT sasl.mechanism=SCRAM-SHA-256 sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username="admin" password="admin";
配置認證的類型以及登錄邏輯的處理類和用戶,使用超級管理員 admin
注意 最后的
;
是必須加上的。
6.1.2. 生產(chǎn)者配置
修改 config 目錄下的 producer.properties
增加以下內(nèi)容:
security.protocol=SASL_PLAINTEXT sasl.mechanism=SCRAM-SHA-256 sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username="admin" password="admin";
生產(chǎn)者也使用超級管理員 admin 來發(fā)送消息。
6.1.3. 消費者配置
修改 config 目錄下的 consumer.properties
增加以下內(nèi)容:
security.protocol=SASL_PLAINTEXT sasl.mechanism=SCRAM-SHA-256 sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username="test" password="test";
消費者使用 test 用戶來接收消息。
6.2. 創(chuàng)建topic
在 bin 目錄下執(zhí)行以下命令:
./kafka-topics.sh --bootstrap-server localhost:9092 --create --topic test --partitions 1 --replication-factor 1 --command-config ../config/cmd.properties
bootstrap-server
配置 Kafka 服務(wù)端的地址topic
指定topic名稱command-config
指定命令的認證配置,這里使用上面創(chuàng)建的 管理員配置
創(chuàng)建成功后可以通過以下命令查看存在的 topic 清單:
./kafka-topics.sh --bootstrap-server localhost:9092 --list --command-config ../config/cmd.properties
6.3. 創(chuàng)建消費者
6.3.1. 執(zhí)行 kafka-console-consumer
在 bin 目錄下執(zhí)行以下命令:
./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --consumer.config ../config/consumer.properties
執(zhí)行命令后會發(fā)現(xiàn)以下 報錯 信息:
ERROR Error processing message, terminating consumer process: (kafka.tools.ConsoleConsumer$) org.apache.kafka.common.errors.SaslAuthenticationException: Authentication failed during authentication due to invalid credentials with SASL mechanism SCRAM-SHA-256 Processed a total of 0 messages
Authentication failed 認證失敗,由于消費者的認證使用的是 test 用戶,而該用戶還未配置任何 ACL 權(quán)限。
6.3.2. 配置用戶 ACL 權(quán)限
Kafka 的 ACL (Access Control Lists) 允許你定義哪些用戶可以訪問哪些主題,并且可以執(zhí)行哪些操作(如讀、寫、創(chuàng)建、刪除等)。
執(zhí)行以下命令:
./kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --add --allow-principal User:test --operation Read --topic test --group test-consumer-group
BASH 復(fù)制 全屏
為 test 用戶在資源
topic[test]
下分配只讀權(quán)限
執(zhí)行成功,可以通過以下命令查看資源所分配的所有 ACL 清單:
./kafka-acls.sh --bootstrap-server localhost:9092 --topic test --list --command-config ../config/cmd.properties
重新創(chuàng)建消費者:
./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --consumer.config ../config/consumer.properties
執(zhí)行成功后該 shell 窗口會一直阻塞等待消息。
6.4. 創(chuàng)建生產(chǎn)者
新開一個 shell 窗口 在 bin 目錄下執(zhí)行以下命令:
./kafka-console-producer.sh --bootstrap-server localhost:9092 --topic test --producer.config ../config/producer.properties
由于生產(chǎn)者的認證使用的是 admin 為 超級管理員 所以無需配置 ACL 權(quán)限。
執(zhí)行成功后會出現(xiàn)
>
符號,輸入內(nèi)容之后,切換到 消費者 窗口就可以看到了。
到此這篇關(guān)于基于 SASL/SCRAM 讓 Kafka 實現(xiàn)動態(tài)授權(quán)認證的文章就介紹到這了,更多相關(guān)Kafka動態(tài)授權(quán)認證內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring?+?ECharts實現(xiàn)數(shù)據(jù)可視化的案例詳解
Apache?ECharts是一個基于?JavaScript?的開源可視化圖表庫,在網(wǎng)頁上實現(xiàn)數(shù)據(jù)的可視化,非常好用,本文將通過一個簡單的demo來給大家介紹一下Spring?+?ECharts如何數(shù)據(jù)可視化,需要的朋友可以參考下2023-07-07詳解JAVA中ListIterator和Iterator的辨析
這篇文章主要為大家詳細介紹了JAVAListIterator和Iterator的辨析,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-02-02SpringBoot?整合?EasyExcel?實現(xiàn)自由導(dǎo)入導(dǎo)出功能
在實際的業(yè)務(wù)系統(tǒng)開發(fā)過程中,操作 Excel 實現(xiàn)數(shù)據(jù)的導(dǎo)入導(dǎo)出基本上是個非常常見的需求,這篇文章主要介紹了SpringBoot?整合?EasyExcel?實現(xiàn)自由導(dǎo)入導(dǎo)出功能,需要的朋友可以參考下2024-06-06Java實現(xiàn)word/pdf轉(zhuǎn)html并在線預(yù)覽
這篇文章主要為大家詳細介紹了如何利用Java語言實現(xiàn)word、pdf文件轉(zhuǎn)html并在線預(yù)覽的功能,文中的示例代碼講解詳細,需要的可以參考一下2023-05-05springboot中spring.profiles.include的妙用分享
這篇文章主要介紹了springboot中spring.profiles.include的妙用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08Java ThreadLocal原理解析以及應(yīng)用場景分析案例詳解
這篇文章主要介紹了Java ThreadLocal原理解析以及應(yīng)用場景分析案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-09-09