基于 SASL/SCRAM 讓 Kafka 實(shí)現(xiàn)動(dòng)態(tài)授權(quán)認(rèn)證

一狼纬、說(shuō)明

在大數(shù)據(jù)處理和分析中 Apache Kafka 已經(jīng)成為了一個(gè)核心組件诞仓。然而在生產(chǎn)環(huán)境中部署 Kafka 時(shí)凰慈,安全性是一個(gè)必須要考慮的重要因素。SASL(簡(jiǎn)單認(rèn)證與安全層)和 SCRAM(基于密碼的認(rèn)證機(jī)制的鹽化挑戰(zhàn)響應(yīng)認(rèn)證機(jī)制)提供了一種方法來(lái)增強(qiáng) Kafka 集群的安全性钳榨。

本文將從零開始部署 ZooKeeperKafka 并通過(guò)配置 SASL/SCRAMACL(訪問(wèn)控制列表)來(lái)增強(qiáng) Kafka 的安全性舰罚。

?

二、Kafka 的安全機(jī)制

kafka 社區(qū)在 0.9.0.0 版本正式添加了安全特性薛耻,可以滿足各種安全性的要求营罢,包括:

  1. Kafka 與 ZooKeeper 之間的安全通信;
  2. Kafka 集群 ZooKeeper 之間的安全通信;
  3. 客戶端與服務(wù)端之間的安全通信饲漾;
  4. 消息級(jí)別的權(quán)限控制蝙搔,可以控制客戶端(生產(chǎn)者或消費(fèi)者)的讀寫操作權(quán)限。

?

認(rèn)證方式 引入版本 適用場(chǎng)景
SSL 0.9.0 SSL做信道加密比較多考传,SSL認(rèn)證不如SASL所以一般都會(huì)使用SSL來(lái)做通信加密吃型。
SASL/GSSAPI 0.9.9 主要是給 Kerberos 使用的。如果你的公司已經(jīng)做了 Kerberos 認(rèn)證(比如使用 Active Directory)僚楞,那么使用 GSSAPI 是最方便的了勤晚。因?yàn)槟悴恍枰~外地搭建 Kerberos,只要讓你們的 Kerberos 管理員給每個(gè) Broker 和要訪問(wèn) Kafka 集群的操作系統(tǒng)用戶申請(qǐng) principal 就好了泉褐。
SASL/PLAIN 0.10.2 簡(jiǎn)單的用戶名密碼認(rèn)證赐写,通常與SSL結(jié)合使用,對(duì)于小公司來(lái)說(shuō)膜赃,沒必要搭建公司級(jí)別的Kerberos挺邀,使用它就比較合適。
SASL/SCRAM 0.10.2 PLAIN的加強(qiáng)版本跳座,支持動(dòng)態(tài)的用戶增減端铛。
Deleation Token 1.1 Delegation Token 是在 1.1 版本引入的,它是一種輕量級(jí)的認(rèn)證機(jī)制疲眷,主要目的是補(bǔ)充現(xiàn)有的 SASL 或 SSL 認(rèn)證禾蚕。如果要使用 Delegation Token,你需要先配置好 SASL 認(rèn)證咪橙,然后再利用 Kafka 提供的 API 去獲取對(duì)應(yīng)的 Delegation Token夕膀。這樣 Broker 和客戶端在做認(rèn)證的時(shí)候虚倒,可以直接使用這個(gè) token美侦,不用每次都去 KDC 獲取對(duì)應(yīng)的 ticket(Kerberos 認(rèn)證)或傳輸 Keystore 文件(SSL 認(rèn)證)。
SASL/OAUTHBEARER 2.0 OAuth 2框架的集成魂奥。

?

三菠剩、環(huán)境和軟件準(zhǔn)備

Apache Kafka 官網(wǎng) 下載對(duì)應(yīng)版本的 Kafka 并解壓到你選擇的目錄。

確保已經(jīng)安裝 Java 才能運(yùn)行 Kafka耻煤,可以通過(guò)運(yùn)行 java -version 來(lái)檢查 Java 環(huán)境具壮。

?

四、部署 Zookeeper

使用 Kafka 內(nèi)置的 Zookeeper

4.1. 啟用 SASL 認(rèn)證

