Поделиться через


Шифрование трафика между рабочими узлами кластера

Внимание

Пример скрипта инициализации, упоминаемый в этой статье, получает общий секрет шифрования из хэша хранилища ключей, хранящегося в DBFS. Если вы поменяете секрет, обновив файл хранилища ключей в DBFS, потребуется перезапустить все работающие кластеры. В противном случае рабочие роли Spark могут не пройти проверку подлинности драйвера Spark из-за несоответствия общего секрета, что приводит к замедлению работы заданий. Кроме того, поскольку общий секрет хранится в DBFS, любой пользователь с доступом к DBFS может получить секрет с помощью записной книжки.

Требования

  • Для этой функции требуется план "Премиум". Чтобы получить дополнительные сведения, обратитесь к группе учетной записи Databricks.

Принцип работы скрипта инициализации

Внимание

Пример скрипта инициализации, упоминаемый в этой статье, получает общий секрет шифрования из хэша хранилища ключей, хранящегося в DBFS. Если вы поменяете секрет, обновив файл хранилища ключей в DBFS, потребуется перезапустить все работающие кластеры. В противном случае рабочие роли Spark могут не пройти проверку подлинности драйвера Spark из-за несоответствия общего секрета, что приводит к замедлению работы заданий. Кроме того, поскольку общий секрет хранится в DBFS, любой пользователь с доступом к DBFS может получить секрет с помощью записной книжки.

Пользовательские запросы и преобразования обычно отправляются в кластеры через зашифрованный канал. Однако по умолчанию данные, которыми обмениваются рабочие узлы в кластере, не шифруются. Если вашей среде требуется, чтобы данные шифрулись в любое время, независимо от того, неактивных или передаваемых данных, можно создать скрипт инициализации, который настраивает кластеры для шифрования трафика между рабочими узлами с помощью шифрования AES 256-разрядного шифрования через подключение TLS 1.3.

Примечание.

Хотя алгоритм шифрования AES позволяет криптографическим процедурам задействовать преимущества аппаратного ускорения, производительность по сравнению с передачей незашифрованного трафиком снижается. Это может привести к увеличению времени выполнения запросов в зашифрованном кластере в зависимости от объема данных, передаваемых между узлами.

Чтобы включить шифрование трафика между рабочими узлами, необходимо задать параметры конфигурации Spark с помощью скрипта инициализации. Вы можете использовать скрипт инициализации кластера область d для одного кластера или добавить скрипт область d init в политики кластера, если вы хотите, чтобы все кластеры в рабочей области использовали шифрование рабочих и рабочих ролей.

Скопируйте файл хранилища ключей в каталог в DBFS один раз. Затем создайте скрипт инициализации, который применяет параметры шифрования.

Скрипт инициализации должен выполнять следующие задачи:

  1. Получить файл и пароль хранилища ключей JKS.
  2. Задать конфигурацию исполнителя Spark.
  3. Задать конфигурацию драйвера Spark.

Примечание.

Файл хранилища ключей JKS, используемый для включения SSL/HTTPS, динамически создается для каждой рабочей области. Пароль файла хранилища ключей JKS жестко закодирован и не предназначен для защиты конфиденциальности хранилища ключей.

Ниже приведен пример скрипта инициализации, который реализует эти три задачи для создания конфигурации шифрования кластера.

Пример скрипта инициализации

#!/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"

После завершения инициализации драйвера и рабочих узлов весь трафик между этими узлами шифруется с применением файла хранилища ключей.

Пример записной книжки. Установка скрипта инициализации шифрования

В следующем примере записная книжка копирует файл хранилища ключей и создает скрипт инициализации в DBFS. Скрипт инициализации можно использовать для создания новых кластеров с включенным шифрованием.

Установка записной книжки скрипта для инициализации шифрования

Получить записную книжку

Отключение шифрования между рабочими узлами

Чтобы отключить шифрование между рабочими узлами, удалите скрипт инициализации из конфигурации кластера, а затем перезапустите кластер.