Criptografe o tráfego entre os nós de trabalho clusters

Visualização

Este recurso está em visualização pública.

Importante

exemplo init script mencionado neste artigo deriva seu segredo de criptografia compartilhado do hash do keystore armazenado no DBFS. Se você alternar o segredo atualizando o arquivo keystore no DBFS, todos os clusters em execução deverão ser reiniciados. Caso contrário, worker Spark poderá não conseguir autenticar-se com o driver Spark devido a um segredo compartilhado inconsistente, causando lentidão Job . Além disso, como o segredo compartilhado é armazenado no DBFS, qualquer usuário com acesso ao DBFS pode recuperar o segredo usando um Notebook.

Como alternativa, o senhor pode usar um dos seguintes tipos de instância do AWS, que criptografam automaticamente os dados entre os nós do worker sem necessidade de configuração adicional:

  • Finalidade geral: M-fleet, Md-fleet, M5dn, M5n, M5zn, M7g, M7gd, M6i, M7i, M6id, M6in, M6idn

  • computar otimizado: C5a, C5ad, C5n, C6gn, C7g, C7gd, C7gn, C6i, C6id, C7i, C6in

  • Memória otimizada: R-fleet, Rd-fleet, R7g, R7gd, R6i, R7i, R7iz, R6id, R6in, R6idn

  • Armazenamento otimizado: D3, D3en, P3dn, R5dn, R5n, I4i, I3en

  • Computação acelerada: G4dn, G5, P4d, P4de, P5

Requisitos

Este recurso requer o plano Enterprise. Contate sua equipe account do Databricks para obter mais informações.

Como funciona o init script

Importante

exemplo init script mencionado neste artigo deriva seu segredo de criptografia compartilhado do hash do keystore armazenado no DBFS. Se você alternar o segredo atualizando o arquivo keystore no DBFS, todos os clusters em execução deverão ser reiniciados. Caso contrário, worker Spark poderá não conseguir autenticar-se com o driver Spark devido a um segredo compartilhado inconsistente, causando lentidão Job . Além disso, como o segredo compartilhado é armazenado no DBFS, qualquer usuário com acesso ao DBFS pode recuperar o segredo usando um Notebook.

Normalmente, as consultas e transformações do usuário são enviadas aos clusters por meio de um canal criptografado. Por default, no entanto, os dados trocados entre os nós de worker em um cluster não são criptografados. Se o seu ambiente exigir que os dados sejam criptografados o tempo todo, seja em repouso ou em trânsito, o senhor pode criar um init script que configure os clusters para criptografar o tráfego entre os nós do worker, usando a criptografia AES de 256 bits em uma conexão TLS 1.3.

Observação

Embora o AES permita que rotinas criptográficas aproveitem a aceleração de hardware, há uma penalidade de desempenho em comparação com o tráfego não criptografado. Essa penalidade pode fazer com que query demore mais em clusters criptografados , dependendo da quantidade de dados embaralhados entre os nós.

Habilitar a criptografia do tráfego entre nós worker requer a definição de parâmetros de configuração do Spark por meio de um init script. Você pode usar um init scriptcom escopo de cluster para um único cluster ou adicionar um init script com escopo de cluster à sua política de cluster se desejar que todos os clusters em seu workspace usem criptografia de workerparaworker .

Uma vez, copie o arquivo keystore para um diretório no DBFS. Em seguida, crie o init script que aplica as configurações de criptografia.

O init script deve executar as seguintes tarefas:

  1. Obtenha o arquivo de armazenamento de chaves JKS e a senha.

  2. Defina a configuração do executor do Spark.

  3. Defina a configuração do driver Spark.

Observação

O arquivo keystore JKS usado para habilitar SSL/HTTPS é gerado dinamicamente para cada workspace. A senha do arquivo de armazenamento de chave JKS é codificada permanentemente e não se destina a proteger a confidencialidade do armazenamento de chave.

A seguir está um exemplo init script que implementa essas três tarefas para gerar a configuração de criptografia clusters .

Exemplo 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"

Após a conclusão da inicialização dos nós do driver e worker , todo o tráfego entre esses nós é criptografado usando o arquivo keystore.

Exemplo Notebook : Instalar um init scriptde criptografia

Este Notebook a seguir copia o arquivo keystore e gera o init script no DBFS. Você pode usar o init script para criar novos clusters com criptografia habilitada.

Instalar um init script de criptografia Notebook

Abra o bloco de anotações em outra guia

Desabilitar criptografia entre nós de trabalho

Para desabilitar a criptografia entre os nós worker , remova o init script da configuração clusters e, em seguida, reinicie os clusters.