Verkeer tussen clusterwerkknooppunten versleutelen

Belangrijk

Het init-voorbeeldscript waarnaar in dit artikel wordt verwezen, leidt het gedeelde versleutelingsgeheim af van de hash van het sleutelarchief dat is opgeslagen in DBFS. Als u het geheim roteert door het sleutelarchiefbestand bij te werken in DBFS, moeten alle actieve clusters opnieuw worden opgestart. Anders kunnen Spark-werkrollen mogelijk niet worden geverifieerd met het Spark-stuurprogramma vanwege inconsistent gedeeld geheim, waardoor taken vertragen. Aangezien het gedeelde geheim wordt opgeslagen in DBFS, kan elke gebruiker met DBFS-toegang het geheim ophalen met behulp van een notebook.

Vereisten

  • Voor deze functie is het Premium-abonnement vereist. Neem contact op met uw Databricks-accountteam voor meer informatie.

Hoe het init-script werkt

Belangrijk

Het init-voorbeeldscript waarnaar in dit artikel wordt verwezen, leidt het gedeelde versleutelingsgeheim af van de hash van het sleutelarchief dat is opgeslagen in DBFS. Als u het geheim roteert door het sleutelarchiefbestand bij te werken in DBFS, moeten alle actieve clusters opnieuw worden opgestart. Anders kunnen Spark-werkrollen mogelijk niet worden geverifieerd met het Spark-stuurprogramma vanwege inconsistent gedeeld geheim, waardoor taken vertragen. Aangezien het gedeelde geheim wordt opgeslagen in DBFS, kan elke gebruiker met DBFS-toegang het geheim ophalen met behulp van een notebook.

Gebruikersquery's en transformaties worden doorgaans via een versleuteld kanaal naar uw clusters verzonden. De gegevens die worden uitgewisseld tussen werkknooppunten in een cluster, worden standaard niet versleuteld. Als uw omgeving vereist dat gegevens altijd worden versleuteld, ongeacht of ze in rust of onderweg zijn, kunt u een init-script maken waarmee uw clusters worden geconfigureerd voor het versleutelen van verkeer tussen werkknooppunten met behulp van AES 256-bits versleuteling via een TLS 1.3-verbinding.

Notitie

Hoewel AES cryptografische routines in staat stelt om te profiteren van hardwareversnelling, is er een prestatiestraf vergeleken met niet-versleuteld verkeer. Deze boete kan ertoe leiden dat query's langer duren voor een versleuteld cluster, afhankelijk van de hoeveelheid gegevens die tussen knooppunten wordt verdeeld.

Het inschakelen van versleuteling van verkeer tussen werkknooppunten vereist het instellen van Spark-configuratieparameters via een init-script. U kunt een init-script met clusterbereik gebruiken voor één cluster of een init-script met clusterbereik toevoegen aan uw clusterbeleid als u wilt dat alle clusters in uw werkruimte worker-to-worker-versleuteling gebruiken.

Kopieer het sleutelarchiefbestand één keer naar een map in DBFS. Maak vervolgens het init-script waarmee de versleutelingsinstellingen worden toegepast.

Het init-script moet de volgende taken uitvoeren:

  1. Haal het JKS-sleutelarchiefbestand en -wachtwoord op.
  2. Stel de Spark-uitvoerprogrammaconfiguratie in.
  3. Stel de configuratie van het Spark-stuurprogramma in.

Notitie

Het JKS-sleutelarchiefbestand dat wordt gebruikt voor het inschakelen van SSL/HTTPS, wordt dynamisch gegenereerd voor elke werkruimte. Het wachtwoord van het JKS-sleutelarchiefbestand is vastgelegd en is niet bedoeld om de vertrouwelijkheid van het sleutelarchief te beschermen.

Hier volgt een voorbeeld van een init-script waarmee deze drie taken worden geïmplementeerd om de configuratie van de clusterversleuteling te genereren.

Voorbeeld van init-script

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

Zodra de initialisatie van de stuurprogramma- en werkknooppunten is voltooid, wordt al het verkeer tussen deze knooppunten versleuteld met behulp van het sleutelarchiefbestand.

Notebook-voorbeeld: Een init-script voor versleuteling installeren

In dit volgende notebook wordt het sleutelarchiefbestand gekopieerd en wordt het init-script in DBFS gegenereerd. U kunt het init-script gebruiken om nieuwe clusters te maken waarvoor versleuteling is ingeschakeld.

Een init-scriptnotebook voor versleuteling installeren

Notebook downloaden

Versleuteling tussen werkknooppunten uitschakelen

Als u versleuteling tussen werkknooppunten wilt uitschakelen, verwijdert u het init-script uit de clusterconfiguratie en start u het cluster opnieuw op.