Udostępnij za pośrednictwem


Konfigurowanie szyfrowania i uwierzytelniania TLS dla klastra Apache Kafka, który nie obsługuje ESP, na platformie Azure HDInsight.

W tym artykule pokazano, jak skonfigurować szyfrowanie tls (Transport Layer Security), znane wcześniej jako szyfrowanie Secure Sockets Layer (SSL) między klientami platformy Apache Kafka i brokerami platformy Apache Kafka. Przedstawiono również sposób konfigurowania uwierzytelniania klientów (czasami nazywanych dwukierunkowym protokołem TLS).

Ważne

Istnieją dwa klienci, których można używać w przypadku aplikacji platformy Kafka: klienta Java i klienta konsoli. Tylko klient ProducerConsumer.java Java może używać protokołu TLS do tworzenia i używania. Klient console-producer.sh producenta konsoli nie działa z protokołem TLS.

Konfiguracja brokera platformy Apache Kafka

Konfiguracja brokera TLS platformy Kafka używa czterech maszyn wirtualnych klastra usługi HDInsight w następujący sposób:

  • węzeł główny 0 — urząd certyfikacji
  • węzeł roboczy 0, 1 i 2 — brokerzy

Uwaga

W tym przewodniku używane są certyfikaty z podpisem własnym, ale najbezpieczniejszym rozwiązaniem jest użycie certyfikatów wystawionych przez zaufane urzędy certyfikacji.

