Konfigurowanie szyfrowania i uwierzytelniania TLS dla klastra Platformy Apache Kafka spoza esp w usłudze 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 w każdym z trzech węzłów procesu roboczego:

    1. Generowanie certyfikatu.
    2. Utwórz żądanie podpisania certyfikatu.
    3. Wyślij żądanie podpisania certyfikatu do urzędu certyfikacji.
    4. Zaloguj się do urzędu certyfikacji i podpisz żądanie.
    5. Scp podpisanego certyfikatu z powrotem do węzła procesu roboczego.
    6. SCP certyfikat publiczny urzędu certyfikacji do węzła procesu roboczego.
  2. Po utworzeniu wszystkich certyfikatów umieść certyfikaty w magazynie certyfikatów.

  3. Przejdź do pozycji 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 procesu roboczego i powinien zostać zastąpiony ciągiem wn0, wn1 lub wn2 w razie potrzeby. 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 procesu roboczego. Te szczegóły można uzyskać z pliku /etc/hosts w węźle głównym

    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 do węzłów procesu roboczego z urzędu certyfikacji (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
    
  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 procesu roboczego dodaj certyfikat publiczny urzędów certyfikacji do magazynu zaufania i magazynu kluczy. Następnie dodaj własny certyfikat z podpisem węzła roboczego 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
    
    

Aktualizowanie konfiguracji platformy Kafka w celu używania brokerów TLS i ponownego uruchamiania

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ę Narzędzia główne Ambari w obszarze Pulpity nawigacyjne klastra.

  3. W obszarze Broker platformy Kafka ustaw właściwość odbiorników na wartość 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-broker 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 magazynu kluczy, lokalizacja magazynu zaufania w urzędzie certyfikacji (hn0)
    2. ssl.keystore.password i ssl.truststore.password to hasło ustawione dla magazynu kluczy i magazynu zaufania. W tym przypadku jako przykład MyServerPassword123
    3. ssl.key.password jest kluczem ustawionym dla magazynu kluczy i magazynu zaufania. W tym przypadku jako przykład MyServerPassword123
  7. Aby użyć protokołu TLS 1.3 na platformie Kafka

    Dodaj następujące konfiguracje do konfiguracji platformy kafka w narzędziu Ambari

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

    Ważne

    1. Protokół TLS 1.3 współdziała tylko z wersją platformy Kafka w usłudze HDI 5.1.
    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 urzędu certyfikacji (aktywny węzeł główny).
  2. Skopiuj certyfikat urzędu certyfikacji do komputera klienckiego z komputera urzędu certyfikacji (wn0).
  3. Zaloguj się do komputera klienckiego (hn1) i przejdź do ~/ssl folderu .
  4. Zaimportuj certyfikat urzędu certyfikacji do magazynu 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 urzędu certyfikacji.

    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 magazynu 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 maszyny klienckiej (węzeł główny rezerwowy).
  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 urzędu certyfikacji (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 maszyny klienckiej (węzeł główny rezerwowy).

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

    scp client-cert-sign-request sshuser@HeadNode0_Name:~/ssl/client-cert-sign-request
    
  5. Przejdź do maszyny 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 usługi HDInsight 4.0 i Kafka 2.1, możesz zweryfikować konfigurację przy użyciu producenta konsoli/konsumentów. 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 odbiorcę konsoli, a następnie podaj ścieżkę do client-ssl-auth.properties pliku konfiguracji dla użytkownika.

    /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