Verkeer tussen clusterwerkknooppunten versleutelen
Belangrijk
Het init-voorbeeldscript waarnaar in dit artikel wordt verwezen, leidt het gedeelde versleutelingsgeheim af van de hash van het sleutelarchief dat is opgeslagen in DBFS. Als u het geheim roteert door het sleutelarchiefbestand bij te werken in DBFS, moeten alle actieve clusters opnieuw worden opgestart. Anders kunnen Spark-werkrollen mogelijk niet worden geverifieerd met het Spark-stuurprogramma vanwege inconsistent gedeeld geheim, waardoor taken vertragen. Aangezien het gedeelde geheim wordt opgeslagen in DBFS, kan elke gebruiker met DBFS-toegang het geheim ophalen met behulp van een notebook.
Vereisten
- Voor deze functie is het Premium-abonnement vereist. Neem contact op met uw Databricks-accountteam voor meer informatie.
Hoe het init-script werkt
Belangrijk
Het init-voorbeeldscript waarnaar in dit artikel wordt verwezen, leidt het gedeelde versleutelingsgeheim af van de hash van het sleutelarchief dat is opgeslagen in DBFS. Als u het geheim roteert door het sleutelarchiefbestand bij te werken in DBFS, moeten alle actieve clusters opnieuw worden opgestart. Anders kunnen Spark-werkrollen mogelijk niet worden geverifieerd met het Spark-stuurprogramma vanwege inconsistent gedeeld geheim, waardoor taken vertragen. Aangezien het gedeelde geheim wordt opgeslagen in DBFS, kan elke gebruiker met DBFS-toegang het geheim ophalen met behulp van een notebook.
Gebruikersquery's en transformaties worden doorgaans via een versleuteld kanaal naar uw clusters verzonden. De gegevens die worden uitgewisseld tussen werkknooppunten in een cluster, worden standaard niet versleuteld. Als uw omgeving vereist dat gegevens altijd worden versleuteld, ongeacht of ze in rust of onderweg zijn, kunt u een init-script maken waarmee uw clusters worden geconfigureerd voor het versleutelen van verkeer tussen werkknooppunten met behulp van AES 256-bits versleuteling via een TLS 1.3-verbinding.
Notitie
Hoewel AES cryptografische routines in staat stelt om te profiteren van hardwareversnelling, is er een prestatieverlies vergeleken met niet-versleuteld verkeer. Deze boete kan ertoe leiden dat query's langer duren voor een versleuteld cluster, afhankelijk van de hoeveelheid gegevens die tussen knooppunten wordt verdeeld.
Het inschakelen van versleuteling van verkeer tussen werkknooppunten vereist het instellen van Spark-configuratieparameters via een init-script. U kunt een init-script met clusterbereik gebruiken voor één cluster of een init-script met clusterbereik toevoegen aan uw clusterbeleid als u wilt dat alle clusters in uw werkruimte worker-to-worker-versleuteling gebruiken.
Kopieer het sleutelarchiefbestand één keer naar een map in DBFS. Maak vervolgens het init-script waarmee de versleutelingsinstellingen worden toegepast.
Het init-script moet de volgende taken uitvoeren:
- Haal het JKS-sleutelarchiefbestand en -wachtwoord op.
- Stel de Spark-uitvoerprogrammaconfiguratie in.
- Stel de configuratie van het Spark-stuurprogramma in.
Notitie
Het JKS-sleutelarchiefbestand dat wordt gebruikt voor het inschakelen van SSL/HTTPS, wordt dynamisch gegenereerd voor elke werkruimte. Het wachtwoord van het JKS-sleutelarchiefbestand is vastgelegd en is niet bedoeld om de vertrouwelijkheid van het sleutelarchief te beschermen.
Hier volgt een voorbeeld van een init-script waarmee deze drie taken worden geïmplementeerd om de configuratie van de clusterversleuteling te genereren.
Voorbeeld van 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"
Zodra de initialisatie van de stuurprogramma- en werkknooppunten is voltooid, wordt al het verkeer tussen deze knooppunten versleuteld met behulp van het sleutelarchiefbestand.
Notebook-voorbeeld: Een init-script voor versleuteling installeren
In dit volgende notebook wordt het sleutelarchiefbestand gekopieerd en wordt het init-script in DBFS gegenereerd. U kunt het init-script gebruiken om nieuwe clusters te maken waarvoor versleuteling is ingeschakeld.
Een init-scriptnotebook voor versleuteling installeren
Versleuteling tussen werkknooppunten uitschakelen
Als u versleuteling tussen werkknooppunten wilt uitschakelen, verwijdert u het init-script uit de clusterconfiguratie en start u het cluster opnieuw op.