kafka使用SASL認證
1. JAAS配置
Kafka使用Java認證和授權服務(JAAS)進行SASL配置。
-
為broker配置JAAS
KafkaServer
是每個KafkaServer/Broker使用JAAS檔案中的部分名稱。本節為broker提供了SASL配置選項,包括進行broker之間通訊所需的任何SASL客戶端連線。客戶端部分用於驗證與zookeeper的SASL連線。它還允許broker在zookeeper節點上設定SASL ACL。並鎖定這些節點,以便只有broker可以修改它。所有的broker必須有相同的principal名稱。如果要使用客戶端以外的名稱,設定zookeeper.sasl.client(例如,-Dzookeeper.sasl.client = ZkClient)。
預設情況下,Zookeeper使用“zookeeper”作為服務名稱。如果你需要修改,設定zookeeper.sasl.client.user(例如,-Dzookeeper.sasl.client.username=zk)
-
Kafka客戶端的JAAS配置
客戶端可以使用客戶端配置屬性sasl.jaas.config或使用broker類似的靜態JAAS配置檔案配置JAAS。
-
JAAS配置使用客戶端配置屬性
客戶端可以將JAAS配置指定為生產者或消費者屬性,而不建立物理配置檔案。 此模式還使同一個JVM中的不同生產者和消費者通過為每個客戶端指定不同的屬性來使用不同的憑據。 如果指定了靜態JAAS配置系統屬性java.security.auth.login.config和客戶端屬性sasl.jaas.config,將使用客戶端屬性。
請參閱GSSAPI(Kerberos),PLAIN或SCRAM的配置例子。
-
使用靜態配置檔案的JAAS配置
使用靜態JAAS配置檔案來配置客戶端上的SASL認證。
- 新增一個名為KafkaClient的客戶端登入部分的JAAS配置檔案。 在KafkaClient中為所選機制配置登入模組,如設定GSSAPI(Kerberos),PLAIN或SCRAM的示例中所述。 例如,GSSAPI憑據可以配置為:
KafkaClient { com.sun.security.auth.module.Krb5LoginModule required useKeyTab=true storeKey=true keyTab="/etc/security/keytabs/kafka_client.keytab" principal="
- 將JAAS配置檔案位置作為JVM引數傳遞給每個客戶端JVM。 例如:
-Djava.security.auth.login.config=/etc/kafka/kafka_client_jaas.conf
- 新增一個名為KafkaClient的客戶端登入部分的JAAS配置檔案。 在KafkaClient中為所選機制配置登入模組,如設定GSSAPI(Kerberos),PLAIN或SCRAM的示例中所述。 例如,GSSAPI憑據可以配置為:
-
2. SASL配置
SASL可以使用PLAINTEXT或SSL作為傳輸層,分別使用安全協議SASL_PLAINTEXT或SASL_SSL。 如果使用SASL_SSL,則還必須配置SSL。
-
SASL機制
Kafka支援一下的SASL機制:
- GSSAPI (Kerberos)
- PLAIN
- SCRAM-SHA-256
- SCRAM-SHA-512
-
為Kafka broker配置SASL
-
在server.properteis配置一個SASL埠,SASL_PLAINTEXT或SASL_SSL至少增加一個到
listeners
,用逗號分隔:listeners=SASL_PLAINTEXT://host.name:port
如果你只配置一個SASL埠(如果你需要broker使用SASL互相驗證),那麼需要確保broker之間設定相同的SASL協議:
security.inter.broker.protocol=SASL_PLAINTEXT (or SASL_SSL)
-
選擇一個或多個支援的機制,並通過以下的步驟為機器配置SASL。在broker之間啟用多個機制:
-
-
為Kafka客戶端配置SASL
SASL僅支援新的java生產者和消費者,不支援老的API。
要在客戶端上配置SASL驗證,選擇在broker中啟用的客戶端身份驗證的SASL機制,並按照以下步驟配置所選機制的SASL。
3. 使用SASL/Kerberos認證
-
預備知識
-
Kerberos
如果你已在使用Kerberos(如,使用Active Directory),則無需安裝重新安裝。否則,你將需要安裝一個,Linux供應商有Kerberos安裝和配置的簡短說明(Ubuntu,Radhat)。請注意,如果你使用的是Oracle Java,你需要下載java版本的
JCE策略檔案
,將它們複製到$JAVA_HOME/jre/lib/security
中(注意:必須替換!!). -
建立Kerberos Principals
如果你使用的是公司的Kerberos或Active Directory伺服器,請向Kerberos管理員詢問群集中每個broker的principal以及將使用Kerberos驗證(通過客戶端和工具)訪問Kafka的每個作業系統使用者。
如果你自己安裝Kerberos,你需要通過以下命令建立你自己的principal。
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要求所有的
host
都可以用其FQDN
解析所有主機。
-
-
配置Broker
-
新增一個JAAS檔案,類似下面的每個kafka broker的配置目錄。這個例子我們姑且命名為
kafka_server_jaas.conf
(注意,每個broker都應該有自己的金鑰表)。KafkaServer { com.sun.security.auth.module.Krb5LoginModule required useKeyTab=true storeKey=true keyTab="/etc/security/keytabs/kafka_server.keytab" principal="kafka/[email protected]"; }; // Zookeeper client authentication Client { com.sun.security.auth.module.Krb5LoginModule required useKeyTab=true storeKey=true keyTab="/etc/security/keytabs/kafka_server.keytab" principal="kafka/[email protected]"; };
JAAS檔案中的KafkaServer部分告訴broker哪個principal要使用,以及儲存該principal的keytab的位置。它允許broker使用本節中指定的keytab進行登入。更多細節參見zookeeper的SASL配置。
- 通過JAAS和krb5檔案位置(可選的)作為JVM引數傳遞到每個broker。(更多細節):
-Djava.security.krb5.conf=/etc/kafka/krb5.conf -Djava.security.auth.login.config=/etc/kafka/kafka_server_jaas.conf
-
確保在JAAS檔案的keytabs配置檔案可被啟動的Broker的作業系統員讀取。
-
在server.properties中配置SASL埠和SASL機制,例如:
listeners=SASL_PLAINTEXT://host.name:port security.inter.broker.protocol=SASL_PLAINTEXT sasl.mechanism.inter.broker.protocol=GSSAPI sasl.enabled.mechanisms=GSSAPI
我們還必須在server.properties配置伺服器名稱,應與broker的principal名匹配,在上面的例子中,principal是"kafka/[email protected]", 所以:
sasl.kerberos.service.name=kafka
-
-
配置Kafka客戶端
在客戶端上配置SASL認證
-
客戶端(生產者,消費者,connect,等等)用自己的principal進行叢集認證(通常用相同名稱作為執行客戶端的使用者)。因此,獲取或根據需要建立這些principal。然後為每個客戶端配置JAAS配置屬性。JVM中的不同客戶端通過指定不同的principal可以作為不同的使用者執行。producer.properties或consumer.properties中的屬性sasl.jaas.config描述了像生產者和消費者之類的客戶端如何連線到Kafka Broker的。 以下是使用keytab的客戶端的示例配置(推薦用於長時間執行的程序):
sasl.jaas.config=com.sun.security.auth.module.Krb5LoginModule required \ useKeyTab=true \ storeKey=true \ keyTab="/etc/security/keytabs/kafka_client.keytab" \ principal="[email protected]";
對於像kafka-console-consumer或kafka-console-producer這樣的命令列工具,kinit可以與“useTicketCache=true"一起使用,如:
sasl.jaas.config=com.sun.security.auth.module.Krb5LoginModule required \ useTicketCache=true;
客戶端的JAAS配置可以作為JVM引數,類似於broker。 客戶端使用名為
KafkaClient
的login部分。 此選項僅允許JVM中所有客戶端連線的一個使用者。 -
確保JAAS配置中的keytabls配置檔案能被啟動kafka客戶端的作業系統使用者讀取。
-
可以將krb5檔案位置作為JVM引數傳遞給每個客戶端JVM(有關詳細資訊,請參閱此處):
-Djava.security.krb5.conf=/etc/kafka/krb5.conf
-
在 producer.properties 或 consumer.properties中配置以下屬性:
security.protocol=SASL_PLAINTEXT (or SASL_SSL) sasl.mechanism=GSSAPI sasl.kerberos.service.name=kafka
-
-
使用SASL/PLAIN認證
SASL/PLAIN是一種簡單的
使用者名稱/密碼
的認證機制,通常與TLS加密一起使用,以實現安全的認證。Kafka支援SASL/PLAIN的預設實現,可作為生產者的擴充套件使用。username用作ACL等配置已認證的
Principal
。-
配置Kafka Brokers
-
在每個Kafka broker的config目錄下新增一個類似於下面的修改後的JAAS檔案,我們姑且將其稱為kafka_server_jaas.conf。
KafkaServer { org.apache.kafka.common.security.plain.PlainLoginModule required username="admin" password="admin-secret" user_admin="admin-secret" user_alice="alice-secret"; };
此配置定義了2個使用者(admin 和 alice)。 在
KafkaServer
中,username
和password
是broker用於初始化連線到其他的broker,在這個例子中,admin是broker之間通訊的使用者。user_userName
定義了所有連線到broker和broker驗證的所有的客戶端連線包括其他broker的使用者密碼。 -
將JAAS配置檔案位置作為JVM引數傳遞給每個Kafka broker:
-Djava.security.auth.login.config=/etc/kafka/kafka_server_jaas.conf
-
在server.properties中配置SASL埠和SASL機制。 例如:
listeners=SASL_SSL://host.name:port security.inter.broker.protocol=SASL_SSL sasl.mechanism.inter.broker.protocol=PLAIN sasl.enabled.mechanisms=PLAIN
-
-
配置kafka客戶端
在客戶端上配置SASL身份驗證:
-
為producer.properties或consumer.properties中的每個客戶端配置JAAS。登入模組展示了客戶端如何連線Broker的(和生產者和消費者一樣)。 以下是PLAIN機制的客戶端的示例配置:
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required \ username="alice" \ password="alice-secret";
客戶端選擇使用者名稱和密碼為客戶端配置連線的使用者。 在此示例中,客戶端以使用者alice連線到broker。也可以通過在
sasl.jaas.config
中指定不同的使用者名稱和密碼,JVM中的不同客戶端可以根據不同的使用者來進行連線。客戶端的JAAS配置可以指定為類似於這裡描述的broker作為JVM引數。客戶端使用的命名為
KafkaClient
。 此選項僅允許來自JVM的所有客戶端連線中的一個使用者。 -
在producer.properties或consumer.properties中配置以下屬性:
security.protocol=SASL_SSL sasl.mechanism=PLAIN
-
-
在生產者中使用SASL/PLAIN
-
SASL/PLAIN應僅用SSL作為傳輸層,以確保在沒有加密的情況下不會在線上明文傳輸。
-
Kafka中SASL/PLAIN的預設實現是在JAAS配置檔案中的使用者名稱和密碼,如下所示。為了避免在磁碟上儲存密碼,你可以自己用javax.security.auth.spi.LoginModule實現,從外部源獲取使用者名稱和密碼。登入模組應該提供Subject的使用者名稱作為公共證書和密碼作為私人憑證。 可以使用預設實現org.apache.kafka.common.security.plain.PlainLoginModule作為參考。
-
在生產者系統中,外部認證伺服器可以實現密碼驗證。Kafka broker可以與這些伺服器整合(通過新增自己實現
javax.security.sasl.SaslServer
)。在這個包路徑org.apache.kafka.common.security.plain
中,包括在kafka的預設的實現,可以作為一個參考的例項。-
必須在JVM中安裝和註冊新的Providers(提供者)。可以通過將提供程式類新增到CLASSPATH或打包成jar檔案並將其新增到JAVA_HOME/lib/ext來安裝提供者。
-
也可以通過新增Providers到安全屬性檔案
JAVA_HOME/lib/security/java.security
中靜態的註冊Providers。security.provider.n=providerClassName
其中,providerClassName是新Provider的全名,n是優先排序(較低的數字表明更高的優先權)
-
此外,你可以在執行時通過在客戶端應用程式的開始呼叫
Security.addProvider
或登入模組中的靜態初始化程式來動態註冊provider。 例如:Security.addProvider(new PlainSaslServerProvider());
-
更多細節, 可檢視 JCA。
-
-
-
-
使用 SASL/SCRAM 認證
SCRAM(Salted Challenge Response Authentication Mechanism)是SASL機制家族的一種,
,通過執行使用者名稱/密碼認證(如PLAIN和DIGEST-MD5)的傳統機制來解決安全問題。 該機制在RFC 5802中定義。Kafka支援SCRAM-SHA-256和SCRAM-SHA-512,可與TLS一起使用執行安全認證。 使用者名稱用作配置ACL等認證的principal。Kafka中的預設SCRAM實現是在Zookeeper中儲存SCRAM的證書,適用於Zookeeper在私有網路上的Kafka安裝。 有關詳細資訊,請參閱安全注意事項。-
建立 SCRAM 證書
Kafka的SCRAM實現使用Zookeeper作為證書儲存。通過使用kafka-configs.sh來建立證書。 對於啟用的每個SCRAM機制,必須通過使用機制名稱新增配置來建立證書。 必須在kafka broker啟動之前建立broker之間通訊的證書。 客戶端證書可以動態建立和更新,並且將使用更新後的證書來驗證新的連線。
為使用者
alice
建立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
如果未指定迭代數,則使用預設迭代數為4096。 建立一個隨機salt,由salt,迭代,StoredKey和ServerKey組成的SCRAM標識,都儲存在Zookeeper中。 有關SCRAM身份和各個欄位的詳細資訊,請參閱RFC 5802。
以下示例中,需要使用者admin進行broker間通訊,通過以下命令建立:
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列出現有的證書:
bin/kafka-configs.sh --zookeeper localhost:2181 --describe --entity-type users --entity-name alice
可以使用--delete為一個或多個SCRAM機制刪除證書:
bin/kafka-configs.sh --zookeeper localhost:2181 --alter --delete-config 'SCRAM-SHA-512' --entity-type users --entity-name alice
-
配置Kafka Broker
-
在每個Kafka broker的config目錄下新增一個類似於下面的JAAS檔案,我們姑且將其稱為kafka_server_jaas.conf:
KafkaServer { org.apache.kafka.common.security.scram.ScramLoginModule required username="admin" password="admin-secret" };
其中,broker使用KafkaServer中的使用者名稱和密碼來和其他broker進行連線。 在這個例子中,admin是broker之間通訊的使用者。
-
JAAS配置檔案的位置作為JVM引數傳遞給每個Kafka broker:
-Djava.security.auth.login.config=/etc/kafka/kafka_server_jaas.conf
-
在server.properties中配置SASL埠和SASL機制。 例如:
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)
-
-
配置kafka客戶端
在客戶端上配置SASL認證
-
為每個客戶端配置JAAS配置(在producer.properteis或consumer.properteis)。登入模組展示了客戶端(如生產者和消費者)如何連線到broker的。下面是配置了SCRAM機制的客戶端的例子。
sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required \ username="alice" \ password="alice-secret";
客戶端使用username和password來配置客戶端連線的使用者。在這個例子中,客戶端使用使用者alice連線broker。在JVM中不同的客戶端連線不同的使用者(通過在sasl.jaas.config中指定不同的使用者名稱和密碼)。
客戶端的JAAS配置通過指定作為JVM的引數。使用名為KafkaCLient的客戶端登入。此選擇僅允許來自JVM的所有客戶端連線中的一個使用者。
-
在producer.properties或consumer.properties中配置以下引數:
security.protocol=SASL_SSL sasl.mechanism=SCRAM-SHA-256 (or SCRAM-SHA-512)
-
-
SASL/SCRAM安全注意事項
-
在kafka中SASL/SCRAM的預設實現SCRAM證書儲存在Zookeeper中,這適用於Zookeeper安全和私有網路生產部署。
-
Kafka僅支援強雜湊函式SHA-256和SHA-512,最小迭代次數為4096.強雜湊函式結合強密碼和高迭代數可以防止強制攻擊(如果Zookeeper安全性受到威脅)。
-
SCRAM只能使用TLS加密,以防止攔截SCRAM交換。如果Zookeeper受到威脅,則可以防止字典或暴力攻擊,和防止偽裝模仿。
-
可以使用Zookeeper(不安全)安裝自定義登入模組來覆蓋預設的SASL/SCRAM實現。 詳見這裡。
-
更多的安全注意事項,可參考RFC5802。
-
-
-
在broker中啟用多個SASL機制
-
在JAAS檔案中的
KafkaServer
中啟用所有機制的登入模組配置。例如:KafkaServer { com.sun.security.auth.module.Krb5LoginModule required useKeyTab=true storeKey=true keyTab="/etc/security/keytabs/kafka_server.keytab" principal="kafka/[email protected]"; org.apache.kafka.common.security.plain.PlainLoginModule required username="admin" password="admin-secret" user_admin="admin-secret" user_alice="alice-secret"; };
-
在server.properties中啟用SASL機制
sasl.enabled.mechanisms=GSSAPI,PLAIN,SCRAM-SHA-256,SCRAM-SHA-512
-
如果需要broker之間通訊,則在server.properteis中指定SASL安全協議和機制。
security.inter.broker.protocol=SASL_PLAINTEXT (or SASL_SSL) sasl.mechanism.inter.broker.protocol=GSSAPI (or one of the other enabled mechanisms)
-
按照機制 - GSSAPI(Kerberos),PLAIN和SCRAM中的具體步驟來配置啟用的SASL機制。
-
-
在執行的叢集中修改SASL機制
可以按照以下順序在正在執行的群集中修改SASL機制:
-
將新SASL機制新增到每個broker上的server.properteis中的sasl.enabled.mechanisms上。更新JAAS配置檔案以包括這兩個機制,如這裡所述。 逐步重啟群集節點。
-
使用新機制重新啟動叢集。
-
要改變broker之間的通訊(如果需要),則設定在server.properteis中的sasl.mechanism.inter.broker.protocol為新的機制並逐個重啟。
-
要移除老的機制(如果需要),從server.properties的sasl.enabled.mechanisms和JAAS配置檔案中移除舊機制。然後依次重啟。
-
連結:http://www.orchome.com/553
來源:OrcHome
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。