在 Azure HDInsight 中設定非 ESP Apache Kafka 叢集的 TLS 加密和驗證
本文說明如何設定 Apache Kafka 用戶端與 Apache Kafka 訊息代理程式之間的傳輸層安全性 (TLS) 加密,先前稱為安全套接字層 (SSL) 加密。 它也會說明如何設定客戶端的驗證(有時稱為雙向 TLS)。
重要
您可以針對 Kafka 應用程式使用兩個用戶端:Java 用戶端和控制台用戶端。 只有 Java 用戶端 ProducerConsumer.java
可以使用 TLS 來產生和取用。 主控台產生者用戶端 console-producer.sh
不適用於TLS。
Apache Kafka 訊息代理程式設定
Kafka TLS 訊息代理程式設定會以下列方式使用四個 HDInsight 叢集 VM:
- headnode 0 - 證書頒發機構單位 (CA)
- 背景工作節點 0、1 和 2 - 訊息代理程式
注意
本指南使用自我簽署憑證,但最安全的解決方案是使用受信任 CA 所簽發的憑證。
訊息代理程式安裝程式的摘要如下所示:
下列步驟會在三個背景工作節點上重複執行:
- 產生憑證。
- 建立憑證簽署要求。
- 將憑證簽署要求傳送至證書頒發機構單位 (CA)。
- 登入 CA 並簽署要求。
- SCP 簽署的憑證回到背景工作節點。
- SCP 對背景工作節點的 CA 公開憑證。
一旦您擁有所有憑證,請將憑證放入憑證存放區。
移至Ambari並變更組態。
使用下列詳細指示來完成訊息代理程式設定:
重要
在下列代碼段中,wnX 是三個背景工作節點之一的縮寫,應適當地取代為
wn0
或wn1
wn2
。WorkerNode0_Name
和HeadNode0_Name
應該以個別計算機的名稱取代。在前端節點 0 上執行初始設定,HDInsight 會填滿證書頒發機構單位 (CA) 的角色。
# Create a new directory 'ssl' and change into it mkdir ssl cd ssl
在每個訊息代理程式上執行相同的初始設定(背景工作節點 0、1 和 2)。
# Create a new directory 'ssl' and change into it mkdir ssl cd ssl
在每個背景工作節點上,使用代碼段執行下列步驟。
- 建立金鑰存放區,並填入新的私人憑證。
- 建立憑證簽署要求。
- SCP 憑證簽署要求給 CA (headnode0)
keytool -genkey -keystore kafka.server.keystore.jks -keyalg RSA -validity 365 -storepass "MyServerPassword123" -keypass "MyServerPassword123" -dname "CN=FQDN_WORKER_NODE" -ext SAN=DNS:FQDN_WORKER_NODE -storetype pkcs12 keytool -keystore kafka.server.keystore.jks -certreq -file cert-file -storepass "MyServerPassword123" -keypass "MyServerPassword123" scp cert-file sshuser@HeadNode0_Name:~/ssl/wnX-cert-sign-request
注意
FQDN_WORKER_NODE為背景工作節點計算機的完整功能變數名稱。您可以從前端節點的 /etc/hosts 檔案取得該詳細數據
例如,
wn0-espkaf.securehadooprc.onmicrosoft.com wn0-kafka2.zbxwnwsmpcsuvbjqbmespcm1zg.bx.internal.cloudapp.net
在 CA 計算機上,執行下列命令來建立 ca-cert 和 ca-key 檔案:
openssl req -new -newkey rsa:4096 -days 365 -x509 -subj "/CN=Kafka-Security-CA" -keyout ca-key -out ca-cert -nodes
變更為 CA 計算機,並簽署所有已接收的憑證簽署要求:
openssl x509 -req -CA ca-cert -CAkey ca-key -in wn0-cert-sign-request -out wn0-cert-signed -days 365 -CAcreateserial -passin pass:"MyServerPassword123" openssl x509 -req -CA ca-cert -CAkey ca-key -in wn1-cert-sign-request -out wn1-cert-signed -days 365 -CAcreateserial -passin pass:"MyServerPassword123" openssl x509 -req -CA ca-cert -CAkey ca-key -in wn2-cert-sign-request -out wn2-cert-signed -days 365 -CAcreateserial -passin pass:"MyServerPassword123"
將已簽署的憑證從 CA (headnode0) 傳送回背景工作節點。
scp wn0-cert-signed sshuser@WorkerNode0_Name:~/ssl/cert-signed scp wn1-cert-signed sshuser@WorkerNode1_Name:~/ssl/cert-signed scp wn2-cert-signed sshuser@WorkerNode2_Name:~/ssl/cert-signed
將 CA 的公用憑證傳送至每個背景工作節點。
scp ca-cert sshuser@WorkerNode0_Name:~/ssl/ca-cert scp ca-cert sshuser@WorkerNode1_Name:~/ssl/ca-cert scp ca-cert sshuser@WorkerNode2_Name:~/ssl/ca-cert
在每個背景工作節點上,將 CA 公用憑證新增至信任存放區和密鑰存放區。 然後將背景工作節點自己的已簽署憑證新增至金鑰存放區
keytool -keystore kafka.server.truststore.jks -alias CARoot -import -file ca-cert -storepass "MyServerPassword123" -keypass "MyServerPassword123" -noprompt keytool -keystore kafka.server.keystore.jks -alias CARoot -import -file ca-cert -storepass "MyServerPassword123" -keypass "MyServerPassword123" -noprompt keytool -keystore kafka.server.keystore.jks -import -file cert-signed -storepass "MyServerPassword123" -keypass "MyServerPassword123" -noprompt
更新 Kafka 設定以使用 TLS 並重新啟動訊息代理程式
您現在已使用金鑰存放區和信任存放區來設定每個 Kafka 訊息代理程式,並匯入正確的憑證。 接下來,使用Ambari修改相關的Kafka組態屬性,然後重新啟動Kafka訊息代理程式。
若要完成組態修改,請執行下列步驟:
登入 Azure 入口網站,然後選取您的 Azure HDInsight Apache Kafka 叢集。
單擊 [叢集儀錶板] 底下的 [Ambari 首頁] 以移至 Ambari UI。
在 Kafka Broker 下,將接聽程式屬性設定為
PLAINTEXT://localhost:9092,SSL://localhost:9093
在 [進階 kafka-broker] 底下,將 security.inter.broker.protocol 屬性設定為
SSL
在 [自定義 kafka-broker] 下,將 ssl.client.auth 屬性設定為
required
。注意
注意:只有在您設定驗證和加密時,才需要此步驟。
以下是顯示具有這些變更之Ambari設定UI的螢幕快照。
注意
- ssl.keystore.location 和 ssl.truststore.location 是證書頒發機構單位中密鑰存放區、信任存放區位置的完整路徑(hn0)
- ssl.keystore.password 和 ssl.truststore.password 是密鑰存放區和信任存放區的密碼集。 在此案例中,例如
MyServerPassword123
- ssl.key.password 是金鑰存放區和信任存放區的密鑰集。 在此案例中,例如
MyServerPassword123
在 Kafka 中使用 TLS 1.3
將下列設定新增至Ambari中的kafka組態
ssl.enabled.protocols=TLSv1.3
ssl.protocol=TLSv1.3
重要
- TLS 1.3 僅適用於 HDI 5.1 kafka 版本。
- 如果您在伺服器端使用 TLS 1.3,則也應該在用戶端使用 TLS 1.3 設定。
針對 HDI 4.0 版或 5.0 版
- 如果您要設定驗證和加密,則螢幕快照看起來會像這樣
- 如果您只設定加密,則螢幕快照看起來會像這樣
重新啟動所有 Kafka 訊息代理程式。
用戶端設定 (沒有驗證)
如果您不需要驗證,僅設定 TLS 加密的步驟摘要如下:
- 登入 CA (作用中前端節點)。
- 從 CA 計算機將 CA 憑證複製到用戶端電腦(wn0)。
- 登入客戶端電腦 (hn1),並瀏覽至
~/ssl
資料夾。 - 將 CA 憑證匯入至信任存放區。
- 將 CA 憑證匯入金鑰存放區。
下列步驟詳述於下列代碼段。
登入 CA 節點。
ssh sshuser@HeadNode0_Name cd ssl
將 ca-cert 複製到用戶端電腦
scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert
登入客戶端電腦(待命前端節點)。
ssh sshuser@HeadNode1_Name cd ssl
將 CA 憑證匯入至信任存放區。
keytool -keystore kafka.client.truststore.jks -alias CARoot -import -file ca-cert -storepass "MyClientPassword123" -keypass "MyClientPassword123" -noprompt
將 CA 憑證匯入金鑰存放區。
keytool -keystore kafka.client.keystore.jks -alias CARoot -import -file ca-cert -storepass "MyClientPassword123" -keypass "MyClientPassword123" -noprompt
在用戶端電腦上建立檔案
client-ssl-auth.properties
(hn1)。 它應該有下列幾行:security.protocol=SSL ssl.truststore.location=/home/sshuser/ssl/kafka.client.truststore.jks ssl.truststore.password=MyClientPassword123
- 若要使用 TLS 1.3 將下列組態新增至檔案
client-ssl-auth.properties
ssl.enabled.protocols=TLSv1.3 ssl.protocol=TLSv1.3
- 若要使用 TLS 1.3 將下列組態新增至檔案
使用生產者和取用者選項啟動系統管理用戶端,以確認生產者和取用者都在埠 9093 上運作。 如需使用主控台產生者/取用者驗證設定所需的步驟,請參閱驗證一節。
用戶端設定 (使用驗證)
注意
只有在您同時設定 TLS 加密 和 驗證時,才需要下列步驟。 如果您只設定加密,請參閱 客戶端設定而不進行驗證。
下列四個步驟摘要說明完成用戶端設定所需的工作:
- 登入客戶端電腦(待命前端節點)。
- 建立 Java 金鑰存放區並取得訊息代理程式簽署的憑證。 然後將憑證複製到 CA 執行所在的 VM。
- 切換至 CA 計算機(作用中前端節點),以簽署客戶端憑證。
- 移至客戶端電腦(待命前端節點),然後瀏覽至
~/ssl
資料夾。 將已簽署的憑證複製到客戶端電腦。
會提供每個步驟的詳細數據。
登入客戶端電腦(待命前端節點)。
ssh sshuser@HeadNode1_Name
拿掉任何現有的ssl目錄。
rm -R ~/ssl mkdir ssl cd ssl
建立 Java 金鑰存放區並建立憑證簽署要求。
keytool -genkey -keystore kafka.client.keystore.jks -validity 365 -storepass "MyClientPassword123" -keypass "MyClientPassword123" -dname "CN=HEADNODE1_FQDN" -storetype pkcs12 keytool -keystore kafka.client.keystore.jks -certreq -file client-cert-sign-request -storepass "MyClientPassword123" -keypass "MyClientPassword123"
將憑證簽署要求複製到CA
scp client-cert-sign-request sshuser@HeadNode0_Name:~/ssl/client-cert-sign-request
切換至 CA 計算機(作用中前端節點),並簽署客戶端憑證。
ssh sshuser@HeadNode0_Name cd ssl openssl x509 -req -CA ca-cert -CAkey ca-key -in ~/ssl/client-cert-sign-request -out ~/ssl/client-cert-signed -days 365 -CAcreateserial -passin pass:MyClientPassword123
將已簽署的用戶端憑證從 CA(作用中前端節點)複製到用戶端電腦。
scp client-cert-signed sshuser@HeadNode1_Name:~/ssl/client-signed-cert
將 ca-cert 複製到用戶端電腦
scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert
- 登入客戶端電腦(待命前端節點),並流覽至 ssl 目錄。
ssh sshuser@HeadNode1_Name cd ssl
建立具有已簽署憑證的用戶端存放區、將 CA 憑證匯入密鑰存放區,以及客戶端電腦上的信任存放區 (hn1):
keytool -keystore kafka.client.truststore.jks -alias CARoot -import -file ca-cert -storepass "MyClientPassword123" -keypass "MyClientPassword123" -noprompt keytool -keystore kafka.client.keystore.jks -alias CARoot -import -file ca-cert -storepass "MyClientPassword123" -keypass "MyClientPassword123" -noprompt keytool -keystore kafka.client.keystore.jks -import -file client-signed-cert -storepass "MyClientPassword123" -keypass "MyClientPassword123" -noprompt
在用戶端電腦上建立檔案
client-ssl-auth.properties
(hn1)。 它應該有下列幾行:security.protocol=SSL ssl.truststore.location=/home/sshuser/ssl/kafka.client.truststore.jks ssl.truststore.password=MyClientPassword123 ssl.keystore.location=/home/sshuser/ssl/kafka.client.keystore.jks ssl.keystore.password=MyClientPassword123 ssl.key.password=MyClientPassword123
- 若要使用 TLS 1.3 將下列組態新增至檔案
client-ssl-auth.properties
ssl.enabled.protocols=TLSv1.3 ssl.protocol=TLSv1.3
- 若要使用 TLS 1.3 將下列組態新增至檔案
驗證
在用戶端電腦上執行這些步驟。
注意
如果已安裝 HDInsight 4.0 和 Kafka 2.1,您可以使用控制台產生者/取用者來驗證您的設定。 如果沒有,請在埠 9092 上執行 Kafka 產生者,並將訊息傳送至主題,然後在使用 TLS 的埠 9093 上使用 Kafka 取用者。
Kafka 2.1 或更新版本
如果主題不存在,請建立主題。
/usr/hdp/current/kafka-broker/bin/kafka-topics.sh --zookeeper <ZOOKEEPER_NODE>:2181 --create --topic topic1 --partitions 2 --replication-factor 2
啟動主控台產生者,並提供 作為產生者組態檔的路徑
client-ssl-auth.properties
。/usr/hdp/current/kafka-broker/bin/kafka-console-producer.sh --broker-list <FQDN_WORKER_NODE>:9093 --topic topic1 --producer.config ~/ssl/client-ssl-auth.properties
開啟另一個與用戶端計算機的 SSH 連線,然後啟動主控台取用者,並提供 作為取用者的組態檔的路徑
client-ssl-auth.properties
。/usr/hdp/current/kafka-broker/bin/kafka-console-consumer.sh --bootstrap-server <FQDN_WORKER_NODE>:9093 --topic topic1 --consumer.config ~/ssl/client-ssl-auth.properties --from-beginning