Podsumowanie procesu konfiguracji brokera jest następujące:

  1. Następujące kroki są powtarzane na każdym z trzech węzłów roboczych:

    1. Generowanie certyfikatu.
    2. Utwórz żądanie podpisania certyfikatu.
    3. Wyślij żądanie podpisania certyfikatu do urzędu certyfikacji.
    4. Zaloguj się do centrum certyfikacji i podpisz wniosek.
    5. SCP podpisany certyfikat z powrotem do węzła roboczego.
    6. SCP certyfikat publiczny urzędu certyfikacji do węzła roboczego.
  2. Gdy masz już wszystkie certyfikaty, umieść je w magazynie certyfikatów.

  3. Przejdź do Ambari i zmień konfiguracje.

    Aby ukończyć konfigurację brokera, wykonaj następujące szczegółowe instrukcje:

    Ważne

    W poniższych fragmentach kodu, wnX jest skrótem dla jednego z trzech węzłów roboczych i powinien zostać zastąpiony na wn0, wn1 lub wn2 w stosownych przypadkach. WorkerNode0_Name i HeadNode0_Name powinny zostać zastąpione nazwami odpowiednich maszyn.

  4. Wykonaj początkową konfigurację w węźle głównym 0, który dla usługi HDInsight pełni rolę urzędu certyfikacji.

    # Create a new directory 'ssl' and change into it
    mkdir ssl
    cd ssl
    
  5. Wykonaj tę samą początkową konfigurację na każdym z brokerów (węzły robocze 0, 1 i 2).

    # Create a new directory 'ssl' and change into it
    mkdir ssl
    cd ssl
    
  6. W każdym z węzłów procesu roboczego wykonaj następujące kroki przy użyciu fragmentu kodu.

    1. Utwórz magazyn kluczy i wypełnij go nowym certyfikatem prywatnym.
    2. Utwórz żądanie podpisania certyfikatu.
    3. Scp żądanie podpisania certyfikatu do urzędu certyfikacji (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
    

    Uwaga

    FQDN_WORKER_NODE to W pełni kwalifikowana nazwa domeny maszyny węzła roboczego. Tę informację można uzyskać z pliku /etc/hosts w węźle głównym.

    Na przykład

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

    Zrzut ekranu przedstawiający dane wyjściowe pliku hostów.

  7. Na maszynie urzędu certyfikacji uruchom następujące polecenie, aby utworzyć pliki ca-cert i ca-key:

    openssl req -new -newkey rsa:4096 -days 365 -x509 -subj "/CN=Kafka-Security-CA" -keyout ca-key -out ca-cert -nodes
    
  8. Przejdź do maszyny urzędu certyfikacji i podpisz wszystkie odebrane żądania podpisywania certyfikatu:

    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. Wyślij podpisane certyfikaty z powrotem z urzędu certyfikacji (headnode0) do węzłów roboczych.

    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. Wyślij publiczny certyfikat urzędu certyfikacji do każdego węzła roboczego.

    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. W każdym węźle roboczym dodaj certyfikat urzędu certyfikacji (CA) do magazynu zaufania i magazynu kluczy. Następnie dodaj certyfikat podpisany przez węzeł roboczy do magazynu kluczy

    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
    
    

Zaktualizuj konfigurację Kafki do używania TLS i ponownie uruchom brokerów.

Teraz skonfigurowano każdego brokera platformy Kafka z magazynem kluczy i magazynem zaufania oraz zaimportowano odpowiednie certyfikaty. Następnie zmodyfikuj powiązane właściwości konfiguracji platformy Kafka przy użyciu narzędzia Ambari, a następnie uruchom ponownie brokerów platformy Kafka.

Aby ukończyć modyfikację konfiguracji, wykonaj następujące czynności:

  1. Zaloguj się do witryny Azure Portal i wybierz klaster platformy Apache Kafka usługi Azure HDInsight.

  2. Przejdź do interfejsu użytkownika systemu Ambari, klikając pozycję Strona główna Ambari w obszarze Kokpit klastra.

  3. W sekcji Broker platformy Kafka ustaw właściwość listeners na PLAINTEXT://localhost:9092,SSL://localhost:9093

  4. W obszarze Advanced kafka-broker ustaw właściwość security.inter.broker.protocol na wartość SSL

    Edytowanie właściwości konfiguracji ssl platformy Kafka w narzędziu Ambari.

  5. W obszarze Niestandardowy broker Kafka ustaw właściwość ssl.client.auth na wartość required.

    Uwaga

    Uwaga: ten krok jest wymagany tylko w przypadku konfigurowania uwierzytelniania i szyfrowania.

    Edytowanie właściwości konfiguracji protokołu SSL platformy Kafka w narzędziu Ambari.

  6. Oto zrzut ekranu przedstawiający interfejs użytkownika konfiguracji systemu Ambari z tymi zmianami.

    Uwaga

    1. ssl.keystore.location i ssl.truststore.location to pełna ścieżka do magazynu kluczy i magazynu zaufania w Urzędzie Certyfikacji (hn0)
    2. ssl.keystore.password i ssl.truststore.password to są hasła ustawione dla magazynu kluczy i magazynu zaufania. Na przykład w tym przypadku MyServerPassword123
    3. ssl.key.password jest kluczem ustawionym dla keystore i trust store. Na przykład w tym przypadku MyServerPassword123
  7. Aby użyć protokołu TLS 1.3 na platformie Kafka

    Dodaj następujące konfiguracje do konfiguracji Kafka w Ambari

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

    Ważne

    1. TLS 1.3 działa tylko z wersją Kafka 5.1 na HDI.
    2. Jeśli używasz protokołu TLS 1.3 po stronie serwera, należy również użyć konfiguracji protokołu TLS 1.3 na kliencie.
  8. W przypadku usługi HDI w wersji 4.0 lub 5.0

    1. Jeśli konfigurujesz uwierzytelnianie i szyfrowanie, zrzut ekranu wygląda następująco:

    Edytowanie właściwości szablonu kafka-env w systemie Ambari cztery.

    1. Jeśli konfigurujesz tylko szyfrowanie, zrzut ekranu wygląda następująco:

    Zrzut ekranu przedstawiający sposób edytowania pola właściwości szablonu kafka-env w narzędziu Ambari tylko na potrzeby szyfrowania.

  9. Uruchom ponownie wszystkie brokery platformy Kafka.

Konfiguracja klienta (bez uwierzytelniania)

Jeśli nie potrzebujesz uwierzytelniania, podsumowanie kroków konfigurowania tylko szyfrowania TLS to:

  1. Zaloguj się do węzła kontrolnego (aktywny węzeł główny).
  2. Skopiuj certyfikat CA do komputera klienta z komputera CA (wn0).
  3. Zaloguj się do komputera klienckiego (hn1) i przejdź do ~/ssl folderu .
  4. Zaimportuj certyfikat urzędu certyfikacji do repozytorium zaufania.
  5. Zaimportuj certyfikat urzędu certyfikacji do magazynu kluczy.

Te kroki zostały szczegółowo opisane w poniższych fragmentach kodu.

  1. Zaloguj się do węzła CA.

    ssh sshuser@HeadNode0_Name
    cd ssl
    
  2. Kopiowanie certyfikatu ca-cert na komputer kliencki

    scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert
    
  3. Zaloguj się do maszyny klienckiej (węzeł główny rezerwowy).

    ssh sshuser@HeadNode1_Name
    cd ssl
    
  4. Zaimportuj certyfikat urzędu certyfikacji do repozytorium zaufania.

    keytool -keystore kafka.client.truststore.jks -alias CARoot -import -file ca-cert -storepass "MyClientPassword123" -keypass "MyClientPassword123" -noprompt
    
  5. Zaimportuj certyfikat urzędu certyfikacji do magazynu kluczy.

    keytool -keystore kafka.client.keystore.jks -alias CARoot -import -file ca-cert -storepass "MyClientPassword123" -keypass "MyClientPassword123" -noprompt
    
  6. Utwórz plik client-ssl-auth.properties na komputerze klienckim (hn1). Powinny mieć następujące wiersze:

    security.protocol=SSL
    ssl.truststore.location=/home/sshuser/ssl/kafka.client.truststore.jks
    ssl.truststore.password=MyClientPassword123
    
    1. Aby użyć protokołu TLS 1.3, dodaj następujące konfiguracje do pliku client-ssl-auth.properties
    ssl.enabled.protocols=TLSv1.3
    ssl.protocol=TLSv1.3
    
  7. Uruchom klienta administracyjnego z opcjami producenta i konsumenta, aby sprawdzić, czy zarówno producenci, jak i konsumenci pracują na porcie 9093. Zapoznaj się z sekcją Weryfikacja , aby zapoznać się z krokami wymaganymi do zweryfikowania konfiguracji przy użyciu producenta/odbiorcy konsoli.

Konfiguracja klienta (z uwierzytelnianiem)

Uwaga

Poniższe kroki są wymagane tylko w przypadku konfigurowania zarówno szyfrowania TLS, jak i uwierzytelniania. Jeśli konfigurujesz tylko szyfrowanie, zobacz Konfiguracja klienta bez uwierzytelniania.

Poniższe cztery kroki zawierają podsumowanie zadań wymaganych do ukończenia konfiguracji klienta:

  1. Zaloguj się do komputera klienckiego (rezerwowy węzeł główny).
  2. Utwórz magazyn kluczy Java i uzyskaj podpisany certyfikat dla brokera. Następnie skopiuj certyfikat do maszyny wirtualnej, na której działa urząd certyfikacji.
  3. Przejdź do maszyny Certyfikatu Autoryzacji (aktywny węzeł główny), aby podpisać certyfikat klienta.
  4. Przejdź do komputera klienckiego (węzeł główny rezerwowy) i przejdź do ~/ssl folderu. Skopiuj podpisany certyfikat do komputera klienckiego.

Podane są szczegółowe informacje o poszczególnych krokach.

  1. Zaloguj się do komputera klienckiego (węzeł główny czuwania).

    ssh sshuser@HeadNode1_Name
    
  2. Usuń dowolny istniejący katalog ssl.

    rm -R ~/ssl
    mkdir ssl
    cd ssl
    
  3. Utwórz magazyn kluczy Java i utwórz żądanie podpisania certyfikatu.

    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. Skopiuj żądanie podpisania certyfikatu do urzędu certyfikacji

    scp client-cert-sign-request sshuser@HeadNode0_Name:~/ssl/client-cert-sign-request
    
  5. Przełącz się na maszynę urzędu certyfikacji (aktywny węzeł główny) i podpisz certyfikat klienta.

    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. Skopiuj podpisany certyfikat klienta z urzędu certyfikacji (aktywny węzeł główny) do komputera klienckiego.

    scp client-cert-signed sshuser@HeadNode1_Name:~/ssl/client-signed-cert
    
  7. Kopiowanie certyfikatu ca-cert na komputer kliencki

    scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert
    
    1. Zaloguj się do komputera klienckiego (węzeł główny rezerwowy) i przejdź do katalogu ssl.
    ssh sshuser@HeadNode1_Name
    cd ssl
    
  8. Utwórz magazyn klienta z podpisanym certyfikatem, zaimportuj certyfikat urzędu certyfikacji do magazynu kluczy i magazyn zaufania na maszynie klienckiej (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. Utwórz plik client-ssl-auth.properties na komputerze klienckim (hn1). Powinny mieć następujące wiersze:

    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. Aby użyć protokołu TLS 1.3, dodaj następujące konfiguracje do pliku client-ssl-auth.properties
    ssl.enabled.protocols=TLSv1.3
    ssl.protocol=TLSv1.3
    

Weryfikacja

Uruchom te kroki na komputerze klienckim.

Uwaga

Jeśli zainstalowano HDInsight 4.0 i Kafkę 2.1, możesz zweryfikować konfigurację, używając konsolowego producenta/konsumenta. Jeśli nie, uruchom producenta platformy Kafka na porcie 9092 i wyślij komunikaty do tematu, a następnie użyj konsumenta platformy Kafka na porcie 9093, który używa protokołu TLS.

Kafka 2.1 lub nowsza

  1. Utwórz temat, jeśli jeszcze nie istnieje.

    /usr/hdp/current/kafka-broker/bin/kafka-topics.sh --zookeeper <ZOOKEEPER_NODE>:2181 --create --topic topic1 --partitions 2 --replication-factor 2
    
  2. Uruchom producenta konsoli i podaj ścieżkę do client-ssl-auth.properties jako pliku konfiguracji producenta.

    /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. Otwórz kolejne połączenie SSH z maszyną kliencką i uruchom konsolowego konsumenta, i podaj ścieżkę do pliku konfiguracji client-ssl-auth.properties dla konsumenta.

    /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
    

Następne kroki