kafka的訪問控制

語言: CN / TW / HK

【概述】


通常情況下,Kafka部署後都是自己的業務進行生產消費,但也有一些情況,比如通過kafka和第三方對接,甚至是多個三方對接;或者是多使用者使用同一套kafka叢集,各自使用不同的topic。在這種場景下,一般不希望不同的使用者能訪問彼此的資料,因此需要進行許可權控制,這就會用到Kafka中的ACL。

Kafka中的ACL定義為:來自指定主機(Host)的指定使用者(User)對任意資源(Resource)的操作(Operation)是否符合指定的資源模式(ResourcePattern)預設情況下是不開啟的,通過在配置檔案中增加如下配置項,則啟用了kafka的ACL機制

authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer

kafka中的ACL模組是以外掛化的形式存在的,除了自帶預設的實現外,可以較容易的引入外部外掛實現許可權控制,例如ranger、santry。

【kafka中的資源與對應操作】


上面提到了ACL定義本質上是對指定資源的指定操作的訪問控制,在kafka中的資源包括主題(Topic)、消費者組(ConsumerGroup)、叢集(Cluster)、事務(ClusterID)以及委派token(DelegationToken)。對我們而言,最常用的則是主題、消費者組和叢集

對於topic涉及的操作包括:

操作  描述
Write 向topic傳送訊息
Read 從topic消費訊息
Create 建立topic
Delete 刪除topic
Describe 獲取topic的描述資訊,例如分割槽資訊,分割槽leader資訊等(生產/消費都需要該訊息)
DescribeConfigs 獲取topic的配置資訊(常用於kafkaAdmin)
Alter 改變topic的描述資訊(例如建立新分割槽)
AlterConfigs 修改topic的配置資訊

對於消費者組涉及的操作包括:

操作 描述
Read 加入、離開、同步消費者組,提交偏移等
Describe 查詢消費者組的情況,例如檢視有哪些消費者組,消費者組的偏移位置等
Delete 刪除消費者組

對於叢集涉及的操作包括:

操作 描述
ClusterAction follow從leader獲取分割槽資訊、副本同步、叢集關閉等操作需要該許可權
IdempotentWrite 冪等傳送
Create (自動)建立topic操作需要改許可權
Describe 涉及羅列消費者組等操作
Alter (kafkaAdmin)建立、刪除ACL
AlterConfigs 修改配置項的值

注:kafka自身需要有對cluster的各種訪問許可權,尤其是ClusterAction,這個涉及分割槽leader選舉、ISR同步等等操作,可以理解為生產消費的基礎,否則即便給使用者配置了read、write、describe許可權,仍舊是無法正常生產消費的。

【ACL的增刪查改】


知道了kafka中的資源以及對應的操作後,剩下的就是對ACL的增刪查了。這些操作都是通過"kafka-acls.sh"指令碼來完成的,命令使用方式為:

kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --add --allow-principal User:xxx --alow-host xxx --operation xxx --topic/cluster/group/delegation-token/transactional-id
# --authorizer-properties 為必填項, 後面的值以K=V形式體現, 當前僅能配置zookeeper.connect指定zk的地址
# --add 新增acl 或者 --remove 刪除acl 或者 --list 羅列acl
# --allow-principal 指定使用者, 使用者格式為User:xxx, 其中xxx為具體的使用者名稱
# --allow-host 指定主機地址
# --operation 指定操作
# --topic 指定topic
# --cluster 指定叢集
# --group 指定消費者組

例如,新增允許使用者hncscwc(不限定主機)在名為bigdata的topic上進行生產的命令為:

kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --add --allow-principal User:hncscwc --operation Write --operation Describe --topic bigdata

效果如下所示:

進行訊息生產的驗證:
同樣,如果需要允許該使用者在指定topic上進行消費,除了需要為topic資源配置ACL以外,還需要為group配置資源。kafka為了簡化操作,在kafka-acls.sh指令碼中提供了"--consumer"引數,通過該引數會自動對topic與group進行配置,同樣還包括"--producer"引數。

注1:使用"--consumer",需要同時通過"--topic"、"--group"分別指定主題和消費者組

注2:萬用字元*需要加''

預設情況下,不在指定ACL的非超級使用者的操作都是沒有許可權的,可以通過如下配置修改預設行為,即預設使其具有操作許可權。

allow.everyone.if.no.acl.found=true

另外,配置超級使用者的方式為:

super.users=User:xxx;User:xxx

【執行機制】


從上面的使用介紹中可以知道,kafka的acl使用還是相對比較簡單的,具體的實現邏輯如下圖所示:

首先通過"kafka-acls.sh"指令碼增加刪除ACL的操作,本質是與ACL進行互動,並將資訊寫入對應的znode中,也就是說kafka的acl資訊是儲存在zookeeper中的。

具體為指定根節點下,名為kafka-acl的znode,在這個下面分別儲存了Topic、Group、Cluster等資源的ACL資訊。

注:從這個流程可以看出,為什麼一定要指定"--authorizer-properties"引數。

其次,"kafka-acls.sh"指令碼向zookeeper寫入ACL資訊後,還會寫入另外一個znode資訊:"kafka-acl-changes",通過以版本號遞增的形式寫入改動的資源項

而kafka broker則watch該節點,以知曉acl的新增刪除等變更情況。一旦知道acl有變更,重新從zookeeper中讀取資源的acl資訊,並更新記憶體中的記錄資訊。此後,客戶端進行生產消費時則可以進行許可權校驗。

【總結】


小結一下,本文簡要概述了Kafka中的訪問控制,如何配置,如何增刪查ACL,以及背後的實現邏輯。而所有這一切的一個前提,也是本文沒有提到的:kafka需要開啟認證(通常是kerberos認證),這樣kafka才能正確感知客戶端的使用者資訊,也就才能正確地進行訪問控制。另外,在對資源進行配置時,還可以進行一些表示式的匹配來進行靈活控制,詳細可以檢視官網文件。

好了,這就是本文的全部內容,如果覺得本文對您有幫助,不要吝嗇點贊在看轉發,也歡迎加我微信交流~

本文分享自微信公眾號 - hncscwc(gh_383bc7486c1a)。
如有侵權,請聯絡 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。