Criptografe o tráfego entre os nós de trabalho clusters
Visualização
Este recurso está em visualização pública.
Importante
O 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
O 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:
Obtenha o arquivo de armazenamento de chaves JKS e a senha.
Defina a configuração do executor do Spark.
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.