Freigeben über


Einrichten der TLS-Verschlüsselung und -Authentifizierung für ESP Apache Kafka-Cluster 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 „Host“.

  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,SASL_SSL://localhost:9093 fest.

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

    Screenshot, der die Bearbeitung der Kafka-Konfigurationseigenschaften in Ambari zeigt.

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

    Hinweis

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

    Screenshot zeigt das Bearbeiten der 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. Um TLS 1.3 in Kafka zu verwenden, fügen Sie die folgenden Konfigurationen zu den Kafka-Konfigurationen in Ambari hinzu.

    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 TLS 1.3-Konfigurationen auf dem Client 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

      Screenshot zeigt, wie die Kafka-ENV-Vorlageneigenschaft in der Ambari-Authentifizierung auf „erforderlich“ geändert wird.

    2. Wenn Sie nur die Verschlüsselung einrichten, dann sieht der Screenshot aus wie

      Screenshot zeigt, wie die Kafka-ENV-Vorlageneigenschaft in der Ambari-Authentifizierung auf „keine“ geändert 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 Zertifizierungsstellenzertifikat vom Computer der Zertifizierungsstelle (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 Zertifizierungsstellenzertifikat 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 Sie das Zertifizierungsstellenzertifikat in den 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=SASL_SSL
    sasl.mechanism=GSSAPI
    sasl.kerberos.service.name=kafka
    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 ZS-Zertifikat in den Keystore und den Truststore auf dem 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=SASL_SSL
    sasl.mechanism=GSSAPI
    sasl.kerberos.service.name=kafka
    
    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

Hinweis

Die nachfolgenden Befehle funktionieren, wenn Sie entweder einen kafka-Benutzer oder einen benutzerdefinierten Benutzer verwenden, der über Zugriff für CRUD-Vorgänge verfügt.

Screenshot: Bereitstellen von Zugriff auf CRUD-Vorgänge

Verwenden des Befehlszeilentools

  1. Überprüfen Sie unbedingt das lokale Kerberos-Ticket für benutzerdefinierte Benutzer, die Sie zum Übermitteln von Befehlen verwenden möchten.

  2. klist

    Wenn das Ticket vorhanden ist, können Sie fortfahren. Generieren Sie andernfalls mithilfe des folgenden Befehls ein Kerberos-Prinzip und eine Schlüsseltabelle.

  3. ktutil

    ktutil: addent -password -p espkafkauser@TEST.COM -k 1 -e RC4-HMAC 
    Password for espkafkauser@TEST.COM: 
    ktutil: wkt user1.keytab 
    ktutil: q 
    kinit –kt espkafkauser.keytab espkafkauser@TEST.COM 
    
  4. klist erneut, um das zwischengespeicherte Kerberos-Ticket zu überprüfen.

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

    sudo su kafka –c "/usr/hdp/current/kafka-broker/bin/kafka-topics.sh --zookeeper <ZOOKEEPER_NODE>:2181 --create --topic topic1 --partitions 2 --replication-factor 2"
    

    Erstellen Sie zum Verwenden einer Schlüsseltabelle eine Schlüsseltabellendatei mit dem folgendem Inhalt. Achten Sie darauf, dass Sie in der Eigenschaft „Keytab“ auf Ihre Schlüsseltabellendatei verweisen, und verweisen Sie auf den in der Schlüsseltabelle verwendeten Prinzipal. Hier finden Sie eine JAAS-Beispieldatei, die erstellt und am folgenden Speicherort auf der VM platziert wurde: /home/sshuser/kafka_client_jaas_keytab.conf

    KafkaClient { 
       com.sun.security.auth.module.Krb5LoginModule required
       useKeyTab=true
       storeKey=true
       keyTab="/home/sshuser/espkafkauser.keytab"
       principal="espkafkauser@TEST.COM";
    };
    
  6. Starten Sie den Konsolenproducer, und geben Sie den Pfad zu client-ssl-auth.properties als Konfigurationsdatei für den Producer an.

     export KAFKA_OPTS="-Djava.security.auth.login.config=/home/hdiuser/kafka_client_jaas_keytab.conf"
    
    /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
    
  7. Ö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.

    export KAFKA_OPTS="-Djava.security.auth.login.config=/home/sshuser/kafka_client_jaas_keytab.conf"
    
    /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
    

Wenn Sie für CRUD-Vorgänge den Java-Client verwenden möchten, verwenden Sie das folgende GitHub-Repository:

https://github.com/Azure-Samples/hdinsight-kafka-java-get-started/tree/main/DomainJoined-Producer-Consumer-With-TLS

Nächste Schritte