日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Kafka 认证三:添加 Kerberos 认证详细流程

發布時間:2024/1/18 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Kafka 认证三:添加 Kerberos 认证详细流程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

背景

上一章節介紹了 Kerberos 服務端和客戶端的部署過程,本章節繼續介紹 Kafka 添加 Kerberos 認證的部署流程,及 Java API 操作的注意事項。

sasl.kerberos.service.name 配置的含義

Kafka 添加 Kerberos 部署的核心是 Kafka 服務端的 Principal 配置,它的 primary 部分必須配置在 properties 文件的 sasl.kerberos.service.name 屬性中,而主機名部分必須保證 Kafka IP 的域名在 /etc/hosts 文件中存在。

對 Kafka 客戶端來說,合起來就是,sasl.kerberos.service.name 的值/Kafka IP 或者 Kafka IP 對應的主機名稱@Realm 這三項拼接的成目標服務的 Principal,必須保證它在 KDC 數據庫中。

搜了好久都沒有看到這個配置項的解釋,反復操作后終于理解了這個屬性的含義。

例如,請求目標 Kafka IP 是 192.168.xx.1 ,Kafka 客戶端發起 Kerberos 認證時,向 KDC 發送 AS_REQ,目標服務的 Principal 的計算過程如下:

1)如果 /etc/hosts 文件中存在目標主機的域名,那么請求服務的 Principal 就是
sasl.kerberos.service.name/主機名稱@Realm 。

2) 如果 /etc/hosts 文件中不存在目標主機的域名,那么請求服務的 Principal 就是
sasl.kerberos.service.name/目標IP@Realm 。

從 KDC 的日志看到這個結果:

例如,我這個請求過程,Client 端主機配置了目標 Kafka IP 的的域名為 oracle ,這里Kerberos 票據認證過程就是這個。

結論就是, 針對客戶端和服務端,這兩個配置的含義分別是:

1、Kafka 客戶端最重要的 sasl.kerberos.service.name + 目標 IP 的域名必須存在 KDC 認證數據庫中。

2、Kafka 服務端 sasl.kerberos.service.name + 本機域名,必須是 jaas.config 文件中的 KafkaServer 的 principal 的值。

主機域名準備

Kerberos 的 Principals 組成規則是:

username/fully.qualified.domain.name@YOUR_REALM.COM

作為服務端一般都是需要配置域名的,最好是客戶端和服務端都配置服務器 IP 的域名,且必須統一,才能保證 Kerberos 認證流程正確,否則很容易出現 Not found in Kerberos database 的問題。

對于Kafka 集群來說,集群主機的 Principal 的 username 相同,但是主機域名不同,客戶端維護集群節點的域名,sasl.kerberos.service.name 配置就是各節點的 username 。

Kafka Kerberos 認證環境搭建之前,必須先在客戶端和服務器端的 /etc/hosts 文件中配置 Kafka Server IP 的域名。網上很多搭建教程,都是 Kafka 客戶端和 Kafka 服務同主機,所以不會出現域名配置導致的問題。

角色IPPrincipal
Client192.168.10.101hello-kafka-client@MY_KDC.COM
Server192.168.10.102hello-kafka-server/oracle@MY_KDC.COM

這里 IP 隨便寫的,Kafka Client 的 IP 不需要配置域名,在 192.168.10.101 上維護目標服務器的域名,添加在 /etc/hosts 文件中,參考如下:

192.168.10.102 oracle

在 Kafka 客戶端主機上部署一份 kafka ,用于啟動消費者應用;服務端正常部署 Kafka ,且在 kafka 主目錄下創建一個 kerberos 文件夾,放 Kerberos 認證相關的配置文件。

KDC 注冊客戶端和服務端

第零步,拷貝 krb5.conf。

拷貝 KDC 認證中心的 krb5.conf 文件到全部的 Kerberos 客戶端,客戶端最重要的系統環境變量就是 krb5.conf 文件的路徑。所以,每個 KDC 的客戶端都需要維護與 KDC 服務器端一致的 krb5.conf 文件,拷貝命令為:

scp /etc/krb5.conf root@192.168.10.101:/opt/kafka-1.0.2/kerberos/krb5.confscp /etc/krb5.conf root@192.168.10.102:/opt/kafka-1.0.2/kerberos/krb5.conf

Java API 添加 Kerberos 認證的代碼為:

System.setProperty("java.security.krb5.conf", krb5Conf);

第一步,注冊 Kerberos 帳號。

需要到 Kerberos 數據庫中注冊 Kafka 的客戶端和服務端,按剛剛表里面的 Principal 注冊到默認域名 MY_KDC.COM 中。

在 Kerberos 服務器上,執行 kadmin.local 命令,輸入下面操作,注冊帳號:

addprinc hello-kafka-client addprinc hello-kafka-server/oracle

操作結果如下:

第二步,生成帳號的 keytab 文件。 對上面添加的兩個 Kerberos 帳號,導出 keytab 文件:

kadmin.local -q "xst -norandkey -k /root/hello-kafka-client.keytab hello-kafka-client@MY_KDC.COM"kadmin.local -q "xst -norandkey -k /root/hello-kafka-server.keytab hello-kafka-server/oracle@MY_KDC.COM"

利用控制臺命令 kadmin.local 導出 keytab 文件,客戶端 keytab :


服務端 keytab 如下:

第三步,傳輸 keytab 文件。 將帳號的 keytab 文件遠程傳輸到 Kafka 客戶端和服務端,就是前面的 101 和 102 兩臺主機上。

