Configurer le chiffrement et l’authentification TLS pour un cluster Apache Kafka non ESP dans Azure HDInsight
Cet article explique comment configurer le chiffrement TLS (Transport Layer Security), précédemment appelé chiffrement SSL (Secure Sockets Layer), entre les clients Apache Kafka et les répartiteurs Apache Kafka. Il fournit également les étapes nécessaires pour configurer l’authentification des clients (parfois appelée « TLS bidirectionnel »).
Important
Vous pouvez utiliser deux clients pour les applications Kafka : un client Java et un client de console. Seul le client Java ProducerConsumer.java
peut utiliser TLS à la fois pour la production et la consommation. Le client du producteur de console console-producer.sh
ne fonctionne pas avec TLS.
Configuration du répartiteur Apache Kafka
La configuration du répartiteur Kafka TLS utilise quatre machines virtuelles de cluster HDInsight de la manière suivante :
- Nœud principal 0 - Autorité de certification (CA)
- Nœuds Worker 0, 1, et 2 - Répartiteurs
Notes
Ce guide utilise des certificats auto-signés. Toutefois, la solution la plus sécurisée consiste à utiliser des certificats émis par des autorités de certification de confiance.
Le récapitulatif du processus de configuration du répartiteur est le suivant :
Les étapes suivantes sont répétées sur chacun des trois nœuds Worker :
- Génération d’un certificat.
- Création d’une requête de signature de certificat.
- Envoi de cette requête à l’autorité de certification (CA).
- Connexion à l’autorité de certification et signature de la requête.
- Utilisez SCP pour renvoyer le certificat au nœud Worker.
- Utilisez SCP pour renvoyer le certificat de l’autorité de certification au nœud Worker.
Une fois que vous disposez de l’ensemble des certificats, vous pouvez les placer dans le magasin de certificats.
Accédez à Ambari et modifiez les configurations.
Utilisez les instructions détaillées ci-dessous pour terminer la configuration du répartiteur :
Important
Dans les extraits de code suivants, « wnX » est une abréviation de l’un des trois nœuds Worker, qui doit être remplacée par
wn0
,wn1
ouwn2
selon le cas.WorkerNode0_Name
etHeadNode0_Name
doivent être remplacés par les noms des machines respectives.Effectuez la configuration initiale sur le nœud principal 0 qui remplit le rôle d’autorité de certification (CA) pour HDInsight.
# Create a new directory 'ssl' and change into it mkdir ssl cd ssl
Effectuez la même configuration initiale sur chacun des répartiteurs (nœuds Worker 0, 1 et 2).
# Create a new directory 'ssl' and change into it mkdir ssl cd ssl
Sur chacun des nœuds Worker, exécutez les étapes suivantes à l’aide de l’extrait de code.
- Créez un magasin de clés et remplissez-le avec un nouveau certificat privé.
- Créez une requête de signature de certificat.
- Utilisez SCP pour envoyer la requête de signature de certificat à l’autorité de certification (le nœud principal 0).
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
Notes
FQDN_WORKER_NODE est le nom de domaine complet de la machine de nœud Worker. Vous pouvez obtenir ces détails à partir du fichier /etc/hosts dans le nœud principal
Par exemple,
wn0-espkaf.securehadooprc.onmicrosoft.com wn0-kafka2.zbxwnwsmpcsuvbjqbmespcm1zg.bx.internal.cloudapp.net
Sur l’ordinateur de l’autorité de certification, exécutez la commande suivante pour créer des fichiers ca-cert et ca-key :
openssl req -new -newkey rsa:4096 -days 365 -x509 -subj "/CN=Kafka-Security-CA" -keyout ca-key -out ca-cert -nodes
Passez à l’ordinateur associé à l’autorité de certification et signez toutes les requêtes de signature de certificat reçues :
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"
Envoyez les certificats signés sur les nœuds Worker à partir de l’autorité de certification (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
Envoyez le certificat public à l’autorité de certification de chaque nœud Worker.
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
Sur chacun de ces nœuds, ajoutez le certificat public de l’autorité de certificat dans le magasin d’approbations et le magasin de clés. Ensuite, ajoutez le certificat signé du nœud Worker dans le magasin de clés.
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
Mettre à jour la configuration Kafka pour utiliser le protocole TLS et redémarrer les répartiteurs
Vous avez désormais configuré chaque répartiteur Kafka avec un magasin de clés et un magasin d’approbations, et importé les certificats nécessaires. Nous allons maintenant modifier les propriétés de configuration Kafka associées à l’aide d’Ambari, puis redémarrer les répartiteurs Kafka.
Pour terminer la modification de configuration, procédez comme suit :
Connectez-vous au portail Azure, puis sélectionnez votre cluster Apache Kafka Azure HDInsight.
Accédez à l’interface utilisateur d’Ambari en cliquant sur Accueil Ambari sous Tableaux de bord du cluster.
Sous Kafka Broker (Répartiteur Kafka), définissez la propriété listeners sur
PLAINTEXT://localhost:9092,SSL://localhost:9093
.Sous Advanced kafka-broker (Répartiteurs Kafka avancés), définissez la propriété security.inter.broker.protocol sur
SSL
Sous Custom kafka-broker (Répartiteur Kafka personnalisé), définissez la propriété ssl.client.auth sur
required
.Notes
Remarque : cette étape n’est nécessaire que si vous configurez l’authentification et le chiffrement.
Voici la capture d’écran qui montre l’interface utilisateur de configuration d’Ambari avec ces modifications.
Notes
- ssl.keystore.location et ssl.truststore.location sont le chemin d’accès complet de votre magasin de clés, emplacement du magasin de confiance dans l’autorité de certification (hn0)
- ssl.keystore.password et ssl.truststore.password sont les mots de passe définis pour le magasin de clés et le magasin de confiance. Dans ce cas, à titre d’exemple,
MyServerPassword123
- ssl.key.password est l’ensemble de clés pour le magasin de clés et le magasin de confiance. Dans ce cas, à titre d’exemple,
MyServerPassword123
Utilisation de TLS 1.3 dans Kafka
Ajouter les configurations suivantes aux configurations Kafka dans Ambari
ssl.enabled.protocols=TLSv1.3
ssl.protocol=TLSv1.3
Important
- TLS 1.3 fonctionne uniquement avec la version HDI 5.1 de Kafka.
- Si vous utilisez TLS 1.3 côté serveur, vous devez également utiliser des configurations TLS 1.3 côté client.
Pour HDI version 4.0 ou 5.0
- Si vous configurez l’authentification et le chiffrement, la capture d’écran ressemble alors à
- Si vous configurez uniquement le chiffrement, la capture d’écran ressemble alors à
Redémarrez tous les répartiteurs Kafka.
Configuration du client (sans authentification)
Si vous n’avez pas besoin d’authentification, les étapes de configuration du chiffrement TLS uniquement sont les suivantes :
- Connectez-vous à l’autorité de certification (nœud principal actif).
- Copiez le certificat d’autorité de certification vers l’ordinateur client à partir de l’ordinateur de l’autorité de certification (wn0).
- Connectez-vous à la machine client (hn1) et accédez au dossier
~/ssl
. - Importez le certificat d’autorité de certification dans le magasin d’approbations.
- Importez le certificat d’autorité de certification dans le magasin de clés.
Ces étapes sont détaillées dans les extraits de code suivants.
Connectez-vous au nœud de l’autorité de certification.
ssh sshuser@HeadNode0_Name cd ssl
Copiez le certificat d’autorité de certification vers la machine client.
scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert
Connectez-vous à la machine cliente (nœud principal en attente).
ssh sshuser@HeadNode1_Name cd ssl
Importez le certificat d’autorité de certification dans le magasin d’approbations.
keytool -keystore kafka.client.truststore.jks -alias CARoot -import -file ca-cert -storepass "MyClientPassword123" -keypass "MyClientPassword123" -noprompt
Importez le certificat d’autorité de certification dans le magasin de clés.
keytool -keystore kafka.client.keystore.jks -alias CARoot -import -file ca-cert -storepass "MyClientPassword123" -keypass "MyClientPassword123" -noprompt
Créez le fichier
client-ssl-auth.properties
sur l’ordinateur client (hn1). Il doit contenir les lignes suivantes :security.protocol=SSL ssl.truststore.location=/home/sshuser/ssl/kafka.client.truststore.jks ssl.truststore.password=MyClientPassword123
- Pour utiliser TLS 1.3, ajouter les configurations suivantes au fichier
client-ssl-auth.properties
ssl.enabled.protocols=TLSv1.3 ssl.protocol=TLSv1.3
- Pour utiliser TLS 1.3, ajouter les configurations suivantes au fichier
Démarrez le client d’administration avec les options de producteur et consommateur, afin de vérifier que les producteurs et consommateurs fonctionnent sur le port 9093. Reportez-vous à la section Vérification pour savoir comment vérifier l’installation à l’aide du producteur/du consommateur de console.
Configuration du client (avec authentification)
Notes
Les étapes suivantes ne sont nécessaires que si vous installez à la fois le chiffrement et l’authentification TLS. Si vous configurez uniquement le chiffrement, voir Configuration du client sans authentification.
Les quatre étapes suivantes résument les tâches nécessaires pour configurer le client :
- Connectez-vous à la machine cliente (nœud principal en attente).
- Créez un magasin de clés Java afin d’obtenir un certificat auto-signé pour le répartiteur. Ensuite, copiez le certificat sur la machine virtuelle où l’autorité de certification est exécutée.
- Basculez vers la machine de l’autorité de certification (nœud principal actif) pour signer le certificat client.
- Accédez à la machine cliente (nœud principal en attente), puis au dossier
~/ssl
. Copiez le certificat auto-signé sur la machine cliente.
Les détails de chaque étape sont fournis.
Connectez-vous à la machine cliente (nœud principal en attente).
ssh sshuser@HeadNode1_Name
Supprimez un répertoire SSL existant.
rm -R ~/ssl mkdir ssl cd ssl
Créez un magasin de clés Java et créez une demande de signature de certificat.
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"
Copiez la demande de signature de certificat vers l’autorité de certification.
scp client-cert-sign-request sshuser@HeadNode0_Name:~/ssl/client-cert-sign-request
Basculez vers l’ordinateur de l’autorité de certification (nœud principal actif) et signez le certificat client.
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
Copiez le certificat client signé de l’autorité de certification (nœud principal actif) vers la machine client.
scp client-cert-signed sshuser@HeadNode1_Name:~/ssl/client-signed-cert
Copiez le certificat d’autorité de certification vers la machine client.
scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert
- Connectez-vous à l’ordinateur client (nœud principal en attente) et accédez au dossier ssl.
ssh sshuser@HeadNode1_Name cd ssl
Créez un magasin client avec un certificat signé, importez le certificat d’autorité de certification dans le magasin de clés et le magasin d’approbations sur l’ordinateur client (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
Créez un fichier
client-ssl-auth.properties
sur l’ordinateur client (hn1). Il doit contenir les lignes suivantes :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
- Pour utiliser TLS 1.3, ajouter les configurations suivantes au fichier
client-ssl-auth.properties
ssl.enabled.protocols=TLSv1.3 ssl.protocol=TLSv1.3
- Pour utiliser TLS 1.3, ajouter les configurations suivantes au fichier
Vérification
Exécutez ces étapes sur l’ordinateur client.
Notes
Si HDInsight 4.0 et Kafka 2.1 sont installés, vous pouvez utiliser le producteur/consommateur de console pour vérifier votre configuration. Si ce n’est pas le cas, exécutez le producteur Kafka sur le port 9092 et envoyez des messages à la rubrique, puis utilisez le contrôle serveur consommateur Kafka sur le port 9093 qui utilise TLS.
Kafka 2.1 ou version ultérieure
Créez une rubrique s’il n’en existe pas.
/usr/hdp/current/kafka-broker/bin/kafka-topics.sh --zookeeper <ZOOKEEPER_NODE>:2181 --create --topic topic1 --partitions 2 --replication-factor 2
Démarrez le producteur de console et fournissez le chemin d’accès à
client-ssl-auth.properties
en tant que fichier de configuration pour le producteur./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
Ouvrez une autre connexion ssh à la machine client et démarrez le consommateur de console, puis fournissez le chemin d’accès à
client-ssl-auth.properties
en tant que fichier de configuration pour le consommateur./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