1. JAAS配置Kafka使用Java認(rèn)證和授權(quán)服務(wù)(JAAS)進(jìn)行SASL配置。 為broker配置JAAS KafkaServer 是每個(gè)KafkaServer/Broker使用JAAS文件中的部分名稱,。本節(jié)為broker提供了SASL配置選項(xiàng),,包括進(jìn)行broker之間通信所需的任何SASL客戶端連接。
客戶端部分用于驗(yàn)證與zookeeper的SASL連接,。它還允許broker在zookeeper節(jié)點(diǎn)上設(shè)置SASL ACL,。并鎖定這些節(jié)點(diǎn),以便只有broker可以修改它,。所有的broker必須有相同的principal名稱,。如果要使用客戶端以外的名稱,設(shè)置zookeeper.sasl.client(例如,,-Dzookeeper.sasl.client = ZkClient),。 默認(rèn)情況下,Zookeeper使用“zookeeper”作為服務(wù)名稱,。如果你需要修改,設(shè)置zookeeper.sasl.client.user(例如,,-Dzookeeper.sasl.client.username=zk) Kafka客戶端的JAAS配置 客戶端可以使用客戶端配置屬性sasl.jaas.config或使用broker類似的靜態(tài)JAAS配置文件配置JAAS,。 添加一個(gè)名為KafkaClient的客戶端登錄部分的JAAS配置文件。 在KafkaClient中為所選機(jī)制配置登錄模塊,,如設(shè)置GSSAPI(Kerberos),PLAIN或SCRAM的示例中所述,。 例如,GSSAPI憑據(jù)可以配置為:
將JAAS配置文件位置作為JVM參數(shù)傳遞給每個(gè)客戶端JVM,。 例如: -Djava.security.auth.login.config=/etc/kafka/kafka_client_jaas.conf
com.sun.security.auth.module.Krb5LoginModule required keyTab="/etc/security/keytabs/kafka_client.keytab"
JAAS配置使用客戶端配置屬性 客戶端可以將JAAS配置指定為生產(chǎn)者或消費(fèi)者屬性,而不創(chuàng)建物理配置文件,。 此模式還使同一個(gè)JVM中的不同生產(chǎn)者和消費(fèi)者通過為每個(gè)客戶端指定不同的屬性來使用不同的憑據(jù)。 如果指定了靜態(tài)JAAS配置系統(tǒng)屬性java.security.auth.login.config和客戶端屬性sasl.jaas.config,,將使用客戶端屬性,。 請(qǐng)參閱GSSAPI(Kerberos),PLAIN或SCRAM的配置例子,。 使用靜態(tài)配置文件的JAAS配置 使用靜態(tài)JAAS配置文件來配置客戶端上的SASL認(rèn)證,。
2. SASL配置SASL可以使用PLAINTEXT或SSL作為傳輸層,,分別使用安全協(xié)議SASL_PLAINTEXT或SASL_SSL。 如果使用SASL_SSL,,則還必須配置SSL,。 SASL機(jī)制 Kafka支持一下的SASL機(jī)制: GSSAPI (Kerberos) PLAIN SCRAM-SHA-256 SCRAM-SHA-512
為Kafka broker配置SASL 在server.properteis配置一個(gè)SASL端口,SASL_PLAINTEXT或SASL_SSL至少增加一個(gè)到listeners ,用逗號(hào)分隔: listeners=SASL_PLAINTEXT://host.name:port 如果你只配置一個(gè)SASL端口(如果你需要broker使用SASL互相驗(yàn)證),,那么需要確保broker之間設(shè)置相同的SASL協(xié)議: security.inter.broker.protocol=SASL_PLAINTEXT (or SASL_SSL) 選擇一個(gè)或多個(gè)支持的機(jī)制,并通過以下的步驟為機(jī)器配置SASL,。在broker之間啟用多個(gè)機(jī)制:
為Kafka客戶端配置SASL SASL僅支持新的java生產(chǎn)者和消費(fèi)者,,不支持老的API。 要在客戶端上配置SASL驗(yàn)證,,選擇在broker中啟用的客戶端身份驗(yàn)證的SASL機(jī)制,,并按照以下步驟配置所選機(jī)制的SASL。
3. 使用SASL/Kerberos認(rèn)證預(yù)備知識(shí) sudo /usr/sbin/kadmin.local -q 'addprinc -randkey kafka/{hostname}@{REALM}' sudo /usr/sbin/kadmin.local -q "ktadd -k /etc/security/keytabs/{keytabname}.keytab kafka/{hostname}@{REALM}"
Kerberos 如果你已在使用Kerberos(如,,使用Active Directory),,則無需安裝重新安裝。否則,,你將需要安裝一個(gè),,Linux供應(yīng)商有Kerberos安裝和配置的簡短說明(Ubuntu,Radhat),。請(qǐng)注意,,如果你使用的是Oracle Java,你需要下載java版本的JCE策略文件 ,,將它們復(fù)制到 $JAVA_HOME/jre/lib/security 中(注意:必須替換?。。? 創(chuàng)建Kerberos Principals 如果你使用的是公司的Kerberos或Active Directory服務(wù)器,,請(qǐng)向Kerberos管理員詢問群集中每個(gè)broker的principal以及將使用Kerberos驗(yàn)證(通過客戶端和工具)訪問Kafka的每個(gè)操作系統(tǒng)用戶,。 如果你自己安裝Kerberos,你需要通過以下命令創(chuàng)建你自己的principal,。
確保使用主機(jī)名可以訪問所有主機(jī) - Kerberos要求所有的host 都可以用其FQDN 解析所有主機(jī),。
配置Broker listeners=SASL_PLAINTEXT://host.name:port security.inter.broker.protocol=SASL_PLAINTEXT sasl.mechanism.inter.broker.protocol=GSSAPI sasl.enabled.mechanisms=GSSAPI
-Djava.security.krb5.conf=/etc/kafka/krb5.conf -Djava.security.auth.login.config=/etc/kafka/kafka_server_jaas.conf
com.sun.security.auth.module.Krb5LoginModule required keyTab="/etc/security/keytabs/kafka_server.keytab" // Zookeeper client authentication com.sun.security.auth.module.Krb5LoginModule required keyTab="/etc/security/keytabs/kafka_server.keytab"
添加一個(gè)JAAS文件,類似下面的每個(gè)kafka broker的配置目錄,。這個(gè)例子我們姑且命名為kafka_server_jaas.conf (注意,,每個(gè)broker都應(yīng)該有自己的密鑰表)。
JAAS文件中的KafkaServer部分告訴broker哪個(gè)principal要使用,,以及存儲(chǔ)該principal的keytab的位置。它允許broker使用本節(jié)中指定的keytab進(jìn)行登錄,。更多細(xì)節(jié)參見zookeeper的SASL配置,。 通過JAAS和krb5文件位置(可選的)作為JVM參數(shù)傳遞到每個(gè)broker,。(更多細(xì)節(jié)):
確保在JAAS文件的keytabs配置文件可被啟動(dòng)的Broker的操作系統(tǒng)員讀取。 在server.properties中配置SASL端口和SASL機(jī)制,,例如:
我們還必須在server.properties配置服務(wù)器名稱,,應(yīng)與broker的principal名匹配,在上面的例子中,,principal是"kafka/[email protected]", 所以: sasl.kerberos.service.name=kafka
配置Kafka客戶端 在客戶端上配置SASL認(rèn)證 security.protocol=SASL_PLAINTEXT (or SASL_SSL) sasl.kerberos.service.name=kafka
sasl.jaas.config=com.sun.security.auth.module.Krb5LoginModule required \ keyTab="/etc/security/keytabs/kafka_client.keytab" \
sasl.jaas.config=com.sun.security.auth.module.Krb5LoginModule required \
客戶端(生產(chǎn)者,,消費(fèi)者,connect,,等等)用自己的principal進(jìn)行集群認(rèn)證(通常用相同名稱作為運(yùn)行客戶端的用戶),。因此,獲取或根據(jù)需要?jiǎng)?chuàng)建這些principal,。然后為每個(gè)客戶端配置JAAS配置屬性,。JVM中的不同客戶端通過指定不同的principal可以作為不同的用戶運(yùn)行。producer.properties或consumer.properties中的屬性sasl.jaas.config描述了像生產(chǎn)者和消費(fèi)者之類的客戶端如何連接到Kafka Broker的,。 以下是使用keytab的客戶端的示例配置(推薦用于長時(shí)間運(yùn)行的進(jìn)程):
對(duì)于像kafka-console-consumer或kafka-console-producer這樣的命令行工具,,kinit可以與“useTicketCache=true"一起使用,如:
客戶端的JAAS配置可以作為JVM參數(shù),,類似于broker,。 客戶端使用名為KafkaClient 的login部分。 此選項(xiàng)僅允許JVM中所有客戶端連接的一個(gè)用戶,。 確保JAAS配置中的keytabls配置文件能被啟動(dòng)kafka客戶端的操作系統(tǒng)用戶讀取,。 可以將krb5文件位置作為JVM參數(shù)傳遞給每個(gè)客戶端JVM(有關(guān)詳細(xì)信息,請(qǐng)參閱此處): -Djava.security.krb5.conf=/etc/kafka/krb5.conf 在 producer.properties 或 consumer.properties中配置以下屬性:
使用SASL/PLAIN認(rèn)證 SASL/PLAIN是一種簡單的用戶名/密碼 的認(rèn)證機(jī)制,,通常與TLS加密一起使用,,以實(shí)現(xiàn)安全的認(rèn)證。Kafka支持SASL/PLAIN的默認(rèn)實(shí)現(xiàn),,可作為生產(chǎn)者的擴(kuò)展使用,。 username用作ACL等配置已認(rèn)證的Principal 。 SASL/PLAIN應(yīng)僅用SSL作為傳輸層,,以確保在沒有加密的情況下不會(huì)在線上明文傳輸,。 Kafka中SASL/PLAIN的默認(rèn)實(shí)現(xiàn)是在JAAS配置文件中的用戶名和密碼,如下所示,。為了避免在磁盤上存儲(chǔ)密碼,,你可以自己用javax.security.auth.spi.LoginModule實(shí)現(xiàn),從外部源獲取用戶名和密碼,。登錄模塊應(yīng)該提供Subject的用戶名作為公共證書和密碼作為私人憑證,。 可以使用默認(rèn)實(shí)現(xiàn)org.apache.kafka.common.security.plain.PlainLoginModule作為參考。 在生產(chǎn)者系統(tǒng)中,,外部認(rèn)證服務(wù)器可以實(shí)現(xiàn)密碼驗(yàn)證,。Kafka broker可以與這些服務(wù)器集成(通過添加自己實(shí)現(xiàn) javax.security.sasl.SaslServer ),。在這個(gè)包路徑org.apache.kafka.common.security.plain 中,包括在kafka的默認(rèn)的實(shí)現(xiàn),,可以作為一個(gè)參考的實(shí)例,。
必須在JVM中安裝和注冊(cè)新的Providers(提供者)??梢酝ㄟ^將提供程序類添加到CLASSPATH或打包成jar文件并將其添加到JAVA_HOME/lib/ext來安裝提供者,。 也可以通過添加Providers到安全屬性文件 JAVA_HOME/lib/security/java.security 中靜態(tài)的注冊(cè)Providers。 security.provider.n=providerClassName 其中,,providerClassName是新Provider的全名,,n是優(yōu)先排序(較低的數(shù)字表明更高的優(yōu)先權(quán)) 此外,你可以在運(yùn)行時(shí)通過在客戶端應(yīng)用程序的開始調(diào)用Security.addProvider 或登錄模塊中的靜態(tài)初始化程序來動(dòng)態(tài)注冊(cè)provider,。 例如: Security.addProvider(new PlainSaslServerProvider()); 更多細(xì)節(jié), 可查看 JCA,。
為producer.properties或consumer.properties中的每個(gè)客戶端配置JAAS。登錄模塊展示了客戶端如何連接Broker的(和生產(chǎn)者和消費(fèi)者一樣),。 以下是PLAIN機(jī)制的客戶端的示例配置:
客戶端選擇用戶名和密碼為客戶端配置連接的用戶,。 在此示例中,客戶端以用戶alice連接到broker,。也可以通過在sasl.jaas.config 中指定不同的用戶名和密碼,,JVM中的不同客戶端可以根據(jù)不同的用戶來進(jìn)行連接。 客戶端的JAAS配置可以指定為類似于這里描述的broker作為JVM參數(shù),??蛻舳耸褂玫拿麨?code>KafkaClient。 此選項(xiàng)僅允許來自JVM的所有客戶端連接中的一個(gè)用戶,。 在producer.properties或consumer.properties中配置以下屬性:
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required \
security.protocol=SASL_SSL
在每個(gè)Kafka broker的config目錄下添加一個(gè)類似于下面的修改后的JAAS文件,,我們姑且將其稱為kafka_server_jaas.conf。
此配置定義了2個(gè)用戶(admin 和 alice),。 在KafkaServer 中,,username 和password 是broker用于初始化連接到其他的broker,在這個(gè)例子中,,admin是broker之間通信的用戶,。user_userName 定義了所有連接到broker和broker驗(yàn)證的所有的客戶端連接包括其他broker的用戶密碼。 將JAAS配置文件位置作為JVM參數(shù)傳遞給每個(gè)Kafka broker: -Djava.security.auth.login.config=/etc/kafka/kafka_server_jaas.conf 在server.properties中配置SASL端口和SASL機(jī)制,。 例如:
KafkaServer { org.apache.kafka.common.security.plain.PlainLoginModule required user_admin="admin-secret" user_alice="alice-secret";
listeners=SASL_SSL://host.name:port security.inter.broker.protocol=SASL_SSL sasl.mechanism.inter.broker.protocol=PLAIN sasl.enabled.mechanisms=PLAIN
配置Kafka Brokers 配置kafka客戶端 在客戶端上配置SASL身份驗(yàn)證: 在生產(chǎn)者中使用SASL/PLAIN
使用 SASL/SCRAM 認(rèn)證 SCRAM(Salted Challenge Response Authentication Mechanism)是SASL機(jī)制家族的一種,, ,通過執(zhí)行用戶名/密碼認(rèn)證(如PLAIN和DIGEST-MD5)的傳統(tǒng)機(jī)制來解決安全問題,。 該機(jī)制在RFC 5802中定義,。Kafka支持SCRAM-SHA-256和SCRAM-SHA-512,可與TLS一起使用執(zhí)行安全認(rèn)證。 用戶名用作配置ACL等認(rèn)證的principal,。Kafka中的默認(rèn)SCRAM實(shí)現(xiàn)是在Zookeeper中存儲(chǔ)SCRAM的證書,,適用于Zookeeper在私有網(wǎng)絡(luò)上的Kafka安裝。 有關(guān)詳細(xì)信息,,請(qǐng)參閱安全注意事項(xiàng)。 在kafka中SASL/SCRAM的默認(rèn)實(shí)現(xiàn)SCRAM證書存儲(chǔ)在Zookeeper中,,這適用于Zookeeper安全和私有網(wǎng)絡(luò)生產(chǎn)部署,。 Kafka僅支持強(qiáng)散列函數(shù)SHA-256和SHA-512,,最小迭代次數(shù)為4096.強(qiáng)散列函數(shù)結(jié)合強(qiáng)密碼和高迭代數(shù)可以防止強(qiáng)制攻擊(如果Zookeeper安全性受到威脅),。 SCRAM只能使用TLS加密,以防止攔截SCRAM交換。如果Zookeeper受到威脅,,則可以防止字典或暴力攻擊,,和防止偽裝模仿,。 可以使用Zookeeper(不安全)安裝自定義登錄模塊來覆蓋默認(rèn)的SASL/SCRAM實(shí)現(xiàn),。 詳見這里,。 更多的安全注意事項(xiàng),,可參考RFC5802,。
為每個(gè)客戶端配置JAAS配置(在producer.properteis或consumer.properteis)。登錄模塊展示了客戶端(如生產(chǎn)者和消費(fèi)者)如何連接到broker的,。下面是配置了SCRAM機(jī)制的客戶端的例子。
客戶端使用username和password來配置客戶端連接的用戶,。在這個(gè)例子中,,客戶端使用用戶alice連接broker,。在JVM中不同的客戶端連接不同的用戶(通過在sasl.jaas.config中指定不同的用戶名和密碼),。 客戶端的JAAS配置通過指定作為JVM的參數(shù)。使用名為KafkaCLient的客戶端登錄,。此選擇僅允許來自JVM的所有客戶端連接中的一個(gè)用戶。 在producer.properties或consumer.properties中配置以下參數(shù):
sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required \
security.protocol=SASL_SSL sasl.mechanism=SCRAM-SHA-256 (or SCRAM-SHA-512)
在每個(gè)Kafka broker的config目錄下添加一個(gè)類似于下面的JAAS文件,,我們姑且將其稱為kafka_server_jaas.conf:
其中,,broker使用KafkaServer中的用戶名和密碼來和其他broker進(jìn)行連接,。 在這個(gè)例子中,,admin是broker之間通信的用戶,。 JAAS配置文件的位置作為JVM參數(shù)傳遞給每個(gè)Kafka broker: -Djava.security.auth.login.config=/etc/kafka/kafka_server_jaas.conf 在server.properties中配置SASL端口和SASL機(jī)制。 例如:
org.apache.kafka.common.security.scram.ScramLoginModule required
listeners=SASL_SSL://host.name:port security.inter.broker.protocol=SASL_SSL sasl.mechanism.inter.broker.protocol=SCRAM-SHA-256 (or SCRAM-SHA-512) sasl.enabled.mechanisms=SCRAM-SHA-256 (or SCRAM-SHA-512)
創(chuàng)建 SCRAM 證書 Kafka的SCRAM實(shí)現(xiàn)使用Zookeeper作為證書存儲(chǔ),。通過使用kafka-configs.sh來創(chuàng)建證書,。 對(duì)于啟用的每個(gè)SCRAM機(jī)制,必須通過使用機(jī)制名稱添加配置來創(chuàng)建證書,。 必須在kafka broker啟動(dòng)之前創(chuàng)建broker之間通信的證書。 客戶端證書可以動(dòng)態(tài)創(chuàng)建和更新,,并且將使用更新后的證書來驗(yàn)證新的連接,。 為用戶alice 創(chuàng)建SCRAM憑證(密碼為alice-secret): bin/kafka-configs.sh --zookeeper localhost:2181 --alter --add-config 'SCRAM-SHA-256=[iterations=8192,password=alice-secret],SCRAM-SHA-512=[password=alice-secret]' --entity-type users --entity-name alice 如果未指定迭代數(shù),則使用默認(rèn)迭代數(shù)為4096,。 創(chuàng)建一個(gè)隨機(jī)salt,由salt,,迭代,,StoredKey和ServerKey組成的SCRAM標(biāo)識(shí),,都存儲(chǔ)在Zookeeper中。 有關(guān)SCRAM身份和各個(gè)字段的詳細(xì)信息,,請(qǐng)參閱RFC 5802,。 以下示例中,,需要用戶admin進(jìn)行broker間通信,通過以下命令創(chuàng)建: bin/kafka-configs.sh --zookeeper localhost:2181 --alter --add-config 'SCRAM-SHA-256=[password=admin-secret],SCRAM-SHA-512=[password=admin-secret]' --entity-type users --entity-name admin 可以使用--describe列出現(xiàn)有的證書: bin/kafka-configs.sh --zookeeper localhost:2181 --describe --entity-type users --entity-name alice 可以使用--delete為一個(gè)或多個(gè)SCRAM機(jī)制刪除證書: bin/kafka-configs.sh --zookeeper localhost:2181 --alter --delete-config 'SCRAM-SHA-512' --entity-type users --entity-name alice 配置Kafka Broker 配置kafka客戶端 在客戶端上配置SASL認(rèn)證 SASL/SCRAM安全注意事項(xiàng)
在broker中啟用多個(gè)SASL機(jī)制 security.inter.broker.protocol=SASL_PLAINTEXT (or SASL_SSL) sasl.mechanism.inter.broker.protocol=GSSAPI (or one of the other enabled mechanisms)
com.sun.security.auth.module.Krb5LoginModule required keyTab="/etc/security/keytabs/kafka_server.keytab" org.apache.kafka.common.security.plain.PlainLoginModule required user_admin="admin-secret" user_alice="alice-secret";
在JAAS文件中的KafkaServer 中啟用所有機(jī)制的登錄模塊配置。例如:
在server.properties中啟用SASL機(jī)制 sasl.enabled.mechanisms=GSSAPI,PLAIN,SCRAM-SHA-256,SCRAM-SHA-512 如果需要broker之間通訊,,則在server.properteis中指定SASL安全協(xié)議和機(jī)制,。
按照機(jī)制 - GSSAPI(Kerberos),,PLAIN和SCRAM中的具體步驟來配置啟用的SASL機(jī)制,。
在運(yùn)行的集群中修改SASL機(jī)制 可以按照以下順序在正在運(yùn)行的群集中修改SASL機(jī)制: 將新SASL機(jī)制添加到每個(gè)broker上的server.properteis中的sasl.enabled.mechanisms上,。更新JAAS配置文件以包括這兩個(gè)機(jī)制,,如這里所述。 逐步重啟群集節(jié)點(diǎn),。 使用新機(jī)制重新啟動(dòng)集群。 要改變broker之間的通訊(如果需要),,則設(shè)置在server.properteis中的sasl.mechanism.inter.broker.protocol為新的機(jī)制并逐個(gè)重啟,。 要移除老的機(jī)制(如果需要),,從server.properties的sasl.enabled.mechanisms和JAAS配置文件中移除舊機(jī)制。然后依次重啟,。
鏈接:http://www./553 來源:OrcHome 著作權(quán)歸作者所有,。非商業(yè)轉(zhuǎn)載請(qǐng)注明出處,。
|