scp /root/hello-kafka-client.keytab root@192.168.10.101:/opt/kafka-1.0.2/kerberos/hello-kafka-client.keytabscp /root/hello-kafka-server.keytab root@192.168.10.102:/opt/kafka-1.0.2/kerberos/hello-kafka-server.keytab

Kafka 服務器部署 Kerberos

第一步,準備 server-kerberos.properties 文件。 拷貝 Kafka config 目錄下的 server.properties 文件,命名為 kerberos-server.properties ,編輯認證配置相關的內容:

listeners=SASL_PLAINTEXT://192.168.10.102:9092 advertised.listeners=SASL_PLAINTEXT://192.168.10.102:9092security.inter.broker.protocol=SASL_PLAINTEXT sasl.mechanism.inter.broker.protocol=GSSAPI sasl.enabled.mechanisms=GSSAPI sasl.kerberos.service.name=hello-kafka-server

主要就是上面的幾項配置, sasl.kerberos.service.name=hello-kafka-server 就是當前 Kafka 的 keytab 文件中的 Principal 的 username 部分。

第二步,準備 server-jaas.conf 配置文件。 kerberos 目錄下,創建文件 kafka-server-jaas.conf,編輯內容如下:

KafkaServer {com.sun.security.auth.module.Krb5LoginModule requireduseKeyTab=true//不同的主機,需修改成不同的keytab文件keyTab="/opt/kafka-1.0.2/kerberos/hello-kafka-server.keytab"storeKey=trueuseTicketCache=false// Kafka Server 在 KDC 中的用戶名全稱principal="hello-kafka-server/oracle@MY_KDC.COM"; };

第三步,準備 kafka-server-kerberos-start.sh 文件,添加 Kerberos 認證配置。 拷貝 bin/kafka-server-start.sh 腳本,命名為 kafka-server-kerberos-start.sh,編輯最后一行,在最后一行代碼之前,添加 Krb5 環境變量和 jaas.conf 配置信息:

export KAFKA_OPTS="-Dzookeeper.sasl.client=false -Dzookeeper.sasl.client.username=zk-server -Djava.security.krb5.conf=/opt/kafka-1.0.2/kerberos/krb5.conf -Djava.security.auth.login.config=/opt/kafka-1.0.2/kerberos/kafka-server-jaas.conf"

第四步,啟動 Kafka 服務。 用新建的腳本 kafka-server-kerberos-start.sh 和 配置 kerberos-server.properties 啟動 Kafka :

bin/kafka-server-start-kerberos.sh -daemon kerberos/kerberos-server.properties

Kafka 客戶端部署 Kerberos

第一步,準備 client-kerberos.properties 文件。 拷貝 Kafka config 目錄下的 consumer.properties 文件,命名為 client-kerberos.properties ,編輯認證配置相關的內容:

bootstrap.servers=192.168.10.102:9092 group.id=test-consumer-group001 curity.protocol=SASL_PLAINTEXT sasl.mechanism=GSSAPI sasl.kerberos.service.name=hello-kafka-server

第二步,準備 client-jaas.conf 配置文件。 kerberos 目錄下,創建文件 kafka-client-jaas.conf,編輯內容如下:

KafkaClient {com.sun.security.auth.module.Krb5LoginModule requireduseKeyTab=true//不同的主機,需修改成不同的keytab文件keyTab="/opt/kafka-1.0.2/kerberos/hello-kafka-client.keytab"storeKey=trueuseTicketCache=false// Client 在KDC中的帳號principal="hello-kafka-client@MY_KDC.COM"; };

第三步,準備 kafka-server-kerberos-start.sh 文件,添加 Kerberos 認證配置。 拷貝 bin/kafka-console-consumer.sh 腳本,命名為 kerberos-kafka-console-consumer.sh,編輯最后一行,在最后一行代碼之前,添加 Krb5 環境變量和 jaas.conf 配置信息:

export KAFKA_OPTS="-Djava.security.krb5.conf=/opt/kafka-1.0.2/kerberos/krb5.conf -Djava.security.auth.login.config=/opt/kafka-1.0.2/kerberos/kafka-client-jaas.conf"

第四步,用第一步的配置文件,進行帶認證的消費:

bin/kerberos-kafka-console-consumer.sh --bootstrap-server 192.168.10.102:9092 --topic my-topic --consumer.config=kerberos/client-kerberos.properties --from-beginning

KDC 日志查看認證過程

KDC 服務中心的日志文件是 /var/log/krb5kdc.log ,每次 Kerberos 認證都對應兩條日志信息:


如果 Kafka 服務啟動或者客戶端啟動失敗,也可以查看該日志文件,常見的錯誤就是主機和域名、服務名稱配置不一致,導致 Server not found in Kerberos database 異常。

另外,多域名問題,還沒有找到解決辦法。如果一個客戶端的 krb5.conf 文件中配置多個 Realm ,默認只能有一個 Realm ,但是對于需要同時訪問多個 Kafka 、多套認證 Realm 的應用來說,到底該怎么配置呢?

啟示錄

官方 Kerberos 資料,沒有耐心看下去,網絡上搜到的,照貓畫虎實踐下來,其實也能部署下來的,關鍵是 kerberos.service.name 這個屬性,想了兩天才想明白,還有主機域名配置等基礎支持等,零零碎碎,以此留存網絡筆記。

總結

以上是生活随笔為你收集整理的Kafka 认证三:添加 Kerberos 认证详细流程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。