Konfigurera TLS-kryptering och autentisering för Apache Kafka i Azure HDInsight

Den här artikeln visar hur du ställer in Transport Layer Security-kryptering (TLS), tidigare kallat Secure Sockets Layer-kryptering (SSL), mellan Apache Kafka klienter och Apache Kafka autjämnare. Den visar också hur du ställer in autentisering av klienter (kallas ibland för tvåvägs 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.

Anteckning

HDInsight Kafka-konsolproducenten med version 1.1 stöder inte SSL.

konfiguration Apache Kafka broker

Konfigurationen av Kafka TLS-meddelandekö använder fyra virtuella HDInsight-kluster-datorer på följande sätt:

  • headnode 0 – certifikatutfärdare (CA)
  • arbetsnod 0, 1 och 2 – a brokers

Anteckning

Den här guiden använder själv signerade certifikat, men den säkraste lösningen är att använda certifikat som utfärdats av betrodda certifikatutor.

Sammanfattningen av konfigurationsprocessen för autjämnare är följande:

  1. Följande steg upprepas på var och en av de tre arbetsnoderna:

    1. Generera ett certifikat.
    2. Skapa en begäran om certifikatsignering.
    3. Skicka begäran om certifikatsignering till certifikatutfärdaren (CA).
    4. Logga in på certifikatutfärdaren och signera begäran.
    5. SCP det signerade certifikatet tillbaka till arbetsnoden.
    6. SCP det offentliga certifikatet för CA:en till arbetsnoden.
  2. När du har alla certifikat kan du placera certifikaten i certifikatarkivet.

  3. Gå till Ambari och ändra konfigurationerna.

Följ de detaljerade anvisningarna nedan för att slutföra konfigurationen av den autjämnande meddelandekö:

Viktigt

I följande kodfragment är wnX en förkortning för en av de tre arbetarnoderna och ska ersättas med wn0 , wn1 eller efter wn2 behov. WorkerNode0_Name och HeadNode0_Name ska ersättas med namnen på respektive datorer.

  1. Utför den inledande 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
    
  2. Utför samma inledande konfiguration på var och en av a brokers (arbetarnoderna 0, 1 och 2).

    # Create a new directory 'ssl' and change into it
    mkdir ssl
    cd ssl
    
  3. På var och en av arbetsnoderna utför du följande steg med hjälp av kodfragmentet nedan.

    1. Skapa ett nyckelarkiv och fyll i det med ett nytt privat certifikat.
    2. Skapa en begäran om certifikatsignering.
    3. SCP certifikatsigneringsbegäran till certifikatutfärdaren (headnode0)
    keytool -genkey -keystore kafka.server.keystore.jks -validity 365 -storepass "MyServerPassword123" -keypass "MyServerPassword123" -dname "CN=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
    
  4. Kör följande kommando på CA-datorn 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
    
  5. Ä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"
    
  6. Skicka tillbaka de signerade certifikaten till arbetsnoderna från certifikatutfärdaren (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
    
  7. Skicka det offentliga certifikatet för certifikatutfärdaren 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
    
  8. På varje arbetsnod lägger du till certifikatutfärdares offentliga certifikat i truststore och keystore. 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 autjämnare

Nu har du ställt in varje Kafka-meddelandekö med ett nyckelarkiv och truststore och importerat rätt certifikat. Ändra sedan relaterade Kafka-konfigurationsegenskaper med Ambari och starta sedan om Kafka-meddelandeköerna.

Utför följande steg för att slutföra konfigurationsändringen:

  1. Logga in på Azure Portal och välj ditt Azure HDInsight Apache Kafka kluster.

  2. Gå till Ambari-användargränssnittet genom att klicka på Ambari-start under Klusterinstrumentpaneler.

  3. Under Kafka Broker anger du lyssnaregenskapen till PLAINTEXT://localhost:9092,SSL://localhost:9093

  4. Under Avancerad kafka-broker anger du egenskapen security.inter.broker.protocol till SSL

    Redigera Konfigurationsegenskaper för Kafka SSL i Ambari

  5. Under Anpassad kafka-broker anger du egenskapen ssl.client.auth till required . Det här steget krävs bara om du ställer in autentisering och kryptering.

    Redigera kafka ssl-konfigurationsegenskaper i Ambari

  6. För HDI version 3.6 går du till Ambari UI och lägger till följande konfigurationer under Avancerad kafka-env och mallegenskapen kafka-env.

    # Configure Kafka to advertise IP addresses instead of FQDN
    IP_ADDRESS=$(hostname -i)
    echo advertised.listeners=$IP_ADDRESS
    sed -i.bak -e '/advertised/{/advertised@/!d;}' /usr/hdp/current/kafka-broker/conf/server.properties
    echo "advertised.listeners=PLAINTEXT://$IP_ADDRESS:9092,SSL://$IP_ADDRESS:9093" >> /usr/hdp/current/kafka-broker/conf/server.properties
    echo "ssl.keystore.location=/home/sshuser/ssl/kafka.server.keystore.jks" >> /usr/hdp/current/kafka-broker/conf/server.properties
    echo "ssl.keystore.password=MyServerPassword123" >> /usr/hdp/current/kafka-broker/conf/server.properties
    echo "ssl.key.password=MyServerPassword123" >> /usr/hdp/current/kafka-broker/conf/server.properties
    echo "ssl.truststore.location=/home/sshuser/ssl/kafka.server.truststore.jks" >> /usr/hdp/current/kafka-broker/conf/server.properties
    echo "ssl.truststore.password=MyServerPassword123" >> /usr/hdp/current/kafka-broker/conf/server.properties
    
  7. Här är skärmbilden som visar Ambari-konfigurationsgränssnittet med dessa ändringar.

    För HDI version 3.6:

    Redigera mallegenskapen kafka-env i Ambari

    För HDI version 4.0:

    Redigera mallegenskapen kafka-env i Ambari fyra

  8. Starta om alla autjämnare i Kafka.

Klientinstallation (utan autentisering)

Om du inte behöver autentisering är sammanfattningen av stegen för att konfigurera endast TLS-kryptering:

  1. Logga in på certifikatutfärdaren (aktiv huvudnod).
  2. Kopiera CA-certifikatet till klientdatorn från CA-datorn (wn0).
  3. Logga in på klientdatorn (hn1) och navigera till ~/ssl mappen .
  4. Importera CA-certifikatet till truststore.
  5. Importera CA-certifikatet till nyckelarkivet.

De här stegen beskrivs i följande kodfragment.

  1. Logga in på CA-noden.

    ssh sshuser@HeadNode0_Name
    cd ssl
    
  2. Kopiera certifikatutfärdaren till klientdatorn

    scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert
    
  3. Logga in på klientdatorn (standby-huvudnod).

    ssh sshuser@HeadNode1_Name
    cd ssl
    
  4. Importera CA-certifikatet till truststore.

    keytool -keystore kafka.client.truststore.jks -alias CARoot -import -file ca-cert -storepass "MyClientPassword123" -keypass "MyClientPassword123" -noprompt
    
  5. Importera CA-certifikatet till keystore.

    keytool -keystore kafka.client.keystore.jks -alias CARoot -import -file ca-cert -storepass "MyClientPassword123" -keypass "MyClientPassword123" -noprompt
    
  6. Skapa filen på client-ssl-auth.properties 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
    
  7. Starta administratörsklienten med producent- och konsumentalternativ för att kontrollera att både producenter och konsumenter arbetar på port 9093. Se verifieringsavsnittet nedan för de steg som krävs för att verifiera konfigurationen med hjälp av konsolproducent/konsument.

Klientinstallation (med autentisering)

Anteckning

Följande steg krävs bara om du ställer in både TLS-kryptering och autentisering. Om du bara ställer in kryptering kan du se Klientkonfiguration utan autentisering.

Följande fyra steg sammanfattar de uppgifter som krävs för att slutföra klientinstallationen:

  1. Logga in på klientdatorn (standby-huvudnod).
  2. Skapa ett Java-nyckelarkiv och hämta ett signerat certifikat för den autjämnare. Kopiera sedan certifikatet till den virtuella dator där certifikatutfärdaren körs.
  3. Växla till CA-datorn (aktiv huvudnod) för att signera klientcertifikatet.
  4. Gå till klientdatorn (standby-huvudnoden) och navigera till ~/ssl mappen . Kopiera det signerade certifikatet till klientdatorn.

Information om varje steg anges nedan.

  1. Logga in på klientdatorn (standby-huvudnod).

    ssh sshuser@HeadNode1_Name
    
  2. Ta bort alla befintliga SSL-kataloger.

    rm -R ~/ssl
    mkdir ssl
    cd ssl
    
  3. Skapa ett Java-nyckelarkiv och skapa en certifikatsigneringsbegäran.

    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. Kopiera begäran om certifikatsignering till certifikatutfärdaren

    scp client-cert-sign-request sshuser@HeadNode0_Name:~/ssl/client-cert-sign-request
    
  5. 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
    
  6. Kopiera signerat klientcertifikt från certifikatutfärdaren (aktiv huvudnod) till klientdatorn.

    scp client-cert-signed sshuser@HeadNode1_Name:~/ssl/client-signed-cert
    
  7. Kopiera certifikatutfärdaren till klientdatorn

    scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert
    
    1. Logga in på klientdatorn (standby-huvudnod) och gå till SSL-katalogen.
    ssh sshuser@HeadNode1_Name
    cd ssl
    
  8. Skapa klientarkiv med signerat certifikat och importera ca-certifikat till keystore och truststore 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
    
  9. 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
    

Verifiering

Kör de här stegen på klientdatorn.

Anteckning

Om HDInsight 4.0 och Kafka 2.1 är installerade kan du använda konsolproducenten/-konsumenterna för att verifiera konfigurationen. Om inte 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 högre

  1. 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
    
  2. Starta konsolproducenten och ange sökvägen client-ssl-auth.properties till 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
    
  3. Öppna en annan ssh-anslutning till klientdatorn och starta konsolkonsumenten och ange client-ssl-auth.properties sökvägen till 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
    

Kafka 1.1

  1. Skapa ett ämne om det inte redan finns.

    /usr/hdp/current/kafka-broker/bin/kafka-topics.sh --zookeeper <ZOOKEEPER_NODE_0>:2181 --create --topic topic1 --partitions 2 --replication-factor 2
    
  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>:9092 --topic topic1 
    
  3. Öppna en annan ssh-anslutning till klientdatorn och starta konsolkonsumenten och ange client-ssl-auth.properties sökvägen till 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
    

Nästa steg