進(jìn)入 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)建了一個(gè) Server 節(jié)點(diǎn),其中

  • org.apache.zookeeper.server.auth.DigestLoginModule required 是認(rèn)證邏輯的處理類炮赦;
  • username怜跑、password 是zookeeper之間通訊的用戶名和密碼;
  • user_admin="admin" 的結(jié)構(gòu)是 user_[username]=[password] 定義 kafka-broker(zookeeper客戶端)連接到 zookeeper 時(shí)用的用戶名和密碼。

注意:Server 內(nèi)部最后一行的 ; 和 } 后的 ; 不能缺少性芬!

?

4.3. 修改啟動(dòng)文件

進(jìn)入 bin 目錄峡眶,修改 zookeeper-server-start.sh 文件;

export KAFKA_HEAP_OPTS= 配置項(xiàng)的參數(shù)后添加 JAAS 的配置:

export KAFKA_HEAP_OPTS="-Xmx512M -Xms512M -Djava.security.auth.login.config=../config/zk_jaas.conf"

?

4.4. 啟動(dòng) Zookeeper

執(zhí)行命令:./zookeeper-server-start.sh -daemon ../config/zookeeper.properties

-daemon 參數(shù)配置后臺(tái)運(yùn)行

?

4.5. 測(cè)試

可以從官網(wǎng) Apache ZooKeeper 下載對(duì)應(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 文件,在啟動(dòng)命令中增加 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ī)已經(jīng)啟動(dòng)好的 ZooKeeper

進(jìn)入 Kafka 的 log 目錄俊庇,查看內(nèi)置 zk 的日志 zookeeper.out 顯示以下內(nèi)容:

INFO adding SASL authorization for authorizationID: zkclient (org.apache.zookeeper.server.ZooKeeperServer)

代表 ZooKeeper 的 SASL 認(rèn)證已經(jīng)配置成功狮暑。

?

五、部署 Kafka

5.1. 配置 Kafka Broker

進(jìn)入 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)機(jī)制并指定實(shí)現(xiàn)類心例;
  • allow.everyone.if.no.acl.found 如果沒有找到ACL(訪問(wèn)控制列表)配置,是否允許任何操作鞋囊;這里設(shè)置為 false 指除了超級(jí)管理員止后,其他用戶必須配置 ACL 才能訪問(wèn)資源;
  • super.users 超級(jí)管理員溜腐,無(wú)需配置 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é)點(diǎn)之間通信用的賬號(hào)密碼歉糜;
  • KafkaServer 中的 user_test="test" 用于 Kafka 客戶端(producer,consumer)連接broker時(shí)望众,用該配置下user_[username]=[password]結(jié)構(gòu)配置的賬號(hào)密碼登錄匪补;
  • Client 用于 broker 和 zookeeper 之間的認(rèn)證,對(duì)應(yīng) zk_jaas.conf 中的 【user_zkclient="zkclient"】 配置烂翰;
  • user_admin="admin" 的結(jié)構(gòu)是 user_[username]=[password] 定義 kafka-broker(zookeeper客戶端)連接到 zookeeper 時(shí)用的用戶名和密碼夯缺。

?

5.3. 修改啟動(dòng)文件

進(jìn)入 bin 目錄,修改 kafka-server-start.sh 文件甘耿;

export KAFKA_HEAP_OPTS= 配置項(xiàng)的參數(shù)后添加 JAAS 的配置:

export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G -Djava.security.auth.login.config=../config/kafka_server_jaas.conf"

?

5.4. 創(chuàng)建 SCRAM 用戶

在啟動(dòng) Kafka 之前需要先創(chuàng)建好用戶踊兜,在 bin 目錄下執(zhí)行以下內(nèi)容:

分別創(chuàng)建 admin(超級(jí)管理員) 和 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 認(rèn)證的用戶信息是動(dòng)態(tài)創(chuàng)建存儲(chǔ)在 ZooKeeper 中, 由于上面的配置 kafka_server_jaas.conf 中 Broker 之間的通信是通過(guò) admin 用戶的佳恬,如果該用戶不存在會(huì) 啟動(dòng)報(bào)錯(cuò)捏境。

?

5.5. 啟動(dòng) Kafka

執(zhí)行命令:./kafka-server-start.sh -daemon ../config/server.properties

