在 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 所簽發的憑證。

訊息代理程式安裝程式的摘要如下所示:

  1. 下列步驟會在三個背景工作節點上重複執行:

    1. 產生憑證。
    2. 建立憑證簽署要求。
    3. 將憑證簽署要求傳送至證書頒發機構單位 (CA)。
    4. 登入 CA 並簽署要求。
    5. SCP 簽署的憑證回到背景工作節點。
    6. SCP 對背景工作節點的 CA 公開憑證。
  2. 一旦您擁有所有憑證,請將憑證放入憑證存放區。

  3. 移至Ambari並變更組態。

    使用下列詳細指示來完成訊息代理程式設定:

    重要

    在下列代碼段中,wnX 是三個背景工作節點之一的縮寫,應適當地取代為 wn0wn1wn2WorkerNode0_NameHeadNode0_Name 應該以個別計算機的名稱取代。

  4. 在前端節點 0 上執行初始設定,HDInsight 會填滿證書頒發機構單位 (CA) 的角色。

    # Create a new directory 'ssl' and change into it
    mkdir ssl
    cd ssl
    
  5. 在每個訊息代理程式上執行相同的初始設定(背景工作節點 0、1 和 2)。

    # Create a new directory 'ssl' and change into it
    mkdir ssl
    cd ssl
    
  6. 在每個背景工作節點上,使用代碼段執行下列步驟。

    1. 建立金鑰存放區,並填入新的私人憑證。
    2. 建立憑證簽署要求。
    3. 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
    

    顯示主機檔案輸出的螢幕快照。

  7. 在 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
    
  8. 變更為 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"
    
  9. 將已簽署的憑證從 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
    
  10. 將 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
    
  11. 在每個背景工作節點上,將 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訊息代理程式。

若要完成組態修改,請執行下列步驟:

  1. 登入 Azure 入口網站,然後選取您的 Azure HDInsight Apache Kafka 叢集。

  2. 單擊 [叢集儀錶板] 底下的 [Ambari 首頁] 以移至 Ambari UI。

  3. 在 Kafka Broker,將接聽程式屬性設定為PLAINTEXT://localhost:9092,SSL://localhost:9093

  4. 在 [進階 kafka-broker] 底下,將 security.inter.broker.protocol 屬性設定為SSL

    在Ambari中編輯Kafka ssl組態屬性。

  5. 在 [自定義 kafka-broker] 下,將 ssl.client.auth 屬性設定為 required

    注意

    注意:只有在您設定驗證和加密時,才需要此步驟。

    在Ambari中編輯kafka ssl 組態屬性。

  6. 以下是顯示具有這些變更之Ambari設定UI的螢幕快照。

    注意

    1. ssl.keystore.location 和 ssl.truststore.location 是證書頒發機構單位中密鑰存放區、信任存放區位置的完整路徑(hn0)
    2. ssl.keystore.password 和 ssl.truststore.password 是密鑰存放區和信任存放區的密碼集。 在此案例中,例如 MyServerPassword123
    3. ssl.key.password 是金鑰存放區和信任存放區的密鑰集。 在此案例中,例如 MyServerPassword123
  7. 在 Kafka 中使用 TLS 1.3

    將下列設定新增至Ambari中的kafka組態

    1. ssl.enabled.protocols=TLSv1.3
    2. ssl.protocol=TLSv1.3

    重要

    1. TLS 1.3 僅適用於 HDI 5.1 kafka 版本。
    2. 如果您在伺服器端使用 TLS 1.3,則也應該在用戶端使用 TLS 1.3 設定。
  8. 針對 HDI 4.0 版或 5.0 版

    1. 如果您要設定驗證和加密,則螢幕快照看起來會像這樣

    在Ambari 4中編輯kafka-env樣本屬性。

    1. 如果您只設定加密,則螢幕快照看起來會像這樣

    顯示如何在Ambari中編輯kafka-env範本屬性欄位以進行加密的螢幕快照。

  9. 重新啟動所有 Kafka 訊息代理程式。

用戶端設定 (沒有驗證)

如果您不需要驗證,僅設定 TLS 加密的步驟摘要如下:

  1. 登入 CA (作用中前端節點)。
  2. 從 CA 計算機將 CA 憑證複製到用戶端電腦(wn0)。
  3. 登入客戶端電腦 (hn1),並瀏覽至 ~/ssl 資料夾。
  4. 將 CA 憑證匯入至信任存放區。
  5. 將 CA 憑證匯入金鑰存放區。

