Konfigurera TLS-kryptering och autentisering för Apache Kafka-kluster som inte är ESP i Azure HDInsight
Den här artikeln visar hur du konfigurerar TLS-kryptering (Transport Layer Security), som tidigare kallades SSL-kryptering (Secure Sockets Layer), mellan Apache Kafka-klienter och Apache Kafka-koordinatorer. Den visar också hur du konfigurerar autentisering av klienter (kallas ibland dubbelriktad TLS).
Viktigt!
Det finns två klienter som du kan använda för Kafka-program: en Java-klient och en konsolklient. Endast Java-klienten ProducerConsumer.java
kan använda TLS för både produktion och användning. Konsolproducentklienten console-producer.sh
fungerar inte med TLS.
Konfiguration av Apache Kafka-koordinator
Konfigurationen av Kafka TLS-koordinatorn använder fyra virtuella HDInsight-klusterdatorer på följande sätt:
- headnode 0 – Certifikatutfärdare (CA)
- arbetsnod 0, 1 och 2 – koordinatorer
Kommentar
Den här guiden använder självsignerade certifikat, men den säkraste lösningen är att använda certifikat som utfärdats av betrodda certifikatutfärdare.
Sammanfattningen av konfigurationsprocessen för koordinatorn är följande:
Följande steg upprepas på var och en av de tre arbetsnoderna:
- Generera ett certifikat.
- Skapa en begäran om certifikatsignering.
- Skicka certifikatsigneringsbegäran till certifikatutfärdare (CA).
- Logga in på certifikatutfärdaradressen och signera begäran.
- SCP det signerade certifikatet tillbaka till arbetsnoden.
- SCP det offentliga certifikatet för certifikatutfärdare till arbetsnoden.
När du har alla certifikat placerar du certifikaten i certifikatarkivet.
Gå till Ambari och ändra konfigurationerna.
Använd följande detaljerade instruktioner för att slutföra konfigurationen av asynkrona meddelandeköer:
Viktigt!
I följande kodfragment är wnX en förkortning för en av de tre arbetsnoderna och bör ersättas med
wn0
,wn1
ellerwn2
efter behov.WorkerNode0_Name
ochHeadNode0_Name
bör ersättas med namnen på respektive datorer.Utför den första installationen på huvudnod 0, som för HDInsight fyller rollen som certifikatutfärdare (CA).
# Create a new directory 'ssl' and change into it mkdir ssl cd ssl
Utför samma inledande konfiguration på var och en av asynkrona koordinatorerna (arbetsnoderna 0, 1 och 2).
# Create a new directory 'ssl' and change into it mkdir ssl cd ssl
På var och en av arbetsnoderna kör du följande steg med hjälp av kodfragmentet.
- Skapa ett nyckelarkiv och fyll i det med ett nytt privat certifikat.
- Skapa en begäran om certifikatsignering.
- SCP certifikatsigneringsbegäran till CA:en (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
Kommentar
FQDN_WORKER_NODE är fullständigt kvalificerat domännamn för arbetsnoddatorn. Du kan hämta den informationen från /etc/hosts-filen i huvudnoden
Exempel:
wn0-espkaf.securehadooprc.onmicrosoft.com wn0-kafka2.zbxwnwsmpcsuvbjqbmespcm1zg.bx.internal.cloudapp.net
På CA-datorn kör du följande kommando för att skapa ca-cert- och ca-key-filer:
openssl req -new -newkey rsa:4096 -days 365 -x509 -subj "/CN=Kafka-Security-CA" -keyout ca-key -out ca-cert -nodes
Ändra till CA-datorn och signera alla mottagna certifikatsigneringsbegäranden:
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"
Skicka tillbaka de signerade certifikaten till arbetsnoderna från CA:en (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
Skicka certifikatutfärdarcertifikatutfärdarcertifikatet till varje arbetsnod.
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
På varje arbetsnod lägger du till certifikatutfärdares offentliga certifikat i förtroendearkivet och nyckelarkivet. Lägg sedan till arbetsnodens eget signerade certifikat i nyckelarkivet
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
Uppdatera Kafka-konfigurationen för att använda TLS och starta om asynkrona meddelandeköer
Nu har du konfigurerat varje Kafka-koordinator med ett nyckelarkiv och ett förtroendearkiv och importerat rätt certifikat. Ändra sedan relaterade Kafka-konfigurationsegenskaper med Ambari och starta sedan om Kafka-koordinatorerna.
Utför följande steg för att slutföra konfigurationsändringen:
Logga in på Azure-portalen och välj ditt Azure HDInsight Apache Kafka-kluster.
Gå till Ambari-användargränssnittet genom att klicka på Ambari home under Klusterinstrumentpaneler.
Under Kafka Broker anger du lyssnaregenskapen till
PLAINTEXT://localhost:9092,SSL://localhost:9093
Under Avancerad kafka-broker anger du egenskapen security.inter.broker.protocol till
SSL
Under Anpassad kafka-broker anger du egenskapen ssl.client.auth till
required
.Kommentar
Obs! Det här steget krävs bara om du konfigurerar autentisering och kryptering.
Här är skärmbilden som visar Ambari-konfigurationsgränssnittet med dessa ändringar.
Kommentar
- ssl.keystore.location och ssl.truststore.location är den fullständiga sökvägen för ditt nyckelarkiv, plats för förtroendearkiv i certifikatutfärdare (hn0)
- ssl.keystore.password och ssl.truststore.password är lösenordsuppsättningen för nyckelarkivet och förtroendearkivet. I det här fallet kan du till exempel
MyServerPassword123
- ssl.key.password är nyckeluppsättningen för nyckelarkivet och förtroendearkivet. I det här fallet kan du till exempel
MyServerPassword123
Så här använder du TLS 1.3 i Kafka
Lägg till följande konfigurationer i kafka-konfigurationerna i Ambari
ssl.enabled.protocols=TLSv1.3
ssl.protocol=TLSv1.3
Viktigt!
- TLS 1.3 fungerar endast med HDI 5.1 kafka-version.
- Om du använder TLS 1.3 på serversidan bör du också använda TLS 1.3-konfigurationer på klienten.
För HDI version 4.0 eller 5.0
- Om du konfigurerar autentisering och kryptering ser skärmbilden ut som
- Om du bara konfigurerar kryptering ser skärmbilden ut som
Starta om alla Kafka-asynkrona asynkrona meddelandeköer.
Klientkonfiguration (utan autentisering)
Om du inte behöver autentisering är sammanfattningen av stegen för att konfigurera endast TLS-kryptering:
- Logga in på CA:en (aktiv huvudnod).
- Kopiera CA-certifikatet till klientdatorn från CA-datorn (wn0).
- Logga in på klientdatorn (hn1) och navigera till
~/ssl
mappen. - Importera CA-certifikatet till förtroendearkivet.
- Importera CA-certifikatet till nyckelarkivet.
De här stegen beskrivs i följande kodfragment.
Logga in på CA-noden.
ssh sshuser@HeadNode0_Name cd ssl
Kopiera certifikatet till klientdatorn
scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert
Logga in på klientdatorn (väntelägeshuvudnod).
ssh sshuser@HeadNode1_Name cd ssl
Importera CA-certifikatet till förtroendearkivet.
keytool -keystore kafka.client.truststore.jks -alias CARoot -import -file ca-cert -storepass "MyClientPassword123" -keypass "MyClientPassword123" -noprompt
Importera CA-certifikatet till nyckelarkivet.
keytool -keystore kafka.client.keystore.jks -alias CARoot -import -file ca-cert -storepass "MyClientPassword123" -keypass "MyClientPassword123" -noprompt
Skapa filen
client-ssl-auth.properties
på klientdatorn (hn1). Den bör ha följande rader:security.protocol=SSL ssl.truststore.location=/home/sshuser/ssl/kafka.client.truststore.jks ssl.truststore.password=MyClientPassword123
- Så här använder du TLS 1.3 genom att lägga till följande konfigurationer i filen
client-ssl-auth.properties
ssl.enabled.protocols=TLSv1.3 ssl.protocol=TLSv1.3
- Så här använder du TLS 1.3 genom att lägga till följande konfigurationer i filen
Starta administratörsklienten med producent- och konsumentalternativ för att kontrollera att både producenter och konsumenter arbetar på port 9093. Se avsnittet Verifiering för de steg som krävs för att verifiera konfigurationen med hjälp av konsolproducent/konsument.
Klientkonfiguration (med autentisering)
Kommentar
Följande steg krävs endast om du konfigurerar både TLS-kryptering och autentisering. Om du bara konfigurerar kryptering kan du läsa Klientkonfiguration utan autentisering.
Följande fyra steg sammanfattar de uppgifter som krävs för att slutföra klientkonfigurationen:
- Logga in på klientdatorn (väntelägeshuvudnod).
- Skapa ett Java-nyckelarkiv och hämta ett signerat certifikat för asynkron meddelandekö. Kopiera sedan certifikatet till den virtuella dator där certifikatutfärdare körs.
- Växla till CA-datorn (aktiv huvudnod) för att signera klientcertifikatet.
- Gå till klientdatorn (väntelägeshuvudnod) och navigera till
~/ssl
mappen. Kopiera det signerade certifikatet till klientdatorn.
Information om varje steg ges.
Logga in på klientdatorn (väntelägeshuvudnod).
ssh sshuser@HeadNode1_Name
Ta bort alla befintliga SSL-kataloger.
rm -R ~/ssl mkdir ssl cd ssl
Skapa ett Java-nyckelarkiv och skapa en begäran om certifikatsignering.
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"
Kopiera begäran om certifikatsignering till certifikatutfärdare
scp client-cert-sign-request sshuser@HeadNode0_Name:~/ssl/client-cert-sign-request
Växla till CA-datorn (aktiv huvudnod) och signera klientcertifikatet.
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
Kopiera signerat klientcertifikat från certifikatutfärdare (aktiv huvudnod) till klientdatorn.
scp client-cert-signed sshuser@HeadNode1_Name:~/ssl/client-signed-cert
Kopiera certifikatet till klientdatorn
scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert
- Logga in på klientdatorn (väntelägeshuvudnod) och navigera till ssl-katalogen.
ssh sshuser@HeadNode1_Name cd ssl
Skapa klientarkiv med signerat certifikat, importera CA-certifikat till nyckelarkivet och förtroendearkivet på klientdatorn (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
Skapa en fil
client-ssl-auth.properties
på klientdatorn (hn1). Den bör ha följande rader: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
- Så här använder du TLS 1.3 genom att lägga till följande konfigurationer i filen
client-ssl-auth.properties
ssl.enabled.protocols=TLSv1.3 ssl.protocol=TLSv1.3
- Så här använder du TLS 1.3 genom att lägga till följande konfigurationer i filen
Verifiering
Kör de här stegen på klientdatorn.
Kommentar
Om HDInsight 4.0 och Kafka 2.1 har installerats kan du använda konsolens producent/konsumenter för att verifiera konfigurationen. Annars kör du Kafka-producenten på port 9092 och skickar meddelanden till ämnet och använder sedan Kafka-konsumenten på port 9093 som använder TLS.
Kafka 2.1 eller senare
Skapa ett ämne om det inte redan finns.
/usr/hdp/current/kafka-broker/bin/kafka-topics.sh --zookeeper <ZOOKEEPER_NODE>:2181 --create --topic topic1 --partitions 2 --replication-factor 2
Starta konsolproducenten och ange sökvägen till
client-ssl-auth.properties
som en konfigurationsfil för producenten./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
Öppna en annan ssh-anslutning till klientdatorn och starta konsolkonsumenten och ange sökvägen till
client-ssl-auth.properties
som en konfigurationsfil för konsumenten./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