Bagikan melalui


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:

  1. Dapatkan file keystore JKS dan kata sandi.
  2. Atur konfigurasi pelaksana Spark.
  3. 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.