Share via


Encriptar o tráfego entre os nós de trabalho do cluster

Importante

O script init de exemplo mencionado neste artigo deriva seu segredo de criptografia compartilhado do hash do keystore armazenado no DBFS. Se você girar o segredo atualizando o arquivo keystore no DBFS, todos os clusters em execução deverão ser reiniciados. Caso contrário, os trabalhadores do Spark podem não conseguir se autenticar com o driver do Spark devido a um segredo compartilhado inconsistente, fazendo com que os trabalhos fiquem mais lentos. Além disso, como o segredo compartilhado é armazenado no DBFS, qualquer usuário com acesso ao DBFS pode recuperar o segredo usando um bloco de anotações.

Requisitos

  • Este recurso requer o plano Premium. Entre em contato com sua equipe de conta Databricks para obter mais informações.

Como funciona o script init

Importante

O script init de exemplo mencionado neste artigo deriva seu segredo de criptografia compartilhado do hash do keystore armazenado no DBFS. Se você girar o segredo atualizando o arquivo keystore no DBFS, todos os clusters em execução deverão ser reiniciados. Caso contrário, os trabalhadores do Spark podem não conseguir se autenticar com o driver do Spark devido a um segredo compartilhado inconsistente, fazendo com que os trabalhos fiquem mais lentos. Além disso, como o segredo compartilhado é armazenado no DBFS, qualquer usuário com acesso ao DBFS pode recuperar o segredo usando um bloco de anotações.

As consultas e transformações do utilizador normalmente são enviadas para os seus clusters através de um canal encriptado. No entanto, por predefinição, o intercâmbio de dados entre nós de trabalho num cluster não é encriptado. Se seu ambiente exigir que os dados sejam criptografados o tempo todo, seja em repouso ou em trânsito, você poderá criar um script init que configure seus clusters para criptografar o tráfego entre nós de trabalho, usando criptografia AES de 256 bits em uma conexão TLS 1.3.

Nota

Embora o AES permita que as 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 resultar em consultas mais demoradas em um cluster criptografado, dependendo da quantidade de dados embaralhados entre nós.

Habilitar a criptografia de tráfego entre nós de trabalho requer a definição de parâmetros de configuração do Spark por meio de um script init. Você pode usar um script de inicialização com escopo de cluster para um único cluster ou adicionar um script de inicialização com escopo de cluster às suas políticas de cluster se quiser que todos os clusters em seu espaço de trabalho usem criptografia de trabalhador para trabalhador.

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

O script init deve executar as seguintes tarefas:

  1. Obtenha o arquivo keystore JKS e a senha.
  2. Defina a configuração do executor do Spark.
  3. Defina a configuração do driver Spark.

Nota

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

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

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

Quando a inicialização dos nós de driver e de trabalho estiver concluída, todo o tráfego entre esses nós será criptografado usando o arquivo keystore.

Exemplo de bloco de notas: Instalar um script de inicialização de encriptação

Este bloco de anotações a seguir copia o arquivo keystore e gera o script init no DBFS. Você pode usar o script init para criar novos clusters com a criptografia habilitada.

Instalar um bloco de anotações de script de inicialização de criptografia

Obter o bloco de notas

Desabilitar a criptografia entre nós de trabalho

Para desabilitar a criptografia entre nós de trabalho, remova o script init da configuração do cluster e reinicie o cluster.