Mengenkripsi lalu lintas antar node pekerja kluster
Penting
Contoh skrip inisialisasi yang dirujuk dalam artikel ini berasal rahasia enkripsi bersama dari hash keystore yang disimpan dalam DBFS. Jika Anda memutar rahasia dengan memperbarui file keystore di DBFS, semua kluster yang berjalan harus dimulai ulang. Jika tidak, pekerja Spark mungkin gagal untuk mengautentikasi dengan driver Spark karena rahasia berbagi yang tidak konsisten, menyebabkan pekerjaan melambat. Selain itu, karena rahasia bersama disimpan di DBFS, setiap pengguna dengan akses DBFS dapat mengambil rahasia menggunakan buku catatan.
Persyaratan
- Fitur ini membutuhkan rencana Premium. Hubungi tim akun Databricks Anda untuk informasi selengkapnya.
Cara kerja skrip inisialisasi
Penting
Contoh skrip inisialisasi yang dirujuk dalam artikel ini berasal rahasia enkripsi bersama dari hash keystore yang disimpan dalam DBFS. Jika Anda memutar rahasia dengan memperbarui file keystore di DBFS, semua kluster yang berjalan harus dimulai ulang. Jika tidak, pekerja Spark mungkin gagal untuk mengautentikasi dengan driver Spark karena rahasia berbagi yang tidak konsisten, menyebabkan pekerjaan melambat. Selain itu, karena rahasia bersama disimpan di DBFS, setiap pengguna dengan akses DBFS dapat mengambil rahasia menggunakan buku catatan.
Kueri dan transformasi pengguna biasanya dikirim ke kluster Anda melalui saluran terenkripsi. Secara default, bagaimanapun, data yang dipertukarkan antara node pekerja dalam sebuah kluster tidak dienkripsi. Jika lingkungan Anda mengharuskan data dienkripsi setiap saat, baik saat tidak aktif maupun saat transit, Anda dapat membuat skrip init yang mengonfigurasi kluster Anda untuk mengenkripsi lalu lintas antara simpul pekerja, menggunakan enkripsi AES 256-bit melalui koneksi TLS 1.3.
Catatan
Meskipun AES memungkinkan rutinitas kriptografi untuk memanfaatkan akselerasi perangkat keras, ada penalti performa dibandingkan dengan lalu lintas yang tidak terenkripsi. Penalti ini dapat mengakibatkan kueri memakan waktu lebih lama pada kluster terenkripsi, tergantung pada jumlah data yang dikocok antar node.
Mengaktifkan enkripsi lalu lintas antar simpul pekerja memerlukan pengaturan parameter konfigurasi Spark melalui skrip init. Anda dapat menggunakan skrip init cakupan kluster untuk satu kluster atau menambahkan skrip init yang terlingkup kluster ke kebijakan kluster Anda jika Anda ingin semua kluster di ruang kerja Anda menggunakan enkripsi pekerja ke pekerja.
Satu kali, salin file keystore ke direktori di DBFS. Kemudian buat skrip inisialisasi yang menerapkan pengaturan enkripsi.
Skrip inisialisasi harus melakukan tugas-tugas berikut:
- Dapatkan file keystore JKS dan kata sandi.
- Atur konfigurasi pelaksana Spark.
- Atur konfigurasi driver Spark.
Catatan
File keystore JKS yang digunakan untuk mengaktifkan SSL/HTTPS dibuat secara dinamis untuk setiap ruang kerja. Kata sandi file keystore JKS dikodekan secara permanen dan tidak dimaksudkan untuk melindungi kerahasiaan keystore.
Berikut ini adalah contoh skrip init yang mengimplementasikan ketiga tugas ini untuk menghasilkan konfigurasi enkripsi kluster.
Contoh skrip inisialisasi
#!/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"
Setelah inisialisasi node driver dan pekerja selesai, semua lalu lintas antara node ini dienkripsi menggunakan file keystore.
Contoh buku catatan: Menginstal skrip init enkripsi
Buku catatan berikut ini menyalin file keystore dan menghasilkan skrip inisialisasi di DBFS. Anda dapat menggunakan skrip inisialisasi untuk membuat kluster baru dengan enkripsi diaktifkan.
Memasang buku catatan skrip inisialisasi enkripsi
Ambil buku catatan
Menonaktifkan enkripsi antar node pekerja
Untuk menonaktifkan enkripsi antar simpul pekerja, hapus skrip init dari konfigurasi kluster, lalu mulai ulang kluster.