KMS を使用した S3 の暗号化の設定
この記事では、KMS s3a://
Unity Catalogまたはインスタンスプロファイル (従来の構成) を使用して パスにファイルを書き込むための キーを使用してサーバー側の暗号化を構成する方法について説明します。ワークスペースストレージバケットを暗号化するには、「 ワークスペースストレージの顧客管理キー」を参照してください。
Unity Catalog を使用して S3 の暗号化を構成する
サーバー側の暗号化を構成して、Unity Catalog の外部テーブルとボリュームが S3 のデータにアクセスできるようにすることができます。 SSE 暗号化は、Delta Sharing を使用して共有される外部テーブルではサポートされていません。
ステップ 1: AWS で KMS キーポリシーを更新する
S3 のデータを保護するために、AWS は Amazon S3 マネージドキー (SSE-S3) または AWS KMS キー (SSE-KMS) を使用したサーバー側の暗号化 (SSE) をサポートしています。 AWS S3 マネージドキーを使用する場合は、ステップ 2 に進みます。
AWS で、KMS サービスに移動します。
権限を追加するキーをクリックします。
[Key ポリシー] セクションで、[ポリシー ビューに切り替える] を選択します。
S3 がキーを使用できるようにするキーポリシーセクションを編集します。たとえば、次のようにします。
{ "Sid": "Allow access through S3 for all principals in the account that are authorized to use S3", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey" ], "Resource": "*", "Condition": { "StringEquals": { "kms:CallerAccount": "<AWS ACCOUNT ID>", "kms:ViaService": "s3.<REGION>.amazonaws.com" } } },
[変更を保存]をクリックします。
手順 2: Unity Catalog を使用して S3 へのアクセスを構成する
「AWS S3 に接続するためのストレージ認証情報を作成する」の手順に従って、S3 に接続するためのストレージ認証情報を作成します。
IAM ポリシーは、S3 バケットと同じアカウントに作成してください。 SSE-KMS を使用している場合は、ポリシーに次のものを含めます。
{ "Action": [ "kms:Decrypt", "kms:Encrypt", "kms:GenerateDataKey*" ], "Resource": [ "arn:aws:kms:<KMS-KEY>" ], "Effect": "Allow" },
「ステップ 1: IAMロールを作成する」を参照してください。
S3に接続するための外部ロケーションを作成する の手順に従って、クラウド ストレージをDatabricksに接続するための外部ロケーションを作成します。
「外部ロケーションでの暗号化アルゴリズムの構成」の手順に従って、外部ロケーションでサーバー側の暗号化を構成します。
インスタンスプロファイルを使用した S3 の暗号化の設定 (レガシー)
インスタンスプロファイルを使用して、S3 と KMS の暗号化を設定できます。 ただし、これは従来のパターンであるため、Databricks では、Unity Catalog を使用して S3 とボリュームへのアクセスを構成し、ファイルを直接操作することをお勧めします。 「Unity Catalog を使用してクラウド オブジェクト ストレージとサービスに接続する」を参照してください。
ステップ 1: インスタンスプロファイルを設定する
Databricks で、 インスタンスプロファイルを作成します。
ステップ 2: 設定で指定された KMS キーのキーユーザーとしてインスタンスプロファイルを追加する
AWS で、KMS サービスに移動します。
アクセス許可を追加するキーをクリックします。
[キー ユーザー] セクションで、[ 追加] をクリックします。
IAMロールの横にあるチェックボックスをオンにします。
[追加] をクリックします。
ステップ 3: 暗号化プロパティを設定する
グローバル KMS 暗号化のプロパティは、 Spark 構成 または initスクリプトで設定します。 独自のキー ARN を使用して spark.hadoop.fs.s3a.server-side-encryption.key
キーを設定します。
Spark 構成に以下を追加します。
spark.hadoop.fs.s3a.server-side-encryption.key arn:aws:kms:<region>:<aws-account-id>:key/<bbbbbbbb-ddd-ffff-aaa-bdddddddddd>
spark.hadoop.fs.s3a.server-side-encryption-algorithm SSE-KMS
バケットごとの KMS 暗号化を設定することもできます。 たとえば、次のキーを使用して各バケットを個別に設定できます。
# Set up authentication and endpoint for a specific bucket
spark.hadoop.fs.s3a.bucket.<bucket-name>.aws.credentials.provider <aws-credentials-provider-class>
spark.hadoop.fs.s3a.bucket.<bucket-name>.endpoint <aws-endpoint>
# Configure a different KMS encryption key for a specific bucket
spark.hadoop.fs.s3a.bucket.<bucket-name>.server-side-encryption.key <aws-kms-encryption-key>
詳細については、「 バケットごとの設定」を参照してください。
ノートブックセルで次のコードを実行して initスクリプト set-kms.sh
を作成し、スクリプトを実行する ようにクラスターを構成する ことで、グローバル暗号化設定を構成します。
dbutils.fs.put("/databricks/scripts/set-kms.sh", """
#!/bin/bash
cat >/databricks/driver/conf/aes-encrypt-custom-spark-conf.conf <<EOL
[driver] {
"spark.hadoop.fs.s3a.server-side-encryption.key" = "arn:aws:kms:<region>:<aws-account-id>:key/<bbbbbbbb-ddd-ffff-aaa-bdddddddddd>"
"spark.hadoop.fs.s3a.server-side-encryption-algorithm" = "SSE-KMS"
}
EOL
""", True)
暗号化が機能していることを確認したら、クラスタリングスコープのinitスクリプトをクラスターポリシーに追加して、すべてのクラスタリングで暗号化を構成します。