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 :

  1. Les étapes suivantes sont répétées sur chacun des trois nœuds Worker :

    1. Génération d’un certificat.
    2. Création d’une requête de signature de certificat.
    3. Envoi de cette requête à l’autorité de certification (CA).
    4. Connexion à l’autorité de certification et signature de la requête.
    5. Utilisez SCP pour renvoyer le certificat au nœud Worker.
    6. Utilisez SCP pour renvoyer le certificat de l’autorité de certification au nœud Worker.
  2. Une fois que vous disposez de l’ensemble des certificats, vous pouvez les placer dans le magasin de certificats.

  3. 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 ou wn2 selon le cas. WorkerNode0_Name et HeadNode0_Name doivent être remplacés par les noms des machines respectives.

  4. 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
    
  5. 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
    
  6. Sur chacun des nœuds Worker, exécutez les étapes suivantes à l’aide de l’extrait de code.

    1. Créez un magasin de clés et remplissez-le avec un nouveau certificat privé.
    2. Créez une requête de signature de certificat.
    3. 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
    

    Capture d’écran montrant la sortie des fichiers hôtes.

  7. 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
    
  8. 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"
    
  9. 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
    
  10. 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
    
  11. 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 :

  1. Connectez-vous au portail Azure, puis sélectionnez votre cluster Apache Kafka Azure HDInsight.

  2. Accédez à l’interface utilisateur d’Ambari en cliquant sur Accueil Ambari sous Tableaux de bord du cluster.

  3. Sous Kafka Broker (Répartiteur Kafka), définissez la propriété listeners sur PLAINTEXT://localhost:9092,SSL://localhost:9093.

  4. Sous Advanced kafka-broker (Répartiteurs Kafka avancés), définissez la propriété security.inter.broker.protocol sur SSL

    Modification des propriétés de la configuration Kafka SSL dans Ambari.

  5. 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.

    Modification des propriétés de configuration Kafka SSL dans Ambari.

  6. Voici la capture d’écran qui montre l’interface utilisateur de configuration d’Ambari avec ces modifications.

    Notes

    1. 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)
    2. 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
    3. 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
  7. Utilisation de TLS 1.3 dans Kafka

    Ajouter les configurations suivantes aux configurations Kafka dans Ambari

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

    Important

    1. TLS 1.3 fonctionne uniquement avec la version HDI 5.1 de Kafka.
    2. Si vous utilisez TLS 1.3 côté serveur, vous devez également utiliser des configurations TLS 1.3 côté client.
  8. Pour HDI version 4.0 ou 5.0

    1. Si vous configurez l’authentification et le chiffrement, la capture d’écran ressemble alors à

    Modification de la propriété de modèle kafka-env dans Ambari 4.

    1. Si vous configurez uniquement le chiffrement, la capture d’écran ressemble alors à

    Capture d’écran montrant comment modifier le champ de propriété de modèle kafka-env dans Ambari pour le chiffrement uniquement.

  9. 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 :

  1. Connectez-vous à l’autorité de certification (nœud principal actif).
  2. Copiez le certificat d’autorité de certification vers l’ordinateur client à partir de l’ordinateur de l’autorité de certification (wn0).
  3. Connectez-vous à la machine client (hn1) et accédez au dossier ~/ssl.
  4. Importez le certificat d’autorité de certification dans le magasin d’approbations.
  5. 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.

  1. Connectez-vous au nœud de l’autorité de certification.

    ssh sshuser@HeadNode0_Name
    cd ssl
    
  2. Copiez le certificat d’autorité de certification vers la machine client.

    scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert
    
  3. Connectez-vous à la machine cliente (nœud principal en attente).

    ssh sshuser@HeadNode1_Name
    cd ssl
    
  4. 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
    
  5. 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
    
  6. 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
    
    1. Pour utiliser TLS 1.3, ajouter les configurations suivantes au fichier client-ssl-auth.properties
    ssl.enabled.protocols=TLSv1.3
    ssl.protocol=TLSv1.3
    
  7. 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 :

  1. Connectez-vous à la machine cliente (nœud principal en attente).
  2. 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.
  3. Basculez vers la machine de l’autorité de certification (nœud principal actif) pour signer le certificat client.
  4. 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.

  1. Connectez-vous à la machine cliente (nœud principal en attente).

    ssh sshuser@HeadNode1_Name
    
  2. Supprimez un répertoire SSL existant.

    rm -R ~/ssl
    mkdir ssl
    cd ssl
    
  3. 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"
    
  4. 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
    
  5. 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
    
  6. 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
    
  7. Copiez le certificat d’autorité de certification vers la machine client.

    scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert
    
    1. Connectez-vous à l’ordinateur client (nœud principal en attente) et accédez au dossier ssl.
    ssh sshuser@HeadNode1_Name
    cd ssl
    
  8. 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
    
  9. 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
    
    1. Pour utiliser TLS 1.3, ajouter les configurations suivantes au fichier client-ssl-auth.properties
    ssl.enabled.protocols=TLSv1.3
    ssl.protocol=TLSv1.3
    

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

  1. 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
    
  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
    
  3. 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
    

Étapes suivantes