Partager via


Chiffrer le trafic entre les nœuds worker de cluster

Important

L' exemple de script init qui est référencé dans cet article dérive son secret de chiffrement partagé du hachage du magasin de clés stocké dans DBFS. Si vous faites pivoter le secret en mettant à jour le fichier de magasin de clés dans DBFS, tous les clusters en cours d’exécution doivent être redémarrés. Dans le cas contraire, les Workers Spark peuvent échouer à s’authentifier auprès du pilote Spark en raison d’un secret partagé incohérent, ce qui entraîne un ralentissement des tâches. En outre, étant donné que le secret partagé est stocké dans DBFS, tout utilisateur disposant d’un accès DBFS peut récupérer le secret à l’aide d’un bloc-notes.

Spécifications

  • cette fonctionnalité nécessite le plan Premium. Contactez l'équipe de votre compte Databricks pour plus d'informations.

Fonctionnement du script init

Important

L' exemple de script init qui est référencé dans cet article dérive son secret de chiffrement partagé du hachage du magasin de clés stocké dans DBFS. Si vous faites pivoter le secret en mettant à jour le fichier de magasin de clés dans DBFS, tous les clusters en cours d’exécution doivent être redémarrés. Dans le cas contraire, les Workers Spark peuvent échouer à s’authentifier auprès du pilote Spark en raison d’un secret partagé incohérent, ce qui entraîne un ralentissement des tâches. En outre, étant donné que le secret partagé est stocké dans DBFS, tout utilisateur disposant d’un accès DBFS peut récupérer le secret à l’aide d’un bloc-notes.

Les requêtes et les transformations utilisateur sont généralement envoyées à vos clusters via un canal chiffré. Par défaut, cependant, les données échangées entre les nœuds worker d'un cluster ne sont pas cryptées. Si votre environnement exige que les données soient chiffrées à tout moment (qu’elles soient au repos ou en transit), vous pouvez créer un script init qui configure vos clusters pour chiffrer le trafic entre les nœuds Worker, à l’aide du chiffrement AES 256 bits sur une connexion TLS 1.3.

Remarque

Bien qu’AES active les routines de chiffrement pour tirer parti de l’accélération matérielle, il y a une baisse des performances par rapport au trafic non chiffré. Cette pénalité peut entraîner des requêtes plus longues sur un cluster chiffré, en fonction de la quantité de données mélangées entre les nœuds.

Pour activer le chiffrement du trafic entre les nœuds Worker, vous devez définir des paramètres de configuration Spark via un script init. Vous pouvez utiliser un script d'initialisation à l'échelle du cluster pour un seul cluster ou ajouter un script d'initialisation à l'échelle du cluster à vos stratégies de cluster si vous souhaitez que tous les clusters de votre espace de travail utilisent le chiffrement de travailleur à travailleur.

Une fois, copiez le fichier de magasin de clés dans un répertoire dans DBFS. Créez ensuite le script init qui applique les paramètres de chiffrement.

Le script init doit effectuer les tâches suivantes :

  1. Récupérez le fichier de magasin de clés JKS et le mot de passe.
  2. Définissez la configuration de l’exécuteur Spark.
  3. Définissez la configuration du pilote Spark.

Remarque

Le fichier de magasin de clés JKS utilisé pour activer SSL/HTTPs est généré dynamiquement pour chaque espace de travail. Le mot de passe du fichier de magasin de clés JKS est codé en dur et n’est pas destiné à protéger la confidentialité du magasin de clés.

Voici un exemple de script init qui implémente ces trois tâches pour générer la configuration de chiffrement du cluster.

Exemple de script init

#!/bin/bash

set -euo pipefail

keystore_dbfs_file="/dbfs/<keystore-directory>/jetty_ssl_driver_keystore.jks"

## Wait till keystore file is available via Fuse

max_attempts=30
while [ ! -f ${keystore_dbfs_file} ];
do
  if [ "$max_attempts" == 0 ]; then
    echo "ERROR: Unable to find the file : $keystore_dbfs_file .Failing the script."
    exit 1
  fi
  sleep 2s
  ((max_attempts--))
done
## Derive shared internode encryption secret from the hash of the keystore file
sasl_secret=$(sha256sum $keystore_dbfs_file | cut -d' ' -f1)

if [ -z "${sasl_secret}" ]; then
  echo "ERROR: Unable to derive the secret.Failing the script."
  exit 1
fi

# The JKS keystore file used for enabling SSL/HTTPS
local_keystore_file="$DB_HOME/keys/jetty_ssl_driver_keystore.jks"
# Password of the JKS keystore file. This jks password is hardcoded and is not intended to protect the confidentiality
# of the keystore. Do not assume the keystore file itself is protected.
local_keystore_password="gb1gQqZ9ZIHS"

## Updating spark-branch.conf is only needed for driver

if [[ $DB_IS_DRIVER = "TRUE" ]]; then
  driver_conf=${DB_HOME}/driver/conf/spark-branch.conf
  echo "Configuring driver conf at $driver_conf"

  if [ ! -e $driver_conf ] ; then
    touch $driver_conf
  fi

cat << EOF >>  $driver_conf
  [driver] {
    // Configure inter-node authentication
  "spark.authenticate" = true
  "spark.authenticate.secret" = "$sasl_secret"
  // Configure AES encryption
  "spark.network.crypto.enabled" = true
  "spark.network.crypto.saslFallback" = false
  // Configure SSL
  "spark.ssl.enabled" = true
  "spark.ssl.keyPassword" = "$local_keystore_password"
  "spark.ssl.keyStore" = "$local_keystore_file"
  "spark.ssl.keyStorePassword" = "$local_keystore_password"
  "spark.ssl.protocol" ="TLSv1.3"
  "spark.ssl.standalone.enabled" = true
  "spark.ssl.ui.enabled" = true
  }
EOF
  echo "Successfully configured driver conf at $driver_conf"
fi

# Setting configs in spark-defaults.conf for the spark master and worker

spark_defaults_conf="$DB_HOME/spark/conf/spark-defaults.conf"
echo "Configuring spark defaults conf at $spark_defaults_conf"
if [ ! -e $spark_defaults_conf ] ; then
  touch $spark_defaults_conf
fi

cat << EOF >>  $spark_defaults_conf
spark.authenticate true
spark.authenticate.secret $sasl_secret
spark.network.crypto.enabled true
spark.network.crypto.saslFallback false

spark.ssl.enabled true
spark.ssl.keyPassword $local_keystore_password
spark.ssl.keyStore $local_keystore_file
spark.ssl.keyStorePassword $local_keystore_password
spark.ssl.protocol TLSv1.3
spark.ssl.standalone.enabled true
spark.ssl.ui.enabled true
EOF

echo "Successfully configured spark defaults conf at $spark_defaults_conf"

Une fois l’initialisation des nœuds de pilote et de travail terminée, tout le trafic entre ces nœuds est chiffré à l’aide du fichier de magasin de clés.

Exemple de Notebook : Installer un script d'initialisation de chiffrement

Le bloc-notes suivant copie le fichier de magasin de clés et génère le script init dans DBFS. Vous pouvez utiliser le script init pour créer de nouveaux clusters pour lesquels le chiffrement est activé.

Installer un bloc-notes de script d’initialisation de chiffrement

Obtenir le notebook

Désactiver le chiffrement entre les nœuds Worker

Pour désactiver le chiffrement entre les nœuds Worker, supprimez le script init de la configuration du cluster, puis redémarrez le cluster.