Chiffrer le trafic entre les nœuds worker de cluster
Aperçu
Cette fonctionnalité est en aperçu public.
L'exemple de script d'initialisation référencé dans cet article dérive son secret de chiffrement partagé du hachage du keystore stocké dans DBFS. Si vous réinitialisez le secret en mettant à jour le fichier du keystore dans DBFS, tous les clusters en cours d'exécution doivent être redémarrés. Sinon, les workers Spark pourraient échouer à s'authentifier auprès du driver Spark en raison d'un secret partagé incohérent, ce qui entraîne un ralentissement des jobs. De plus, étant donné que le secret partagé est stocké dans DBFS, tout utilisateur ayant accès à DBFS peut récupérer le secret à l'aide d'un Notebook.
Comme alternative, vous pouvez utiliser l'un des types d'instance AWS suivants, qui chiffrent automatiquement les données entre les nœuds worker sans configuration supplémentaire requise :
- Usage général :
M-fleet,Md-fleet,M5dn,M5n,M5zn,M6i,M6id,M6idn,M6in,M7a,M7g,M7gd,M7i,M8g,M8gd,M8i - Compute optimisé :
C-fleet,C5a,C5ad,C5n,C6gn,C6i,C6id,C6in,C7a,C7g,C7gd,C7gn,C7i,C8g,C8gd - Optimisé pour la mémoire :
R-fleet,Rd-fleet,R5dn,R5n,R6i,R6id,R6idn,R6in,R7a,R7g,R7gd,R7i,R7iz,R8g,R8gb,R8gd,R8gn,R8i - Optimisé pour le stockage :
D3,D3en,I3en,I4g,I4i,I7i,I8g,Im4gn,Is4gen - Calcul accéléré :
G4dn,G5,G6,G6e,P3dn,P4d,P4de,P5
Exigences
Cette fonctionnalité nécessite le forfait Entreprise. Contactez votre équipe de compte Databricks pour plus d'informations.
Fonctionnement du script d'initialisation
L'exemple de script d'initialisation référencé dans cet article dérive son secret de chiffrement partagé du hachage du keystore stocké dans DBFS. Si vous réinitialisez le secret en mettant à jour le fichier du keystore dans DBFS, tous les clusters en cours d'exécution doivent être redémarrés. Sinon, les workers Spark pourraient échouer à s'authentifier auprès du driver Spark en raison d'un secret partagé incohérent, ce qui entraîne un ralentissement des jobs. De plus, étant donné que le secret partagé est stocké dans DBFS, tout utilisateur ayant accès à DBFS peut récupérer le secret à l'aide d'un Notebook.
Les queries utilisateur et les Transformations sont généralement envoyées à vos clusters sur un canal chiffré. Par default, cependant, les données échangées entre les nœuds Worker d'un cluster ne sont pas chiffrées. Si votre environnement exige que les données soient chiffrées en permanence, au repos ou en transit, vous pouvez créer un script d'initialisation 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.
Bien que l'AES permette aux routines cryptographiques de tirer parti de l'accélération matérielle, il existe une pénalité de performance par rapport au trafic non chiffré. Cette pénalité peut entraîner des queries plus longues sur un cluster chiffré, selon la quantité de données déplacées entre les nœuds.
L'activation du chiffrement du trafic entre les nœuds Worker nécessite la définition des paramètres de configuration Spark par le biais d'un script d'initialisation. Vous pouvez utiliser un script d'initialisation à l'échelle du cluster pour un cluster unique ou ajouter un script d'initialisation à l'échelle du cluster à vos stratégies de cluster si vous souhaitez que tous les clusters de votre Workspace utilisent le chiffrement de Worker à Worker.
Une seule fois, copiez le fichier de keystore dans un répertoire de DBFS. Créez ensuite le script d'initialisation qui applique les paramètres de chiffrement.
Le script d'initialisation doit effectuer les tâches suivantes :
- Obtenez le fichier de magasin de clés JKS et le mot de passe.
- Définissez la configuration de l'exécuteur Spark.
- Définissez la configuration du driver Spark.
Le fichier de keystore JKS utilisé pour activer SSL/HTTPS est généré dynamiquement pour chaque Workspace. Le mot de passe du fichier de keystore JKS est codé en dur et n'est pas destiné à protéger la confidentialité du keystore.
Voici un exemple de script d'initialisation qui implémente ces trois tâches pour générer la configuration de chiffrement des clusters.
Exemple de script d'initialisation
#!/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 Driver et Worker terminée, tout le trafic entre ces nœuds est chiffré à l'aide du fichier de keystore.
Exemple de Notebook : installation d'un script d'initialisation de chiffrement
Ce notebook copie le fichier de magasin de clés et génère le script d'initialisation dans DBFS. Vous pouvez utiliser le script d'initialisation pour créer de nouveaux clusters avec le chiffrement activé.
Installer un Notebook de script d'initialisation de chiffrement
Désactiver le chiffrement entre les nœuds worker
Pour désactiver le chiffrement entre les nœuds Worker, supprimez le script d'initialisation de la configuration du cluster, puis redémarrez le cluster.