クラスター ワーカー ノード間のトラフィックを暗号化する
プレビュー
この機能は パブリック プレビュー段階です。
この記事で参照されている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-fleet
、Rd-fleet
、R7g
、R7gd
、R6i
、R7i
、R7iz
、R6id
、R6in
、R6idn
- 最適化されたストレージ:
D3
、D3en
、P3dn
、R5dn
、R5n
、I4i
、I3en
- アクセラレーテッドコンピューティング:
G4dn
、G5
、P4d
、P4de
、P5
必要条件
この機能には エンタープライズプランが必要です。 詳細については、 Databricks アカウント チームにお問い合わせください。
initスクリプトのしくみ
この記事で参照されているinitスクリプトの例 は、 DBFSに格納されているキーストアのハッシュから共有暗号化シークレットを導き出しています。 DBFSでキーストア ファイルを更新してシークレットをローテーションする場合は、稼働中のすべてのクラスターを再起動する必要があります。そうしないと、共有シークレットに一貫性がないために Spark ワーカーが Spark ドライバーでの認証に失敗し、ジョブが遅くなる可能性があります。 さらに、共有シークレットは DBFS に格納されるため、DBFS アクセス権を持つすべてのユーザーがノートブックを使用してシークレットを取得できます。
ユーザー クエリと変換は、通常、暗号化されたチャンネルを介してクラスターに送信されます。 ただし、デフォルトでは、クラスター内のワーカーノード間で交換されるデータは暗号化されません。 保存中か転送中かにかかわらず、データを常に暗号化する必要がある場合は、TLS 1.3接続を介したAES 256ビット暗号化を使用して、ワーカーノード間のトラフィックを暗号化するようにクラスターを構成するinitスクリプトを作成できます。
AES を使用すると、暗号化ルーチンでハードウェア アクセラレーションを活用できますが、暗号化されていないトラフィックと比較してパフォーマンスが低下します。 このペナルティにより、ノード間でシャッフルされるデータの量によっては、暗号化されたクラスターでクエリにかかる時間が長くなる可能性があります。
ワーカー・ノード間のトラフィックの暗号化を有効にするには Spark initスクリプトを使用して構成パラメーターを設定する必要があります。 単一のクラスターに クラスタースコープのinitスクリプト を使用するか、ワークスペース内のすべてのクラスターでワーカー間の暗号化を使用する場合は、クラスタースコープのinitスクリプトをクラスターポリシーに追加できます。
1 回、キーストア・ファイルを DBFS のディレクトリーにコピーします。 次に、暗号化設定を適用するinitスクリプトを作成します。
initスクリプトは、次のタスクを実行する必要があります。
- JKS キーストア ファイルとパスワードを取得します。
- Sparkエグゼキューターの設定を行います。
- Spark ドライバーの構成を設定します。
SSL/HTTPS を有効にするために使用される JKS キーストア ファイルは、ワークスペースごとに動的に生成されます。 JKS キーストア・ファイルのパスワードはハードコーディングされており、キーストアの機密性を保護するためのものではありません。
次に、これら3つのタスクを実装してクラスター暗号化構成を生成するinitスクリプトの例を示します。
initスクリプトの例
#!/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スクリプト ノートブックのインストール
ワーカー ノード間の暗号化を無効にする
ワーカーノード間の暗号化を無効にするには、クラスター設定からinitスクリプトを削除してから、クラスターを再開します。