Condividi tramite


Crittografare il traffico tra i nodi di lavoro del cluster

Importante

Lo script init di esempio a cui si fa riferimento in questo articolo prende il segreto di crittografia condiviso dall'hash dell'archivio chiavi memorizzato in DBFS. Se si ruota il segreto aggiornando il file dell'archivio chiavi in DBFS, è necessario riavviare tutti i cluster in esecuzione. In caso contrario, i ruoli di lavoro Spark potrebbero non eseguire l'autenticazione con il driver Spark a causa di segreti condivisi incoerenti, causando un rallentamento dei processi. Inoltre, poiché il segreto condiviso viene archiviato in DBFS, qualsiasi utente con accesso DBFS può recuperare il segreto usando un notebook.

Requisiti

  • Questa funzionalità richiede il piano Premium. Per maggiori informazioni, contattare il team dell'account Databricks.

Funzionamento dello script init

Importante

Lo script init di esempio a cui si fa riferimento in questo articolo prende il segreto di crittografia condiviso dall'hash dell'archivio chiavi memorizzato in DBFS. Se si ruota il segreto aggiornando il file dell'archivio chiavi in DBFS, è necessario riavviare tutti i cluster in esecuzione. In caso contrario, i ruoli di lavoro Spark potrebbero non eseguire l'autenticazione con il driver Spark a causa di segreti condivisi incoerenti, causando un rallentamento dei processi. Inoltre, poiché il segreto condiviso viene archiviato in DBFS, qualsiasi utente con accesso DBFS può recuperare il segreto usando un notebook.

Le query e le trasformazioni degli utenti vengono in genere inviate ai cluster tramite un canale crittografato. Per impostazione predefinita, tuttavia, i dati scambiati tra nodi di lavoro in un cluster non vengono crittografati. Se l'ambiente richiede che i dati vengano crittografati sempre, sia quelli inattivi che quelli in transito, è possibile creare uno script init che configura i cluster per crittografare il traffico tra nodi di lavoro, usando la crittografia AES a 256 bit tramite una connessione TLS 1.3.

Nota

Sebbene AES consenta alle routine crittografiche di sfruttare l'accelerazione hardware, si verifica una riduzione delle prestazioni rispetto al traffico non crittografato. Questa penalità può comportare una maggiore quantità di query in un cluster crittografato, a seconda della quantità di dati casuali tra i nodi.

L'abilitazione della crittografia del traffico tra nodi di lavoro richiede l'impostazione dei parametri di configurazione di Spark tramite uno script init. È possibile usare uno script init con ambito cluster per un singolo cluster o aggiungere uno script init con ambito cluster ai criteri del cluster se si vuole che tutti i cluster nell'area di lavoro usino la crittografia da lavoro a lavoro.

Copiare una volta il file keystore in una directory di DBFS. Creare quindi lo script init che applica le impostazioni di crittografia.

Questo script init esegue le operazioni seguenti:

  1. Ottenere il file e la password dell'archivio chiavi del servizio Azure Kubernetes.
  2. Impostare la configurazione dell'executor Spark.
  3. Impostare la configurazione del driver Spark.

Nota

Il file dell'archivio chiavi JKS usato per abilitare SSL/HTTPS viene generato dinamicamente per ogni area di lavoro. La password del file dell'archivio chiavi JKS è hardcoded e non è progettata per proteggere la riservatezza dell'archivio chiavi.

Di seguito è riportato un esempio di script init che implementa queste tre attività per generare la configurazione della crittografia del cluster.

Esempio di 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"

Una volta completata l'inizializzazione dei nodi driver e di lavoro, tutto il traffico tra questi nodi viene crittografato usando il file dell'archivio chiavi.

Esempio di notebook: Installare uno script init di crittografia

Questo notebook seguente copia il file dell'archivio chiavi e genera lo script init in DBFS. È possibile usare lo script init per creare nuovi cluster con la crittografia abilitata.

Installare un notebook script init per la crittografia

Ottenere il notebook

Disabilitare la crittografia tra nodi di lavoro

Per disabilitare la crittografia tra nodi di lavoro, rimuovere lo script init dalla configurazione del cluster, quindi riavviare il cluster.