Einrichten von TLS-Verschlüsselung und -Authentifizierung für Apache Kafka-Cluster ohne ESP in Azure HDInsight

In diesem Artikel erfahren Sie, wie Sie TLS-Verschlüsselung (Transport Layer Security), vormals als SSL-Verschlüsselung (Secure Sockets Layer) bezeichnet, zwischen Apache Kafka-Clients und Apache Kafka-Brokern einrichten. Sie erfahren außerdem, wie Sie die Authentifizierung von Clients einrichten (auch als bidirektionale TLS bezeichnet).

Wichtig

Es gibt zwei Clients, die Sie für Kafka-Anwendungen verwenden können: einen Java-Client und einen Konsolenclient. Nur der Java-Client ProducerConsumer.java kann TLS sowohl zum Erzeugen als auch zum Nutzen verwenden. Der Konsolenproducerclient console-producer.sh funktioniert nicht mit TLS.

Einrichtung des Apache Kafka-Brokers

Das Kafka-TLS-Brokersetup verwendet vier HDInsight-Cluster-VMs auf folgende Weise:

  • Hauptknoten 0 – Zertifizierungsstelle (Certificate Authority, CA)
  • Workerknoten 0, 1 und 2 – Broker

Hinweis

Diese Anleitung verwendet selbstsignierte Zertifikate, aber die sicherste Lösung ist die Verwendung von Zertifikaten, die von vertrauenswürdigen Zertifizierungsstellen ausgestellt wurden.

