Databricksワークスペースストレージに対する顧客管理キーの適用

[Customer\-managed keys for workspace storage \| Databricks on AWS](https://docs.databricks.com/security/keys/customer-managed-keys-storage-aws.html) [2021/10/11時点]の翻訳です。

> **注意**
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては[英語ドキュメント](https://docs.databricks.com)を参照ください。

> **プレビュー**
本機能は[パブリックプレビュー](https://docs.databricks.com/release-notes/release-types.html)です。

顧客管理キーをワークスペースストレージに適用するには、ワークスペースは[E2バージョンのDatabricksプラットフォーム](https://docs.databricks.com/getting-started/overview.html#e2-architecture)にある必要があります。すべての新規Databricksアカウント、ほとんどの既存アカウントはE2となっていおり、新規E2ワークスペースを作成することができます。お使いのアカウントでいくつかのワークスペースが古い場合があり、E2ではない場合があります。この場合、ワークスペースストレージにつ子客管理キーを追加することはできません。アカウントタイプが不明の場合には、Databricks担当にお問い合わせください。また、この機能を利用するにはEnterpriseのプランである必要があります。

ワークスペースのデータプレーンのVPCはAWSのリージョン、`ap-northeast-1`、`ap-south-1`、`ap-southeast-1`、`ap-southeast-2`、`ca-central-1`、`eu-west-1`、`eu-west-2`、`eu-central-1`、`us-east-1`、`us-east-2`、`us-west-1`、`us-west-2`に存在する必要があります。しかし、[マネージドサービス](https://docs.databricks.com/security/keys/customer-managed-keys-managed-services-aws.html#)と[ワークスペースストレージ](https://docs.databricks.com/security/keys/customer-managed-keys-storage-aws.html)の暗号化に顧客管理キーを使用する場合には`us-west-1`のVPCを使うことはできません。

# イントロダクション

複数の方法でワークスペースストレージを暗号化するための暗号化キーを追加することができます。

- **ワークスペースのルートS3バケット:** ワークスペースストレージの暗号化キーを追加すると、Databricksは[ワークスペースをセットアップする際に指定した](https://docs.databricks.com/administration-guide/account-api/aws-storage.html)AWSアカウントのワークスペースのルートS3バケットと呼ばれるAWS S3バケットのデータを暗号化します。このバケットには、ワークスペースの[DBFSルート](https://docs.databricks.com/data/databricks-file-system.html#dbfs-root)(例えば、ワークスペースライブラリ、FileStore領域)、ワークスペースのシステムデータ(例えば、ジョブの結果、ノートブックのバージョン)が含まれます。
- **クラスターのEBSボリューム(オプション):** それぞれのDatabricksランタイムクラスターノードのリモートEBSボリューム。

この機能で特筆すべき点として以下があります。

- **新規ルートS3バケットの書き込みのみが影響を受けます:** ストレージキーを追加した後、新規のキーはルートS3バケットの新規データに対してのみ使用されます。ルートS3バケットの既存データが、お使いのキーで再度暗号化されることは保証されません。再度の書き込み、更新で後ほどお使いのキーで既存データが暗号化されるかもしれません。バケットからデータを読み込むサービスは、キーの追加前後に書き込まれたオブジェクトを読み込むことができます。
- **DBFSマウントは影響を受けません:** この機能の影響を受ける唯一のDBFSのデータは、ルートS3バケットにおける[DBFSルート](https://docs.databricks.com/data/databricks-file-system.html#dbfs-root)です。これには、ワークスペースライブラリとFileStore領域が含まれます。本格運用におけるお客様データを対象にしていません。[他のバケット、データソースに対するDBFSマウント](https://docs.databricks.com/data/databricks-file-system.html#mount-object-storage-to-dbfs)を一つ以上作成されているかもしれませんが、DBFSマウント上のデータはワークスペースストレージの顧客管理キーを用いて暗号化されません。S3 DBFSマウントに対しては、[お使いのキーを用いてデータを暗号化する別のアプローチ](https://docs.databricks.com/data/data-sources/aws/amazon-s3.html#encryption)が存在します。
- **コントロールプレーンの暗号化は影響を受けません:** この機能は、DatabricksのAWSアカウントにあるDatabricksのコントロールプレーンに格納されているデータには影響を与えません。コントロールプレーンにあるノートブックコマンド、シークレットを暗号化するには、[Databricksマネージドサービスに対する顧客管理キーの適用](https://qiita.com/taka_yayoi/items/c44d35e0e2fd76e44bbe)を参照ください。
- **問題の診断を容易にするには、S3のオブジェクトレベルロギングを有効化してください:** [お使いのルートS3バケットでCloudTrailのS3オブジェクトレベルのロギングを有効化](https://docs.databricks.com/administration-guide/account-api/aws-storage.html#object-level-logging)することをお勧めします。
- **キーのローテーション:** ワークスペースのストレージに対する顧客管理キーを設定した後で、ワークスペースに対して異なるキーのARNを設定することでキーをローテートすることはできません。しかし、[AWSのドキュメント](https://docs.aws.amazon.com/kms/latest/developerguide/rotate-keys.html)にあるように、AWSではキーのARNを変更することなしに、背後のキーをローテートする[自動CMKマスターキーローテーション](https://docs.aws.amazon.com/kms/latest/developerguide/rotate-keys.html)を提供しています。自動CMKマスターキーローテーションは、Databricksのストレージ用顧客管理キーと互換性があります。

ワークスペースストレージに対する[AWS KMSキー](https://docs.databricks.com/security/keys/customer-managed-keys-storage-aws.html#key)や[Databricksキー設定](https://docs.databricks.com/security/keys/customer-managed-keys-storage-aws.html#key-config)を他のワークスペースと共有することができます。

Databricksにおける2つの顧客管理キーの*ユースケース*として、ドキュメント、Databricks APIでは、(お使いのAWSアカウントにおける)ストレージ暗号化と(DatabricksのAWSアカウントにおける)マネージドサービスの暗号化に言及しています。両方のユースケースにおいて、ワークスペース間でキー、キー設定を共有するためには、マネージドサービスに対する顧客管理キーはワークスペース作成の際に追加する必要があるため、ワークスペース作成時(失敗したワークスペースの更新を含む)に行う必要があります。既存ワークスペースに対してすでにマネージドサービスの暗号化が有効化されているのであれば、ワークスペースの暗号化とキーを共有することができますが、ワークスペースと同じキーARNを用いて新たなキー設定の作成、登録する必要があります。

ワークスペースストレージの暗号化を行う新規ワークスペースを作成するには、本書の残りをスキップし、[Create a new workspace using the Account API](https://docs.databricks.com/administration-guide/account-api/new-workspace.html)を参照ください。こちらのドキュメントでは、オプションとして、2つの暗号化ユースケース(ワークスペースストレージと[Databricksマネージドサービスに対する顧客管理キー](https://qiita.com/taka_yayoi/items/c44d35e0e2fd76e44bbe))間でキー設定を共有する方法を説明しています。

本書では、稼働中のワークスペースにワークスペースストレージの暗号化キーを追加する方法を説明しています。

# ステップ1: キーの作成、選択

1. [Creating symmetric CMKs](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html#create-symmetric-cmk)あるいは[Viewing keys](https://docs.aws.amazon.com/kms/latest/developerguide/viewing-keys.html)の手順に従い、AWS KMSでシンメトリックキーを作成、選択します。
1. これらの値をコピーします。後のステップでこれらを使用します。
    - **Key ARN** - コンソール、API(JSONレスポンスの`Arn`フィールド)からARNを取得します。
    - **Key alias** - AWS KMSにおける顧客管理キーの表示名を指定するエイリアス。暗号化オペレーションにおける顧客管理キーを指定するためにエイリアスを使用します。詳細に関しては、AWSのドキュメント[AWS::KMS::Alias](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kms-alias.html)、[Working with aliases](https://docs.aws.amazon.com/kms/latest/developerguide/programming-aliases.html)を参照ください。
1. **Key policy**タブで、ポリシービューに切り替えます。Databricksが暗号化、復号化オペレーションを行うためにキーを使えるように、キーポリシーを編集します。

    以下のいずれかを選択し、**Copy**をクリックします。クラスターのEBSボリュームを暗号化したくない場合には、**ルートS3バケットのみ**を選択します。

    コピーした内容をキーポリシー`"Statement"`に追加します。

    **ルートS3バケットとEBS**

    ```json:ルートS3バケットとEBS
{
  "Sid": "Allow Databricks to use KMS key for DBFS",
  "Effect": "Allow",
  "Principal":{
    "AWS":"arn:aws:iam::414351767826:root"
  },
  "Action": [
    "kms:Encrypt",
    "kms:Decrypt",
    "kms:ReEncrypt*",
    "kms:GenerateDataKey*",
    "kms:DescribeKey"
  ],
  "Resource": "*"
},
{
  "Sid": "Allow Databricks to use KMS key for DBFS (Grants)",
  "Effect": "Allow",
  "Principal":{
    "AWS":"arn:aws:iam::414351767826:root"
  },
  "Action": [
    "kms:CreateGrant",
    "kms:ListGrants",
    "kms:RevokeGrant"
  ],
  "Resource": "*",
  "Condition": {
    "Bool": {
      "kms:GrantIsForAWSResource": "true"
    }
  }
},
{
  "Sid": "Allow Databricks to use KMS key for EBS",
  "Effect": "Allow",
  "Principal": {
    "AWS": "<aws-arn-for-your-credentials>"
  },
  "Action": [
    "kms:Decrypt",
    "kms:GenerateDataKey*",
    "kms:CreateGrant",
    "kms:DescribeKey"
  ],
  "Resource": "*",
  "Condition": {
    "ForAnyValue:StringLike": {
      "kms:ViaService": "ec2.*.amazonaws.com"
    }
  }
}
    ```

    **ルートS3バケットのみ**

    ```json:ルートS3バケットのみ
{
  "Sid": "Allow Databricks to use KMS key for DBFS",
  "Effect": "Allow",
  "Principal":{
    "AWS":"arn:aws:iam::414351767826:root"
  },
  "Action": [
    "kms:Encrypt",
    "kms:Decrypt",
    "kms:ReEncrypt*",
    "kms:GenerateDataKey*",
    "kms:DescribeKey"
  ],
  "Resource": "*"
},
{
  "Sid": "Allow Databricks to use KMS key for DBFS (Grants)",
  "Effect": "Allow",
  "Principal":{
    "AWS":"arn:aws:iam::414351767826:root"
  },
  "Action": [
    "kms:CreateGrant",
    "kms:ListGrants",
    "kms:RevokeGrant"
  ],
  "Resource": "*",
  "Condition": {
    "Bool": {
      "kms:GrantIsForAWSResource": "true"
    }
  }
}
    ```

    詳細に関しては、AWSのドキュメント[Editing keys](https://docs.aws.amazon.com/kms/latest/developerguide/editing-keys.html)を参照ください。

# ステップ2: Account APIを用いた新規キー設定の作成

作成したKMSキーをDatabricksに登録するには、[create customer\-managed key configuration API](https://docs.databricks.com/dev-tools/api/latest/account.html) (`POST /accounts/<account-id>/customer-managed-keys`) をコールして、Databricksキー設定を作成します。

以下のパラメーターを指定します。

- `use_cases`: `["STORAGE"]`の1つの要素を含むJSON配列を設定します。新規ワークスペースを作成する際([Create a new workspace using the Account API](https://docs.databricks.com/administration-guide/account-api/new-workspace.html)を参照ください)には、両方のユースケースに対して単一のキー設定を作成することができます。
- `aws_key_info`: 以下のプロパティを持つJSONオブジェクトを指定します。

    - `key_arn`: AWS KMSのキーのARN。キーのARNからDatabricksがAWSリージョンを推定することに注意してください。
    - `key_alias`: (オプション) AWS KMSキーのエイリアス。
    - `reuse_key_for_cluster_volumes`: (オプション) `use_case`に`STORAGE`が含まれる場合、ここでは、クラスターのEBSボリュームの暗号化にもキーを使用するかどうかを指定します。デフォルト値は`true`であり、Databricksはクラスターボリュームの暗号化にもキーを使用します。これを`false`に設定すると、Databricksは指定されたキーを用いてEBSボリュームを暗号化しません。この場合、お使いのDatabricks EBSボリュームはデフォルトのAWS SSE暗号化、あるいは、デフォルトの[AWSアカウントレベルのEBS暗号化](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSEncryption.html#encryption-by-default)を有効化した際には、別に提供したキーを用いたAWSによるアカウントレベルのEBS暗号化が行われます。

    サンプルリクエストは以下のようになります。

    ```bash:Bash
curl -X POST -n \
  'https://accounts.cloud.databricks.com/api/2.0/accounts/<databricks-account-id>/customer-managed-keys' \
  -d '{
  "use_cases": ["STORAGE"],
  "aws_key_info": {
    "key_arn": "arn:aws:kms:us-west-2:<aws-account-id>:key/<key-id>",
    "key_alias": "my-example-key",
    "reuse_key_for_cluster_volumes": true
  }
}'
    ```

    サンプルレスポンスは以下のようになります。

    ```json:JSON
{
  "use_cases": ["STORAGE"],
  "customer_managed_key_id": "<aws-kms-key-id>",
  "creation_time": 1586447506984,
  "account_id": "<databricks-account-id>",
  "aws_key_info": {
     "key_arn": "arn:aws:kms:us-west-2:<aws-account-id>:key/<key-id>",
     "key_alias": "my-example-key",
     "reuse_key_for_cluster_volumes": true,
     "key_region": "us-west-2"
  }
}
    ```

次のステップで使用する`customer_managed_key_id`をレスポンスからコピーしておきます。

# ステップ3: すべてのクラスターのシャットダウン

すべての稼働中のクラスター、プール、SQLエンドポイントを停止します。

# ステップ4: Account APIを用いたキー設定によるワークスペースのアップデート

ワークスペースをアップデートするためにDatabricks [Account API 2\.0](https://docs.databricks.com/dev-tools/api/latest/account.html)を使用します。

[ワークスペースをアップデート](https://docs.databricks.com/dev-tools/api/latest/account.html#operation/patch-workspace)するためのAccount APIオペレーション(`PATCH /accounts/{account_id}/workspaces/{workspace_id}`)を呼び出します。必要なパラメーターは`storage_customer_managed_key_id`のみです。[キー設定を登録](#ステップ2-account-apiを用いた新規キー設定の作成)した際のJSONレスポンスから得られた`customer_managed_key_id`を設定します。

以下に例を示します。

```bash:Bash
curl -X PATCH -n \
  'https://accounts.cloud.databricks.com/api/2.0/accounts/<databricks-account-id>/workspaces/<workspace-id>' \
  -d '{
  "storage_customer_managed_key_id": "<aws-kms-key-config-id>",
}'
```

# ステップ5: キー情報の伝播を待つ

次に進む前に、APIによる更新後少なくとも20分待ちます。

> **重要！**
この期間、いかなるクラスターも起動してはいけません。

# ステップ6: クラスターの再起動

以前のステップで停止したクラスター、プール、SQLエンドポイントを起動します。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)