Kryptera trafik mellan klusterarbetsnoder

Viktigt!

Init-exempelskriptet som refereras i den här artikeln härleder sin delade krypteringshemlighet från hashen för nyckelarkivet som lagras i DBFS. Om du roterar hemligheten genom att uppdatera nyckelarkivfilen i DBFS måste alla kluster som körs startas om. Annars kan Spark-arbetare misslyckas med att autentisera med Spark-drivrutinen på grund av inkonsekvent delad hemlighet, vilket gör att jobben blir långsammare. Eftersom den delade hemligheten lagras i DBFS kan alla användare med DBFS-åtkomst hämta hemligheten med hjälp av en notebook-fil.

Behov

  • Den här funktionen kräver Premium-planen. Kontakta databricks-kontoteamet om du vill ha mer information.

Så här fungerar init-skriptet

Viktigt!

Init-exempelskriptet som refereras i den här artikeln härleder sin delade krypteringshemlighet från hashen för nyckelarkivet som lagras i DBFS. Om du roterar hemligheten genom att uppdatera nyckelarkivfilen i DBFS måste alla kluster som körs startas om. Annars kan Spark-arbetare misslyckas med att autentisera med Spark-drivrutinen på grund av inkonsekvent delad hemlighet, vilket gör att jobben blir långsammare. Eftersom den delade hemligheten lagras i DBFS kan alla användare med DBFS-åtkomst hämta hemligheten med hjälp av en notebook-fil.

Användarfrågor och transformeringar skickas vanligtvis till dina kluster via en krypterad kanal. Som standard krypteras emellertid inte data som utbyts mellan arbetsnoder i ett kluster. Om din miljö kräver att data alltid krypteras, oavsett om de är i vila eller under överföring, kan du skapa ett init-skript som konfigurerar dina kluster för att kryptera trafik mellan arbetsnoder med hjälp av AES 256-bitars kryptering via en TLS 1.3-anslutning.

Kommentar

Även om AES gör det möjligt för kryptografiska rutiner att dra nytta av maskinvaruacceleration, finns det en prestandaavgift jämfört med okrypterad trafik. Den här påföljden kan leda till att frågor tar längre tid på ett krypterat kluster, beroende på mängden data som blandas mellan noder.

Om du aktiverar kryptering av trafik mellan arbetsnoder måste du ange Spark-konfigurationsparametrar via ett init-skript. Du kan använda ett init-skript med klusteromfattning för ett enda kluster eller lägga till ett init-skript med klusteromfattning i dina klusterprinciper om du vill att alla kluster på arbetsytan ska använda kryptering från arbetar till arbetare.

En gång kopierar du nyckelarkivfilen till en katalog i DBFS. Skapa sedan init-skriptet som tillämpar krypteringsinställningarna.

Init-skriptet måste utföra följande uppgifter:

  1. Hämta JKS-nyckelarkivfilen och lösenordet.
  2. Ange Spark-körkonfigurationen.
  3. Ange Spark-drivrutinskonfigurationen.

Kommentar

JKS-nyckellagringsfilen som används för att aktivera SSL/HTTPS genereras dynamiskt för varje arbetsyta. JKS-nyckellagringsfilens lösenord är hårdkodat och är inte avsett att skydda nyckelarkivets konfidentialitet.

Följande är ett exempel på ett init-skript som implementerar dessa tre uppgifter för att generera klusterkrypteringskonfigurationen.

Exempel på init-skript

#!/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"

När initieringen av drivrutins- och arbetsnoderna är klar krypteras all trafik mellan dessa noder med hjälp av nyckellagringsfilen.

Notebook-exempel: Installera ett krypterings-init-skript

Följande notebook-fil kopierar nyckelarkivfilen och genererar init-skriptet i DBFS. Du kan använda init-skriptet för att skapa nya kluster med kryptering aktiverat.

Installera en notebook-fil för krypteringsskript

Hämta notebook-fil

Inaktivera kryptering mellan arbetsnoder

Om du vill inaktivera kryptering mellan arbetsnoder tar du bort init-skriptet från klusterkonfigurationen och startar sedan om klustret.