Die Zusammenfassung des Brokereinrichtungsvorgangs lautet wie folgt:

  1. Die folgenden Schritte werden auf jedem der drei Workerknoten wiederholt:

    1. Generieren eines Zertifikats.
    2. Erstellen einer Anforderung zur Zertifikatsignierung.
    3. Senden der Anforderung zur Zertifikatsignierung an die Zertifizierungsstelle (ZS).
    4. Anmelden bei der Zertifizierungsstelle und Signieren des Zertifikats.
    5. Zurücksenden des signierten Zertifikats mit SCP auf den Workerknoten.
    6. Senden des öffentlichen Zertifikats der ZS mit SCP an den Workerknoten.
  2. Sobald Sie über alle Zertifikate verfügen, legen Sie die Zertifikate im Zertifikatspeicher ab.

  3. Navigieren Sie zu Ambari, und ändern Sie die Konfigurationen.

    Schließen Sie die Brokereinrichtung mit folgenden detaillierten Anweisungen ab:

    Wichtig

    In den folgenden Codeausschnitten ist wnX eine Abkürzung für einen der drei Workerknoten und sollte entsprechend durch wn0, wn1 oder wn2 ersetzt werden. WorkerNode0_Name und HeadNode0_Name sollten durch die Namen der entsprechenden Computer ersetzt werden.

  4. Führen Sie das anfängliche Setup auf Hauptknoten 0 durch, der für HDInsight die Rolle der Zertifizierungsstelle (ZS) übernimmt.

    # Create a new directory 'ssl' and change into it
    mkdir ssl
    cd ssl
    
  5. Führen Sie das gleiche anfängliche Setup für jeden der Broker durch (Workerknoten 0, 1 und 2).

    # Create a new directory 'ssl' and change into it
    mkdir ssl
    cd ssl
    
  6. Führen Sie auf allen Workerknoten mithilfe des Codeausschnitts die folgenden Schritte aus:

    1. Erstellen Sie einen Keystore, und füllen Sie ihn mit einem neuen privaten Zertifikat.
    2. Erstellen Sie eine Anforderung zur Zertifikatsignierung.
    3. Senden Sie die Anforderung zur Zertifikatsignierung mit SCP an die Zertifizierungsstelle (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
    

    Hinweis

    FQDN_WORKER_NODE ist der vollqualifizierte Domänenname des Workerknotencomputers. Sie können diese Details aus der Datei „/etc/hosts“ im Hauptknoten abrufen.

    Beispiel:

    wn0-espkaf.securehadooprc.onmicrosoft.com
    wn0-kafka2.zbxwnwsmpcsuvbjqbmespcm1zg.bx.internal.cloudapp.net
    

    Screenshot zeigt die Ausgabe der Datei „Hosts“.

  7. Führen Sie auf dem ZS-Computer den folgenden Befehl aus, um die Dateien „ca-cert“ und „ca-key“ zu erstellen:

    openssl req -new -newkey rsa:4096 -days 365 -x509 -subj "/CN=Kafka-Security-CA" -keyout ca-key -out ca-cert -nodes
    
  8. Wechseln Sie zum ZS-Computer, und lassen Sie alle empfangenen Anforderungen zur Zertifikatsignierung ausführen:

    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. Senden Sie die signierten Zertifikate von der ZS (headnode0) zurück an die Workerknoten.

    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. Senden Sie das öffentliche Zertifikat der ZS an die einzelnen Workerknoten.

    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. Fügen Sie auf jedem Workerknoten das öffentliche Zertifikat der ZS dem Truststore und dem Keystore hinzu. Fügen Sie dann das eigene signierte Zertifikat des Workerknotens dem Keystore hinzu.

    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
    
    

Aktualisieren der Kafka-Konfiguration zur Verwendung von TLS und Neustarten der Broker

Sie haben jetzt jeden Kafka-Broker mit einem Keystore und Truststore eingerichtet sowie die richtigen Zertifikate importiert. Ändern Sie nun die zugehörigen Kafka-Konfigurationseigenschaften mit Ambari, und starten Sie die Kafka-Broker dann neu.

Führen Sie die folgenden Schritte aus, um die Konfigurationsänderung abzuschließen:

  1. Melden Sie sich im Azure-Portal an, und wählen Sie Ihren Azure HDInsight Apache Kafka-Cluster aus.

  2. Wechseln Sie in die Ambari-Benutzeroberfläche, indem Sie unter Clusterdashboards auf Ambari Home klicken.

  3. Legen Sie unter Kafka-Broker die Eigenschaft Listener auf PLAINTEXT://localhost:9092,SSL://localhost:9093 fest.

  4. Legen Sie unter Erweiterter Kafka-Broker die Eigenschaft security.inter.broker.protocol auf SSL fest.

    Bearbeiten von Kafka-SSL-Konfigurationseigenschaften in Ambari.

  5. Legen Sie unter Benutzerdefinierter Kafka-Broker die Eigenschaft ssl.client.auth auf required fest.

    Hinweis

    Hinweis: Dieser Schritt ist nur erforderlich, wenn Sie sowohl die Authentifizierung als auch die Verschlüsselung einrichten.

    Bearbeiten von Kafka-SSL-Konfigurationseigenschaften in Ambari.

  6. Der folgende Screenshot zeigt diese Änderungen auf der Ambari-Konfigurationsoberfläche.

    Hinweis

    1. ssl.keystore.location und ssl.truststore.location ist der vollständige Pfad Ihres Keystore- und Truststore-Speicherorts in der Zertifizierungsstelle (hn0)
    2. ssl.keystore.password und ssl.truststore.password ist der Kennwortsatz, der für den Keystore und den Truststore festgelegt ist. In diesem Fall als Beispiel MyServerPassword123
    3. ssl.key.password ist der Schlüsselsatz für den Keystore und den Vertrauensspeicher. In diesem Fall als Beispiel MyServerPassword123
  7. So verwenden Sie TLS 1.3 in Kafka

    Hinzufügen der folgenden Konfigurationen zu den Kafka-Konfigurationen in Ambari

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

    Wichtig

    1. TLS 1.3 funktioniert nur mit der Kafka-Version HDI 5.1.
    2. Wenn Sie TLS 1.3 auf Serverseite verwenden, sollten Sie auch auf dem Client TLS 1.3-Konfigurationen verwenden.
  8. Für HDI, Version 4.0 oder 5.0

    1. Wenn Sie sowohl die Authentifizierung als auch die Verschlüsselung einrichten, dann sieht der Screenshot aus wie

    Bearbeiten der Vorlageneigenschaft „kafka-env“ in Ambari vier.

    1. Wenn Sie nur die Verschlüsselung einrichten, sieht der Screenshot wie folgt aus:

    Screenshot zeigt, wie das Vorlageneigenschaftsfeld „kafka-env“ in Ambari nur für die Verschlüsselung bearbeitet wird.

  9. Starten Sie alle Kafka-Broker neu.

Einrichten des Clients (ohne Authentifizierung)

Wenn Sie keine Authentifizierung benötigen, finden Sie im Anschluss eine Zusammenfassung der Schritte zum ausschließlichen Einrichten der TLS-Verschlüsselung:

  1. Melden Sie sich bei der Zertifizierungsstelle (aktiver Hauptknoten) an.
  2. Kopieren Sie das ZS-Zertifikat vom ZS-Computer (wn0) auf den Clientcomputer.
  3. Melden Sie sich beim Clientcomputer (hn1) an, und navigieren Sie zum Ordner ~/ssl.
  4. Importieren Sie das Zertifizierungsstellenzertifikat in den Truststore.
  5. Importieren Sie das ZS-Zertifikat in den Keystore.

Diese Schritte werden in den folgenden Codeausschnitten genauer beschrieben:

  1. Melden Sie sich beim Zertifizierungsstellenknoten an:

    ssh sshuser@HeadNode0_Name
    cd ssl
    
  2. Kopieren Sie das Zertifizierungsstellenzertifikat auf den Clientcomputer.

    scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert
    
  3. Melden Sie sich beim Clientcomputer (Standbyhauptknoten) an.

    ssh sshuser@HeadNode1_Name
    cd ssl
    
  4. Importieren Sie das Zertifizierungsstellenzertifikat in den Truststore.

    keytool -keystore kafka.client.truststore.jks -alias CARoot -import -file ca-cert -storepass "MyClientPassword123" -keypass "MyClientPassword123" -noprompt
    
  5. Importieren des ZS-Zertifikats in Keystore.

    keytool -keystore kafka.client.keystore.jks -alias CARoot -import -file ca-cert -storepass "MyClientPassword123" -keypass "MyClientPassword123" -noprompt
    
  6. Erstellen Sie die Datei client-ssl-auth.properties auf dem Clientcomputer (hn1). Die Datei sollte folgende Zeilen enthalten:

    security.protocol=SSL
    ssl.truststore.location=/home/sshuser/ssl/kafka.client.truststore.jks
    ssl.truststore.password=MyClientPassword123
    
    1. Um TLS 1.3 zu verwenden, fügen Sie der Datei client-ssl-auth.properties folgende Konfigurationen hinzu:
    ssl.enabled.protocols=TLSv1.3
    ssl.protocol=TLSv1.3
    
  7. Starten Sie den Adminclient mit Producer- und Consumer Optionen, um sicherzustellen, dass sowohl Producer als auch Consumer and Port 9093 funktionieren. Informationen zu den erforderlichen Schritten zum Überprüfen des Setups mit dem Konsolenproducer/-consumer finden Sie im Abschnitt Überprüfung.

Einrichten des Clients (mit Authentifizierung)

Hinweis

Die folgenden Schritte sind nur erforderlich, wenn Sie TLS-Verschlüsselung und Authentifizierung einrichten. Wenn Sie nur Verschlüsselung einrichten, lesen Sie die Informationen unter Einrichten des Clients (ohne Authentifizierung).

In den folgenden vier Schritten werden die Aufgaben zusammengefasst, die zum Ausführen des Clientsetups erforderlich sind:

  1. Melden Sie sich beim Clientcomputer (Standbyhauptknoten) an.
  2. Erstellen Sie einen Java-Keystore, und rufen Sie ein signiertes Zertifikat für den Broker ab. Kopieren Sie dann das Zertifikat auf den virtuellen Computer, auf dem die Zertifizierungsstelle ausgeführt wird.
  3. Wechseln Sie zum Zertifizierungsstellencomputer (aktiver Hauptknoten), um das Clientzertifikat zu signieren.
  4. Wechseln Sie zum Clientcomputer (Standbyhauptknoten), und navigieren Sie zum Ordner ~/ssl. Kopieren Sie das signierte Zertifikat auf den Clientcomputer.

Die Details zu den einzelnen Schritten sind angegeben.

  1. Melden Sie sich beim Clientcomputer (Standbyhauptknoten) an.

    ssh sshuser@HeadNode1_Name
    
  2. Entfernen Sie alle vorhandenen SSL-Verzeichnisse.

    rm -R ~/ssl
    mkdir ssl
    cd ssl
    
  3. Erstellen Sie einen Java-Keystore und eine Zertifikatsignieranforderung.

    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. Kopieren Sie die Zertifikatsignieranforderung in die Zertifizierungsstelle.

    scp client-cert-sign-request sshuser@HeadNode0_Name:~/ssl/client-cert-sign-request
    
  5. Wechseln Sie zum Zertifizierungsstellencomputer (aktiver Hauptknoten), und signieren Sie das Clientzertifikat.

    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. Kopieren Sie das signierte Clientzertifikat von der Zertifizierungsstelle (aktiver Hauptknoten) auf den Clientcomputer.

    scp client-cert-signed sshuser@HeadNode1_Name:~/ssl/client-signed-cert
    
  7. Kopieren Sie das Zertifizierungsstellenzertifikat auf den Clientcomputer.

    scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert
    
    1. Melden Sie sich beim Clientcomputer (Standbyhauptknoten) an, und navigieren Sie zum SSL-Verzeichnis.
    ssh sshuser@HeadNode1_Name
    cd ssl
    
  8. Erstellen Sie den Clientspeicher mit einem signierten Zertifikat, und importieren Sie das Zertifizierungsstellenzertifikat in den Keystore und den Truststore auf den Clientcomputer (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. Erstellen Sie eine Datei client-ssl-auth.properties auf dem Clientcomputer (hn1). Die Datei sollte folgende Zeilen enthalten:

    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. Um TLS 1.3 zu verwenden, fügen Sie der Datei client-ssl-auth.properties folgende Konfigurationen hinzu:
    ssl.enabled.protocols=TLSv1.3
    ssl.protocol=TLSv1.3
    

Überprüfung

Führen Sie diese Schritte auf dem Clientcomputer aus.

Hinweis

Wenn HDInsight 4.0 und Kafka 2.1 installiert sind, können Sie Ihr Setup mit dem Konsolenproducer/-consumer überprüfen. Führen Sie andernfalls den Kafka-Producer an Port 9092 aus, und senden Sie Nachrichten an das Thema. Verwenden Sie anschließend den Kafka-Consumer an Port 9093 (nutzt TLS).

Kafka 2.1 oder höher

  1. Erstellen Sie ein Thema, sofern noch nicht vorhanden.

    /usr/hdp/current/kafka-broker/bin/kafka-topics.sh --zookeeper <ZOOKEEPER_NODE>:2181 --create --topic topic1 --partitions 2 --replication-factor 2
    
  2. Starten Sie den Konsolenproducer, und geben Sie den Pfad zu client-ssl-auth.properties als Konfigurationsdatei für den Producer an.

    /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. Öffnen Sie eine andere SSH-Verbindung mit dem Clientcomputer, starten Sie den Konsolenconsumer, und geben Sie den Pfad zu client-ssl-auth.properties als Konfigurationsdatei für den Consumer an.

    /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
    

Nächste Schritte