Küme çalışan düğümleri arasındaki trafiği şifreleme
Önemli
Bu makalede başvurulan örnek init betiği, paylaşılan şifreleme gizli dizisini DBFS'de depolanan anahtar deposunun karmasından türetir. DBFS'de anahtar deposu dosyasını güncelleştirerek gizli diziyi döndürürseniz, çalışan tüm kümelerin yeniden başlatılması gerekir. Aksi takdirde Spark çalışanları tutarsız paylaşılan gizli dizi nedeniyle Spark sürücüsünde kimlik doğrulaması başarısız olabilir ve bu da işlerin yavaşlamasına neden olabilir. Ayrıca, paylaşılan gizli dizi DBFS'de depolandığından, DBFS erişimi olan tüm kullanıcılar bir not defteri kullanarak gizli diziyi alabilir.
Gereksinimler
- Bu özellik Premium planı gerektirir. Daha fazla bilgi için Databricks hesap ekibinize başvurun.
Init betiği nasıl çalışır?
Önemli
Bu makalede başvurulan örnek init betiği, paylaşılan şifreleme gizli dizisini DBFS'de depolanan anahtar deposunun karmasından türetir. DBFS'de anahtar deposu dosyasını güncelleştirerek gizli diziyi döndürürseniz, çalışan tüm kümelerin yeniden başlatılması gerekir. Aksi takdirde Spark çalışanları tutarsız paylaşılan gizli dizi nedeniyle Spark sürücüsünde kimlik doğrulaması başarısız olabilir ve bu da işlerin yavaşlamasına neden olabilir. Ayrıca, paylaşılan gizli dizi DBFS'de depolandığından, DBFS erişimi olan tüm kullanıcılar bir not defteri kullanarak gizli diziyi alabilir.
Kullanıcı sorguları ve dönüştürmeleri genellikle şifrelenmiş bir kanal üzerinden kümelerinize gönderilir. Ancak varsayılan olarak bir kümedeki çalışan düğümleri arasında değiştirilen veriler şifrelenmez. Ortamınız bekleyen veya aktarım sırasında verilerin her zaman şifrelenmesini gerektiriyorsa, TLS 1.3 bağlantısı üzerinden AES 256 bit şifreleme kullanarak kümelerinizi çalışan düğümleri arasındaki trafiği şifrelemek üzere yapılandıran bir başlatma betiği oluşturabilirsiniz.
Not
AES, şifreleme yordamlarının donanım hızlandırmadan yararlanmasını sağlar ancak şifrelenmemiş trafiğe kıyasla bir performans cezası vardır. Bu ceza, düğümler arasında karıştırılmış veri miktarına bağlı olarak şifrelenmiş bir kümede sorguların daha uzun sürmesine neden olabilir.
Çalışan düğümleri arasındaki trafiğin şifrelenmesini etkinleştirmek için spark yapılandırma parametrelerinin bir başlatma betiği aracılığıyla ayarlanması gerekir. Çalışma alanınızdaki tüm kümelerin çalışandan çalışana şifreleme kullanmasını istiyorsanız, tek bir küme için küme kapsamlı bir başlatma betiği kullanabilir veya küme ilkelerinize küme kapsamlı bir başlatma betiği ekleyebilirsiniz.
Bir kez, keystore dosyasını DBFS'deki bir dizine kopyalayın. Ardından şifreleme ayarlarını uygulayan init betiğini oluşturun.
Init betiği aşağıdaki görevleri gerçekleştirmelidir:
- JKS keystore dosyasını ve parolasını alın.
- Spark yürütücüsü yapılandırmasını ayarlayın.
- Spark sürücü yapılandırmasını ayarlayın.
Not
SSL/HTTPS'yi etkinleştirmek için kullanılan JKS keystore dosyası her çalışma alanı için dinamik olarak oluşturulur. JKS anahtar deposu dosyasının parolası sabit kodlanmış ve anahtar deposunun gizliliğini korumak için tasarlanmamıştır.
Aşağıda, küme şifreleme yapılandırmasını oluşturmak için bu üç görevi uygulayan örnek bir başlatma betiği verilmiştir.
Örnek başlatma betiği
#!/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"
Sürücü ve çalışan düğümlerinin başlatılması tamamlandıktan sonra, bu düğümler arasındaki tüm trafik keystore dosyası kullanılarak şifrelenir.
Not defteri örneği: Şifreleme başlatma betiği yükleme
Aşağıdaki not defteri keystore dosyasını kopyalar ve DBFS'de init betiğini oluşturur. Şifreleme etkinleştirilmiş yeni kümeler oluşturmak için init betiğini kullanabilirsiniz.
Şifreleme başlatma betiği not defteri yükleme
Çalışan düğümleri arasında şifrelemeyi devre dışı bırakma
Çalışan düğümleri arasında şifrelemeyi devre dışı bırakmak için init betiğini küme yapılandırmasından kaldırın ve kümeyi yeniden başlatın.