Compartilhar via


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

Importante

O exemplo de script de inicialização referenciado neste artigo deriva o segredo de criptografia compartilhado do hash do repositório de chaves armazenado no DBFS. Se você girar o segredo atualizando o arquivo de repositório de chaves no DBFS, todos os clusters em execução deverão ser reiniciados. Caso contrário, os trabalhos do Spark poderão falhar na autenticação com o driver do Spark devido a um segredo inconsistente compartilhado, causando lentidão nos trabalhos. Além disso, como o segredo compartilhado é armazenado no DBFS, qualquer usuário com acesso ao DBFS pode recuperá-lo usando um bloco de anotações.

Requisitos

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

Como funciona o script de inicialização

Importante

O exemplo de script de inicialização referenciado neste artigo deriva o segredo de criptografia compartilhado do hash do repositório de chaves armazenado no DBFS. Se você girar o segredo atualizando o arquivo de repositório de chaves no DBFS, todos os clusters em execução deverão ser reiniciados. Caso contrário, os trabalhos do Spark poderão falhar na autenticação com o driver do Spark devido a um segredo inconsistente compartilhado, causando lentidão nos trabalhos. Além disso, como o segredo compartilhado é armazenado no DBFS, qualquer usuário com acesso ao DBFS pode recuperá-lo usando um bloco de anotações.

Consultas e transformações de usuário normalmente são enviadas aos seus clusters por um canal criptografado. No entanto, os dados trocados entre nós de trabalho em um cluster não são criptografados por padrão. Se seu ambiente exigir que os dados sejam criptografados em todos os momentos, em repouso ou em trânsito, você poderá criar um script de inicialização 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.

Observação

Embora o AES permita que rotinas criptográficas aproveitem a aceleração de hardware, há uma queda no desempenho em comparação com o tráfego não criptografado. Essa queda pode resultar na demora maior de consultas em um cluster criptografado, dependendo do volume de dados em ordem aleatória entre os nós.

A habilitação da 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 de inicialização. 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 políticas de cluster se quiser que todos os clusters em seu workspace usem criptografia de trabalho para trabalho.

Uma vez, copie o arquivo do repositório de chaves para um diretório no DBFS. Em seguida, crie o script de inicialização que aplica as configurações de criptografia.

O script de inicialização deve executar as seguintes tarefas:

  1. Obter o arquivo e a senha do repositório de chaves do JKS.
  2. Definir a configuração do executor do Spark.
  3. Definir a configuração do driver do Spark.

Observação

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

Veja a seguir um exemplo de script de inicialização que implementa essas três tarefas para gerar a configuração de criptografia de cluster.

Exemplo de script de inicialização

#!/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 inicialização dos nós de driver e de trabalho ser concluída, todo o tráfego entre esses nós será criptografado com o uso do arquivo do repositório de chaves.

Exemplo de notebook: instalar um script de inicialização de criptografia

O bloco de anotações a seguir copia o arquivo de repositório de chaves e gera o script de inicialização no DBFS. Você pode usar o script de inicialização para criar novos clusters com criptografia habilitada.

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

Obter notebook

Desabilitar a criptografia entre nós de trabalho

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