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:
Die folgenden Schritte werden auf jedem der drei Workerknoten wiederholt:
- Generieren eines Zertifikats.
- Erstellen einer Anforderung zur Zertifikatsignierung.
- Senden der Anforderung zur Zertifikatsignierung an die Zertifizierungsstelle (ZS).
- Anmelden bei der Zertifizierungsstelle und Signieren des Zertifikats.
- Zurücksenden des signierten Zertifikats mit SCP auf den Workerknoten.
- Senden des öffentlichen Zertifikats der ZS mit SCP an den Workerknoten.
Sobald Sie über alle Zertifikate verfügen, legen Sie die Zertifikate im Zertifikatspeicher ab.
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
oderwn2
ersetzt werden.WorkerNode0_Name
undHeadNode0_Name
sollten durch die Namen der entsprechenden Computer ersetzt werden.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
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
Führen Sie auf allen Workerknoten mithilfe des Codeausschnitts die folgenden Schritte aus:
- Erstellen Sie einen Keystore, und füllen Sie ihn mit einem neuen privaten Zertifikat.
- Erstellen Sie eine Anforderung zur Zertifikatsignierung.
- 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
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
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"
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
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
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:
Melden Sie sich im Azure-Portal an, und wählen Sie Ihren Azure HDInsight Apache Kafka-Cluster aus.
Wechseln Sie in die Ambari-Benutzeroberfläche, indem Sie unter Clusterdashboards auf Ambari Home klicken.
Legen Sie unter Kafka-Broker die Eigenschaft Listener auf
PLAINTEXT://localhost:9092,SSL://localhost:9093
fest.Legen Sie unter Erweiterter Kafka-Broker die Eigenschaft security.inter.broker.protocol auf
SSL
fest.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.
Der folgende Screenshot zeigt diese Änderungen auf der Ambari-Konfigurationsoberfläche.
Hinweis
- ssl.keystore.location und ssl.truststore.location ist der vollständige Pfad Ihres Keystore- und Truststore-Speicherorts in der Zertifizierungsstelle (hn0)
- 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
- ssl.key.password ist der Schlüsselsatz für den Keystore und den Vertrauensspeicher. In diesem Fall als Beispiel
MyServerPassword123
So verwenden Sie TLS 1.3 in Kafka
Hinzufügen der folgenden Konfigurationen zu den Kafka-Konfigurationen in Ambari
ssl.enabled.protocols=TLSv1.3
ssl.protocol=TLSv1.3
Wichtig
- TLS 1.3 funktioniert nur mit der Kafka-Version HDI 5.1.
- Wenn Sie TLS 1.3 auf Serverseite verwenden, sollten Sie auch auf dem Client TLS 1.3-Konfigurationen verwenden.
Für HDI, Version 4.0 oder 5.0
- Wenn Sie sowohl die Authentifizierung als auch die Verschlüsselung einrichten, dann sieht der Screenshot aus wie
- Wenn Sie nur die Verschlüsselung einrichten, sieht der Screenshot wie folgt aus:
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:
- Melden Sie sich bei der Zertifizierungsstelle (aktiver Hauptknoten) an.
- Kopieren Sie das ZS-Zertifikat vom ZS-Computer (wn0) auf den Clientcomputer.
- Melden Sie sich beim Clientcomputer (hn1) an, und navigieren Sie zum Ordner
~/ssl
. - Importieren Sie das Zertifizierungsstellenzertifikat in den Truststore.
- Importieren Sie das ZS-Zertifikat in den Keystore.
Diese Schritte werden in den folgenden Codeausschnitten genauer beschrieben:
Melden Sie sich beim Zertifizierungsstellenknoten an:
ssh sshuser@HeadNode0_Name cd ssl
Kopieren Sie das Zertifizierungsstellenzertifikat auf den Clientcomputer.
scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert
Melden Sie sich beim Clientcomputer (Standbyhauptknoten) an.
ssh sshuser@HeadNode1_Name cd ssl
Importieren Sie das Zertifizierungsstellenzertifikat in den Truststore.
keytool -keystore kafka.client.truststore.jks -alias CARoot -import -file ca-cert -storepass "MyClientPassword123" -keypass "MyClientPassword123" -noprompt
Importieren des ZS-Zertifikats in Keystore.
keytool -keystore kafka.client.keystore.jks -alias CARoot -import -file ca-cert -storepass "MyClientPassword123" -keypass "MyClientPassword123" -noprompt
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
- 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
- Um TLS 1.3 zu verwenden, fügen Sie der Datei
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:
- Melden Sie sich beim Clientcomputer (Standbyhauptknoten) an.
- 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.
- Wechseln Sie zum Zertifizierungsstellencomputer (aktiver Hauptknoten), um das Clientzertifikat zu signieren.
- 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.
Melden Sie sich beim Clientcomputer (Standbyhauptknoten) an.
ssh sshuser@HeadNode1_Name
Entfernen Sie alle vorhandenen SSL-Verzeichnisse.
rm -R ~/ssl mkdir ssl cd ssl
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"
Kopieren Sie die Zertifikatsignieranforderung in die Zertifizierungsstelle.
scp client-cert-sign-request sshuser@HeadNode0_Name:~/ssl/client-cert-sign-request
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
Kopieren Sie das signierte Clientzertifikat von der Zertifizierungsstelle (aktiver Hauptknoten) auf den Clientcomputer.
scp client-cert-signed sshuser@HeadNode1_Name:~/ssl/client-signed-cert
Kopieren Sie das Zertifizierungsstellenzertifikat auf den Clientcomputer.
scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert
- Melden Sie sich beim Clientcomputer (Standbyhauptknoten) an, und navigieren Sie zum SSL-Verzeichnis.
ssh sshuser@HeadNode1_Name cd ssl
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
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
- 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
- Um TLS 1.3 zu verwenden, fügen Sie der Datei
Ü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
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
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
Ö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