-daemon 參數(shù)配置后臺(tái)運(yùn)行

?

六、驗(yàn)證 SASL/SCRAM 鑒權(quán)

6.1. 客戶端認(rèn)證配置

6.1.1. 管理員配置

進(jìn)入 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";

配置認(rèn)證的類型以及登錄邏輯的處理類和用戶毁葱,使用超級(jí)管理員 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)者也使用超級(jí)管理員 admin 來(lái)發(fā)送消息。

6.1.3. 消費(fèi)者配置

修改 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";

消費(fèi)者使用 test 用戶來(lái)接收消息倾剿。

?

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 指定命令的認(rèn)證配置筷频,這里使用上面創(chuàng)建的 管理員配置

創(chuàng)建成功后可以通過(guò)以下命令查看存在的 topic 清單:

./kafka-topics.sh --bootstrap-server localhost:9092 --list --command-config ../config/cmd.properties

?

6.3. 創(chuàng)建消費(fèi)者

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í)行命令后會(huì)發(fā)現(xiàn)以下 報(bào)錯(cuò) 信息:

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 認(rèn)證失敗,由于消費(fèi)者的認(rèn)證使用的是 test 用戶,而該用戶還未配置任何 ACL 權(quán)限截驮。

6.3.2. 配置用戶 ACL 權(quán)限

Kafka 的 ACL (Access Control Lists) 允許你定義哪些用戶可以訪問(wèn)哪些主題笑陈,并且可以執(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

為 test 用戶在資源 topic[test] 下分配只讀權(quán)限

執(zhí)行成功坡锡,可以通過(guò)以下命令查看資源所分配的所有 ACL 清單:

./kafka-acls.sh --bootstrap-server localhost:9092 --topic test --list --command-config ../config/cmd.properties

重新創(chuàng)建消費(fèi)者:

./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --consumer.config ../config/consumer.properties

執(zhí)行成功后該 shell 窗口會(huì)一直阻塞等待消息蓬网。

?

6.4. 創(chuàng)建生產(chǎn)者

新開一個(gè) shell 窗口 在 bin 目錄下執(zhí)行以下命令:

./kafka-console-producer.sh --bootstrap-server localhost:9092 --topic test --producer.config ../config/producer.properties

由于生產(chǎn)者的認(rèn)證使用的是 admin 為 超級(jí)管理員 所以無(wú)需配置 ACL 權(quán)限。

執(zhí)行成功后會(huì)出現(xiàn) > 符號(hào)鹉勒,輸入內(nèi)容之后帆锋,切換到 消費(fèi)者 窗口就可以看到了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末禽额,一起剝皮案震驚了整個(gè)濱河市锯厢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌脯倒,老刑警劉巖实辑,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異藻丢,居然都是意外死亡剪撬,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門悠反,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)残黑,“玉大人,你說(shuō)我怎么就攤上這事斋否±嫠” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵如叼,是天一觀的道長(zhǎng)冰木。 經(jīng)常有香客問(wèn)我穷劈,道長(zhǎng)笼恰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任歇终,我火速辦了婚禮社证,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘评凝。我一直安慰自己追葡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著宜肉,像睡著了一般匀钧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上谬返,一...
    開封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天之斯,我揣著相機(jī)與錄音,去河邊找鬼遣铝。 笑死佑刷,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的酿炸。 我是一名探鬼主播瘫絮,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼填硕!你這毒婦竟也來(lái)了麦萤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤扁眯,失蹤者是張志新(化名)和其女友劉穎频鉴,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恋拍,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡垛孔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了施敢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片周荐。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖僵娃,靈堂內(nèi)的尸體忽然破棺而出概作,到底是詐尸還是另有隱情,我是刑警寧澤默怨,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布讯榕,位于F島的核電站,受9級(jí)特大地震影響匙睹,放射性物質(zhì)發(fā)生泄漏愚屁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一痕檬、第九天 我趴在偏房一處隱蔽的房頂上張望霎槐。 院中可真熱鬧,春花似錦梦谜、人聲如沸丘跌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)闭树。三九已至耸棒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間报辱,已是汗流浹背榆纽。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留捏肢,地道東北人奈籽。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像鸵赫,于是被迫代替她去往敵國(guó)和親衣屏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容