Kafka 认证三:添加 Kerberos 认证详细流程
背景
上一章節(jié)介紹了 Kerberos 服務端和客戶端的部署過程,本章節(jié)繼續(xù)介紹 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 數(shù)據(jù)庫中。
搜了好久都沒有看到這個配置項的解釋,反復操作后終于理解了這個屬性的含義。
例如,請求目標 Kafka IP 是 192.168.xx.1 ,Kafka 客戶端發(fā)起 Kerberos 認證時,向 KDC 發(fā)送 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 票據(jù)認證過程就是這個。
結論就是, 針對客戶端和服務端,這兩個配置的含義分別是:
1、Kafka 客戶端最重要的 sasl.kerberos.service.name + 目標 IP 的域名必須存在 KDC 認證數(shù)據(jù)庫中。
2、Kafka 服務端 sasl.kerberos.service.name + 本機域名,必須是 jaas.config 文件中的 KafkaServer 的 principal 的值。
主機域名準備
Kerberos 的 Principals 組成規(guī)則是:
username/fully.qualified.domain.name@YOUR_REALM.COM
作為服務端一般都是需要配置域名的,最好是客戶端和服務端都配置服務器 IP 的域名,且必須統(tǒng)一,才能保證 Kerberos 認證流程正確,否則很容易出現(xiàn) Not found in Kerberos database 的問題。
對于Kafka 集群來說,集群主機的 Principal 的 username 相同,但是主機域名不同,客戶端維護集群節(jié)點的域名,sasl.kerberos.service.name 配置就是各節(jié)點的 username 。
Kafka Kerberos 認證環(huán)境搭建之前,必須先在客戶端和服務器端的 /etc/hosts 文件中配置 Kafka Server IP 的域名。網(wǎng)上很多搭建教程,都是 Kafka 客戶端和 Kafka 服務同主機,所以不會出現(xiàn)域名配置導致的問題。
| Client | 192.168.10.101 | hello-kafka-client@MY_KDC.COM |
| Server | 192.168.10.102 | hello-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 主目錄下創(chuàng)建一個 kerberos 文件夾,放 Kerberos 認證相關的配置文件。
KDC 注冊客戶端和服務端
第零步,拷貝 krb5.conf。
拷貝 KDC 認證中心的 krb5.conf 文件到全部的 Kerberos 客戶端,客戶端最重要的系統(tǒng)環(huán)境變量就是 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.confJava API 添加 Kerberos 認證的代碼為:
System.setProperty("java.security.krb5.conf", krb5Conf);第一步,注冊 Kerberos 帳號。
需要到 Kerberos 數(shù)據(jù)庫中注冊 Kafka 的客戶端和服務端,按剛剛表里面的 Principal 注冊到默認域名 MY_KDC.COM 中。
在 Kerberos 服務器上,執(zhí)行 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 文件遠程傳輸?shù)?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.keytabKafka 服務器部署 Kerberos
第一步,準備 server-kerberos.properties 文件。 拷貝 Kafka config 目錄下的 server.properties 文件,命名為 kerberos-server.properties ,編輯認證配置相關的內(nèi)容:
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 目錄下,創(chuàng)建文件 kafka-server-jaas.conf,編輯內(nèi)容如下:
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 環(huán)境變量和 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.propertiesKafka 客戶端部署 Kerberos
第一步,準備 client-kerberos.properties 文件。 拷貝 Kafka config 目錄下的 consumer.properties 文件,命名為 client-kerberos.properties ,編輯認證配置相關的內(nèi)容:
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 目錄下,創(chuàng)建文件 kafka-client-jaas.conf,編輯內(nèi)容如下:
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 環(huán)境變量和 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-beginningKDC 日志查看認證過程
KDC 服務中心的日志文件是 /var/log/krb5kdc.log ,每次 Kerberos 認證都對應兩條日志信息:
如果 Kafka 服務啟動或者客戶端啟動失敗,也可以查看該日志文件,常見的錯誤就是主機和域名、服務名稱配置不一致,導致 Server not found in Kerberos database 異常。
另外,多域名問題,還沒有找到解決辦法。如果一個客戶端的 krb5.conf 文件中配置多個 Realm ,默認只能有一個 Realm ,但是對于需要同時訪問多個 Kafka 、多套認證 Realm 的應用來說,到底該怎么配置呢?
啟示錄
官方 Kerberos 資料,沒有耐心看下去,網(wǎng)絡上搜到的,照貓畫虎實踐下來,其實也能部署下來的,關鍵是 kerberos.service.name 這個屬性,想了兩天才想明白,還有主機域名配置等基礎支持等,零零碎碎,以此留存網(wǎng)絡筆記。
總結
以上是生活随笔為你收集整理的Kafka 认证三:添加 Kerberos 认证详细流程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 类,
- 下一篇: 快速平方根倒数算法深度理解