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:
Następujące kroki są powtarzane w każdym z trzech węzłów procesu roboczego:
- Generowanie certyfikatu.
- Utwórz żądanie podpisania certyfikatu.
- Wyślij żądanie podpisania certyfikatu do urzędu certyfikacji.
- Zaloguj się do urzędu certyfikacji i podpisz żądanie.
- Scp podpisanego certyfikatu z powrotem do węzła procesu roboczego.
- SCP certyfikat publiczny urzędu certyfikacji do węzła procesu roboczego.
Po utworzeniu wszystkich certyfikatów umieść certyfikaty w magazynie certyfikatów.
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
lubwn2
w razie potrzeby.WorkerNode0_Name
iHeadNode0_Name
powinny zostać zastąpione nazwami odpowiednich maszyn.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
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
W każdym z węzłów procesu roboczego wykonaj następujące kroki przy użyciu fragmentu kodu.
- Utwórz magazyn kluczy i wypełnij go nowym certyfikatem prywatnym.
- Utwórz żądanie podpisania certyfikatu.
- 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
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
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"
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
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
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:
Zaloguj się do witryny Azure Portal i wybierz klaster platformy Apache Kafka usługi Azure HDInsight.
Przejdź do interfejsu użytkownika systemu Ambari, klikając pozycję Narzędzia główne Ambari w obszarze Pulpity nawigacyjne klastra.
W obszarze Broker platformy Kafka ustaw właściwość odbiorników na wartość
PLAINTEXT://localhost:9092,SSL://localhost:9093
W obszarze Advanced kafka-broker ustaw właściwość security.inter.broker.protocol na wartość
SSL
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.
Oto zrzut ekranu przedstawiający interfejs użytkownika konfiguracji systemu Ambari z tymi zmianami.
Uwaga
- ssl.keystore.location i ssl.truststore.location to pełna ścieżka magazynu kluczy, lokalizacja magazynu zaufania w urzędzie certyfikacji (hn0)
- ssl.keystore.password i ssl.truststore.password to hasło ustawione dla magazynu kluczy i magazynu zaufania. W tym przypadku jako przykład
MyServerPassword123
- ssl.key.password jest kluczem ustawionym dla magazynu kluczy i magazynu zaufania. W tym przypadku jako przykład
MyServerPassword123
Aby użyć protokołu TLS 1.3 na platformie Kafka
Dodaj następujące konfiguracje do konfiguracji platformy kafka w narzędziu Ambari
ssl.enabled.protocols=TLSv1.3
ssl.protocol=TLSv1.3
Ważne
- Protokół TLS 1.3 współdziała tylko z wersją platformy Kafka w usłudze HDI 5.1.
- 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.
W przypadku usługi HDI w wersji 4.0 lub 5.0
- Jeśli konfigurujesz uwierzytelnianie i szyfrowanie, zrzut ekranu wygląda następująco:
- Jeśli konfigurujesz tylko szyfrowanie, zrzut ekranu wygląda następująco:
Uruchom ponownie wszystkie brokery platformy Kafka.
Konfiguracja klienta (bez uwierzytelniania)
Jeśli nie potrzebujesz uwierzytelniania, podsumowanie kroków konfigurowania tylko szyfrowania TLS to:
- Zaloguj się do urzędu certyfikacji (aktywny węzeł główny).
- Skopiuj certyfikat urzędu certyfikacji do komputera klienckiego z komputera urzędu certyfikacji (wn0).
- Zaloguj się do komputera klienckiego (hn1) i przejdź do
~/ssl
folderu . - Zaimportuj certyfikat urzędu certyfikacji do magazynu zaufania.
- Zaimportuj certyfikat urzędu certyfikacji do magazynu kluczy.
Te kroki zostały szczegółowo opisane w poniższych fragmentach kodu.
Zaloguj się do węzła urzędu certyfikacji.
ssh sshuser@HeadNode0_Name cd ssl
Kopiowanie certyfikatu ca-cert na komputer kliencki
scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert
Zaloguj się do maszyny klienckiej (węzeł główny rezerwowy).
ssh sshuser@HeadNode1_Name cd ssl
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
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
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
- 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
- Aby użyć protokołu TLS 1.3, dodaj następujące konfiguracje do pliku
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:
- Zaloguj się do maszyny klienckiej (węzeł główny rezerwowy).
- 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.
- Przejdź do maszyny urzędu certyfikacji (aktywny węzeł główny), aby podpisać certyfikat klienta.
- 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.
Zaloguj się do maszyny klienckiej (węzeł główny rezerwowy).
ssh sshuser@HeadNode1_Name
Usuń dowolny istniejący katalog ssl.
rm -R ~/ssl mkdir ssl cd ssl
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"
Kopiowanie żądania podpisania certyfikatu do urzędu certyfikacji
scp client-cert-sign-request sshuser@HeadNode0_Name:~/ssl/client-cert-sign-request
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
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
Kopiowanie certyfikatu ca-cert na komputer kliencki
scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert
- Zaloguj się do komputera klienckiego (węzeł główny rezerwowy) i przejdź do katalogu ssl.
ssh sshuser@HeadNode1_Name cd ssl
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
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
- 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
- Aby użyć protokołu TLS 1.3, dodaj następujące konfiguracje do pliku
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
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
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
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