下列步驟詳述於下列代碼段。

  1. 登入 CA 節點。

    ssh sshuser@HeadNode0_Name
    cd ssl
    
  2. 將 ca-cert 複製到用戶端電腦

    scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert
    
  3. 登入客戶端電腦(待命前端節點)。

    ssh sshuser@HeadNode1_Name
    cd ssl
    
  4. 將 CA 憑證匯入至信任存放區。

    keytool -keystore kafka.client.truststore.jks -alias CARoot -import -file ca-cert -storepass "MyClientPassword123" -keypass "MyClientPassword123" -noprompt
    
  5. 將 CA 憑證匯入金鑰存放區。

    keytool -keystore kafka.client.keystore.jks -alias CARoot -import -file ca-cert -storepass "MyClientPassword123" -keypass "MyClientPassword123" -noprompt
    
  6. 在用戶端電腦上建立檔案 client-ssl-auth.properties (hn1)。 它應該有下列幾行:

    security.protocol=SSL
    ssl.truststore.location=/home/sshuser/ssl/kafka.client.truststore.jks
    ssl.truststore.password=MyClientPassword123
    
    1. 若要使用 TLS 1.3 將下列組態新增至檔案 client-ssl-auth.properties
    ssl.enabled.protocols=TLSv1.3
    ssl.protocol=TLSv1.3
    
  7. 使用生產者和取用者選項啟動系統管理用戶端,以確認生產者和取用者都在埠 9093 上運作。 如需使用主控台產生者/取用者驗證設定所需的步驟,請參閱驗證一節。

用戶端設定 (使用驗證)

注意

只有在您同時設定 TLS 加密 驗證時,才需要下列步驟。 如果您只設定加密,請參閱 客戶端設定而不進行驗證

下列四個步驟摘要說明完成用戶端設定所需的工作:

  1. 登入客戶端電腦(待命前端節點)。
  2. 建立 Java 金鑰存放區並取得訊息代理程式簽署的憑證。 然後將憑證複製到 CA 執行所在的 VM。
  3. 切換至 CA 計算機(作用中前端節點),以簽署客戶端憑證。
  4. 移至客戶端電腦(待命前端節點),然後瀏覽至 ~/ssl 資料夾。 將已簽署的憑證複製到客戶端電腦。

會提供每個步驟的詳細數據。

  1. 登入客戶端電腦(待命前端節點)。

    ssh sshuser@HeadNode1_Name
    
  2. 拿掉任何現有的ssl目錄。

    rm -R ~/ssl
    mkdir ssl
    cd ssl
    
  3. 建立 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"
    
  4. 將憑證簽署要求複製到CA

    scp client-cert-sign-request sshuser@HeadNode0_Name:~/ssl/client-cert-sign-request
    
  5. 切換至 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
    
  6. 將已簽署的用戶端憑證從 CA(作用中前端節點)複製到用戶端電腦。

    scp client-cert-signed sshuser@HeadNode1_Name:~/ssl/client-signed-cert
    
  7. 將 ca-cert 複製到用戶端電腦

    scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert
    
    1. 登入客戶端電腦(待命前端節點),並流覽至 ssl 目錄。
    ssh sshuser@HeadNode1_Name
    cd ssl
    
  8. 建立具有已簽署憑證的用戶端存放區、將 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
    
  9. 在用戶端電腦上建立檔案 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
    
    1. 若要使用 TLS 1.3 將下列組態新增至檔案 client-ssl-auth.properties
    ssl.enabled.protocols=TLSv1.3
    ssl.protocol=TLSv1.3
    

驗證

在用戶端電腦上執行這些步驟。

注意

如果已安裝 HDInsight 4.0 和 Kafka 2.1,您可以使用控制台產生者/取用者來驗證您的設定。 如果沒有,請在埠 9092 上執行 Kafka 產生者,並將訊息傳送至主題,然後在使用 TLS 的埠 9093 上使用 Kafka 取用者。

Kafka 2.1 或更新版本

  1. 如果主題不存在,請建立主題。

    /usr/hdp/current/kafka-broker/bin/kafka-topics.sh --zookeeper <ZOOKEEPER_NODE>:2181 --create --topic topic1 --partitions 2 --replication-factor 2
    
  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
    
  3. 開啟另一個與用戶端計算機的 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
    

下一步