Pular para o conteúdo principal

Criptografar o tráfego entre o clustering worker nodes

info

Visualização

Esse recurso está em Public Preview.

important

O exemplo init script, mencionado neste artigo, deriva seu segredo de criptografia compartilhado do hash do armazenamento de chaves armazenado em DBFS. Se o senhor alternar o segredo atualizando o arquivo keystore no DBFS, todos os clusters em execução deverão ser reiniciados. Caso contrário, o Spark worker pode não conseguir se autenticar com o driver Spark devido a um segredo compartilhado inconsistente, causando lentidão no trabalho. Além disso, como o segredo compartilhado é armazenado em DBFS, qualquer usuário com acesso a 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:

  • Uso geral: M-fleet, Md-fleet, M5dn, M5n, M5zn, M7g, M7gd, M6i, M7i, M6id, M6in, M6idn
  • computar otimizado: C-fleet, 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

Esse recurso requer o plano Enterprise. Entre em contato com a equipe do Databricks account para obter mais informações.

Como funciona o site init script

important

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

As consultas e transformações do usuário são normalmente enviadas ao seu clustering por um canal criptografado. Por default, no entanto, os dados trocados entre os nós de worker em um clustering 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 o clustering 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.

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 fazer com que as consultas demorem mais em um clustering criptografado, dependendo da quantidade de dados embaralhados entre os nós.

A ativação da criptografia do tráfego entre os nós do worker requer a definição dos parâmetros de configuração do Spark por meio de um init script. O senhor 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 quiser que todos os clusters em seu workspace usem a criptografia worker- aworker.

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

O site init script deve executar a seguinte tarefa:

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

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

A seguir, um exemplo em init script que implementa essas três tarefas para gerar a configuração de criptografia de clustering.

Exemplo init script

Bash
#!/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 do driver e dos nós do worker estiver concluída, todo o tráfego entre esses nós será criptografado usando o arquivo keystore.

Notebook exemplo: Instalar uma criptografia init script

O seguinte Notebook copia o arquivo keystore e gera o init script em DBFS. O senhor pode usar o site init script para criar um novo clustering com a criptografia ativada.

Instale uma criptografia init script Notebook

Open notebook in new tab

Desativar a criptografia entre os nós do worker

Para desativar a criptografia entre os nós do worker, remova o init script da configuração de clustering e, em seguida, reinicie o clustering.