配置客戶端以安全連線到Kafka叢集–LDAP

語言: CN / TW / HK

在上一篇文章《配置客戶端以安全連線到Kafka叢集- Kerberos》中,我們討論了Kerberos身份驗證,並說明了如何配置Kafka客戶端以使用Kerberos憑據進行身份驗證。在本文中,我們將研究如何配置Kafka客戶端以使用LDAP(而不是Kerberos)進行身份驗證。

我們將不在本文中介紹伺服器端配置,但在需要使示例更清楚時將新增一些引用。

此處顯示的示例將以粗體突出顯示與身份驗證相關的屬性,以將其與其他必需的安全屬性區分開,如下例所示。假定已為Apache Kafka叢集啟用了TLS,並且應該為每個安全叢集啟用TLS。

security.protocol=SASL_SSLssl.truststore.location=/opt/cloudera/security/jks/truststore.jks

我們在下面的所有示例中都使用Kafka-console-consumer 。所有概念和配置也適用於其他應用程式。

LDAP驗證

LDAP代表輕量級目錄訪問協議,並且是用於身份驗證的行業標準應用程式協議。它是CDP上Kafka支援的身份驗證機制之一。

LDAP認證也通過SASL框架完成,類似於Kerberos。SASL支援各種身份驗證機制,例如我們在上一篇文章中介紹過的GSSAPI,以及將用於LDAP身份驗證的PLAIN。

必須設定以下Kafka客戶端屬性,以配置Kafka客戶端通過LDAP進行身份驗證:

# Uses SASL/PLAIN over a TLS encrypted connectionsecurity.protocol=SASL_SSLsasl.mechanism=PLAIN# LDAP credentialssasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="alice" password="supersecret1";# TLS truststoressl.truststore.location=/opt/cloudera/security/jks/truststore.jks

上面的配置使用SASL / PLAIN進行身份驗證,並使用TLS(SSL)進行資料加密。LDAP身份驗證的選擇是在SASL / PLAIN的伺服器端處理程式上配置的,我們將在本節後面介紹。

LDAP和Kerberos

LDAP和Kerberos是不同的身份驗證協議,各有其優缺點。但是,在Kafka叢集中使用這些協議並不是相互排斥的。同時為叢集啟用Kerberos和LDAP身份驗證是一種有效的配置。

身份目錄服務(例如Active Directory,RedHat IPA和FreeIPA)支援Kerberos和LDAP身份驗證,並且為Kafka叢集啟用了這兩種功能,從而為客戶端提供了處理身份驗證的不同選擇。

LDAP可以消除與配置Kerberos客戶端有關的一些複雜性,例如要求在客戶端安裝Kerberos庫以及在更嚴格的環境中與Kerberos KDC的網路連線。

確保叢集使用TLS / SSL加密

與Kerberos協議不同,當使用LDAP進行身份驗證時,使用者憑據(使用者名稱和密碼)通過網路傳送到Kafka叢集。因此,當為Kafka啟用LDAP身份驗證時為Kafka客戶端之間的所有通訊啟用並實施TLS加密非常重要。這將確保憑據始終通過網路加密,並且不會受到損害。

必須將所有Kafka代理配置為對其SASL端點使用SASL_SSL安全協議。

在Kafka Broker上啟用LDAP身份驗證

安裝Kafka服務時,預設情況下未為Kafka代理啟用LDAP身份驗證,但是在Cloudera資料平臺(CDP)上配置它非常容易:

  1. 在Cloudera Manager中,在Kafka服務配置中設定以下屬性以匹配您的環境:通過選擇LDAP作為上面的SASL / PLAIN身份驗證選項,Cloudera Manager會自動將Kafka Brokers配置為使用以下SASL / PLAIN回撥處理程式,該實現LDAP驗證:

org.apache.kafka.common.security.ldap.internals.LdapPlainServerCallbackHandler
  1. Kafka必須通過TLS連線(LDAPS)連線到LDAP伺服器。為確保Kafka代理可以信任LDAP伺服器證書,請將LDAP伺服器的CA證書新增到Kafka服務使用的信任庫中。您可以在Cloudera Manager的以下屬性中找到信任庫的位置:

  1. 執行以下命令(以root使用者身份)以將LDAP CA證書新增到信任庫中:

keytool \  -importcert \-keystore /opt/cloudera/security/jks/truststore.jks \-storetype JKS \  -alias ldap-ca \-file /path/to/ldap-ca-cert.pem
  1. 單擊Kafka>操作>重新啟動以重新啟動Kafka服務並使更改生效。

侷限性

Kafka伺服器的LDAP回撥處理程式使用Apache Shiro庫將使用者ID(簡短登入名)對映到LDAP領域中的使用者實體。它通過提供一個“使用者DN模板”來做到這一點,給定使用者短名稱,該模板可用於在LDAP中派生使用者專有名稱:

例如,如庫文件中所述,“如果目錄使用LDAP uid屬性表示使用者名稱,則jsmith使用者的使用者DN可能如下所示:

uid=jsmith,ou=users,dc=mycompany,dc=com

在這種情況下,您可以使用以下模板值設定此屬性:

uid={0},ou=users,dc=mycompany,dc=com"

這將LDAP回撥處理程式的使用限制為以使用者名稱是專有名稱的一部分的方式配置的LDAP目錄。對於RedHat IPA和FreeIPA實現,通常是上面這樣。但是,在Active Directory中,預設情況下,專有名稱的格式為:

CN=Smith, John, ou=users, dc=mycompany, dc=com

它們包含使用者的全名而不是使用者ID,這使得不可能通過簡單的模式從簡短的使用者名稱中獲取它。幸運的是,對於Active Directory ,除專有名稱外,<使用者名稱> @ <域>也是有效的LDAP使用者名稱。如果使用的是Active Directory,則可以將LDAP使用者DN模板設定為以下模板(使用上面的mycompany.com示例):

{0}@mycompany.com

如果您的LDAP目錄不接受可以如上所述構造的使用者名稱,請考慮使用Kerberos身份驗證而不是LDAP。

示例

以下是使用Kafka控制檯使用者使用LDAP身份驗證從主題讀取的示例:

# Complete configuration file for LDAP auth$ cat ldap-client.propertiessecurity.protocol=SASL_SSLsasl.mechanism=PLAINsasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="alice" password="supersecret1";ssl.truststore.location=/opt/cloudera/security/jks/truststore.jks# Connect to Kafka using LDAP auth$ kafka-console-consumer \   --bootstrap-server host-1.example.com:9093 \   --topic test \    --consumer.config ./ldap-client.properties

注意:上面的配置檔案包含敏感憑據。確保設定了檔案許可權,以便只有檔案所有者才能讀取它。

如果我沒有Kerberos或LDAP伺服器怎麼辦?

到目前為止,Kerberos和LDAP身份驗證是行業標準,是我們在整個客戶群中與Kafka一起使用的最常見的身份驗證機制。但是,它們並不是唯一的。

Kerberos和LDAP要求Kafka叢集與後端目錄服務整合,有時在某些環境中不可用。在這種情況下,仍然可以使用其他方法(例如相互TLS身份驗證或帶有密碼檔案後端的SASL / PLAIN)為Kafka叢集設定身份驗證。

原文作者:Andre Araujo

原文連結:https://blog.cloudera.com/how-to-configure-clients-to-connect-to-apache-kafka-clusters-securely-part-2-ldap/




本文分享自微信公眾號 - 大資料雜貨鋪(bigdataGrocery)。
如有侵權,請聯絡 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。