メインコンテンツまでスキップ

クラスター ワーカー ノード間のトラフィックを暗号化する

備考

プレビュー

この機能は パブリック プレビュー段階です。

important

この記事で参照されているinitスクリプトの例 は、 DBFSに格納されているキーストアのハッシュから共有暗号化シークレットを導き出しています。 DBFSでキーストア ファイルを更新してシークレットをローテーションする場合は、稼働中のすべてのクラスターを再起動する必要があります。そうしないと、共有シークレットに一貫性がないために Spark ワーカーが Spark ドライバーでの認証に失敗し、ジョブが遅くなる可能性があります。 さらに、共有シークレットは DBFS に格納されるため、DBFS アクセス権を持つすべてのユーザーがノートブックを使用してシークレットを取得できます。

別の方法として、次のいずれかの AWS インスタンスタイプを使用して、追加の設定を必要とせずにワーカーノード間のデータを自動的に暗号化することもできます。

  • 一般用途: M-fleet, Md-fleet, M5dn, M5n, M5zn, M7g, M7gd, M6i, M7i, M6id, M6in, M6idn
  • 最適化されたコンピュート: C-fleet, C5a, C5ad, C5n, C6gn, C7g, C7gd, C7gn, C6i, C6id, C7i, C6in
  • メモリ最適化: R-fleetRd-fleetR7gR7gdR6iR7iR7izR6idR6inR6idn
  • 最適化されたストレージ: D3D3enP3dnR5dnR5nI4iI3en
  • アクセラレーテッドコンピューティング: G4dnG5P4dP4deP5

必要条件

この機能には エンタープライズプランが必要です。 詳細については、 Databricks アカウント チームにお問い合わせください。

initスクリプトのしくみ

important

この記事で参照されているinitスクリプトの例 は、 DBFSに格納されているキーストアのハッシュから共有暗号化シークレットを導き出しています。 DBFSでキーストア ファイルを更新してシークレットをローテーションする場合は、稼働中のすべてのクラスターを再起動する必要があります。そうしないと、共有シークレットに一貫性がないために Spark ワーカーが Spark ドライバーでの認証に失敗し、ジョブが遅くなる可能性があります。 さらに、共有シークレットは DBFS に格納されるため、DBFS アクセス権を持つすべてのユーザーがノートブックを使用してシークレットを取得できます。

ユーザー クエリと変換は、通常、暗号化されたチャンネルを介してクラスターに送信されます。 ただし、デフォルトでは、クラスター内のワーカーノード間で交換されるデータは暗号化されません。 保存中か転送中かにかかわらず、データを常に暗号化する必要がある場合は、TLS 1.3接続を介したAES 256ビット暗号化を使用して、ワーカーノード間のトラフィックを暗号化するようにクラスターを構成するinitスクリプトを作成できます。

注記

AES を使用すると、暗号化ルーチンでハードウェア アクセラレーションを活用できますが、暗号化されていないトラフィックと比較してパフォーマンスが低下します。 このペナルティにより、ノード間でシャッフルされるデータの量によっては、暗号化されたクラスターでクエリにかかる時間が長くなる可能性があります。

ワーカー・ノード間のトラフィックの暗号化を有効にするには Spark initスクリプトを使用して構成パラメーターを設定する必要があります。 単一のクラスターに クラスタースコープのinitスクリプト を使用するか、ワークスペース内のすべてのクラスターでワーカー間の暗号化を使用する場合は、クラスタースコープのinitスクリプトをクラスターポリシーに追加できます。

1 回、キーストア・ファイルを DBFS のディレクトリーにコピーします。 次に、暗号化設定を適用するinitスクリプトを作成します。

initスクリプトは、次のタスクを実行する必要があります。

  1. JKS キーストア ファイルとパスワードを取得します。
  2. Sparkエグゼキューターの設定を行います。
  3. Spark ドライバーの構成を設定します。
注記

SSL/HTTPS を有効にするために使用される JKS キーストア ファイルは、ワークスペースごとに動的に生成されます。 JKS キーストア・ファイルのパスワードはハードコーディングされており、キーストアの機密性を保護するためのものではありません。

次に、これら3つのタスクを実装してクラスター暗号化構成を生成するinitスクリプトの例を示します。

initスクリプトの例

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

ドライバノードとワーカーノードの初期化が完了すると、これらのノード間のすべてのトラフィックはキーストアファイルを使用して暗号化されます。

ノートブック example: Install an encryption initスクリプト

次のノートブックは、キーストアファイルをコピーし、initスクリプトを DBFSで生成します。 initスクリプトを使用して、暗号化が有効な新しいクラスターを作成できます。

暗号化 initスクリプト ノートブックのインストール

Open notebook in new tab

ワーカー ノード間の暗号化を無効にする

ワーカーノード間の暗号化を無効にするには、クラスター設定からinitスクリプトを削除してから、クラスターを再開します。