

# Data Catalog の暗号化
<a name="encrypt-glue-data-catalog"></a>

AWS Glue Data Catalog 暗号化により、機密データのセキュリティが強化されます。AWS Glue は AWS Key Management Service (AWS KMS) と統合し、Data Catalog に保存されているメタデータを暗号化します。AWS Glue コンソールまたは AWS CLI を使用し、Data Catalog でリソースの暗号化設定を有効または無効にできます。

Data Catalog の暗号化を有効にすると、新しく作成するオブジェクトはすべて暗号化されます。暗号化を無効にすると、新しく作成するオブジェクトは暗号化されませんが、既存の暗号化オブジェクトは暗号化された状態が維持されます。

AWS マネージド暗号化キーまたはカスタマーマネージド暗号化キーを使用し、Data Catalog 全体を暗号化できます。キーの種類と状態の詳細については、AWS Key Management Service デベロッパーガイドの「[AWS Key Management Service の概念](https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html#key-state-cmk-type)」を参照してください。

**注記**  
暗号化されたデータカタログをクローラーで使用する場合、暗号化設定を維持する必要があります。クローラーが暗号化されたカタログを処理した後に暗号化設定を削除すると、エラーが発生します。暗号化設定を削除する必要がある場合は、既存のクローラを変更するのではなく、新しいクローラを作成してください。

## AWS マネージドキー
<a name="AWS-managed-keys"></a>

 AWS マネージドキーはお客様のアカウントにある KMS キーであり、AWS KMS と統合された AWS サービスがお客様に代わって作成、管理、使用します。アカウントの AWS マネージドキーの表示、キーポリシーの表示し、AWS CloudTrail ログでその使用の監査を行うことができます。ただし、キーを管理したり、許可を変更したりすることはできません。

保管時の暗号化は、メタデータの暗号化に使用される AWS Glue の AWS マネージドキーを管理するため、AWS KMS と自動的に統合されます。メタデータの暗号化を有効にしたときに AWS マネージドキーが存在しない場合、AWS KMS は自動的に新しいキーを作成します。

詳細については、[AWS マネージドキー](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk) を参照してください。

## カスタマーマネージドキー
<a name="customer-managed-keys"></a>

カスタマーマネージドキーは AWS アカウント 内の KMS キーで、ユーザーが作成、所有、および管理します。ユーザーは、この KMS キーに関する完全なコントロール権を持ちます。以下の操作を実行できます。
+  キーポリシー、IAM ポリシー、許可付与の確立と維持 
+ 有効化と無効化
+  暗号化マテリアルのローテーション 
+  タグを追加 
+ 参照するエイリアスの作成
+  削除のスケジュール設定

カスタマーマネージドキーの許可を管理する方法の詳細については、[カスタマーマネージドキー](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)を参照してください。

**重要**  
AWS Glue は、対称カスタマーマネージドキーのみをサポートしています。KMS キー リストには、対称キーのみが表示されます。ただし、**[KMS キー ARN の選択]** を選択した場合、任意のキータイプの ARN をコンソールで入力します。対称キーには ARN だけを入力するようにしてください。  
対称カスタマーマネージドキーを作成するには、AWS Key Management Service デベロッパーガイドの「[対称カスタマーマネージドキーの作成](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html#create-symmetric-cmk)」の手順に従ってください。

保存時に Data Catalog の暗号化を有効にすると、KMS キーを使用して次のリソースタイプが暗号化されます。
+ データベース
+ テーブル
+ パーティション
+ テーブルのバージョン
+ 列統計
+ ユーザー定義関数
+ Data Catalog のビュー

## AWS Glue の暗号化コンテキスト
<a name="encryption-context"></a>

 [暗号化コンテキスト](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context)とは、データに関する追加のコンテキスト情報を含むために、使用する (オプションの) キーと値のペアのセットです。AWS KMS は、暗号化コンテキストを[追加の認証済みデータ](https://docs.aws.amazon.com/crypto/latest/userguide/cryptography-concepts.html#term-aad)として使用し、[暗号化の認証](https://docs.aws.amazon.com/crypto/latest/userguide/cryptography-concepts.html#define-authenticated-encryption)をサポートします。データの暗号化リクエストに暗号化コンテキストを組み込むと、AWS KMS は暗号化コンテキストを暗号化後のデータにバインドします。データを復号化するには、リクエストに同じ暗号化コンテキストを含めます。AWS Glue はすべての AWS KMS の暗号化処理に同じ暗号化コンテキストを使用する際、キーは `glue_catalog_id` で値は `catalogId` を指定します。

```
"encryptionContext": {
    "glue_catalog_id": "111122223333"
}
```

 AWS マネージドキーまたは対称カスタマーマネージドキーを使用して Data Catalog を暗号化するとき、監査レコードとログで暗号化コンテキストも使用することができ、キーがどのように使用されているか特定することができます。暗号化コンテキストは、AWS CloudTrail または Amazon CloudWatch ログが生成したログにも表示されます。

## 暗号化の有効化
<a name="enable-encryption"></a>

 AWS Glue コンソールの **[データカタログの設定]** または AWS CLI を使用し、AWS Glue Data Catalog オブジェクトの暗号化を有効にできます。

------
#### [ Console ]

**コンソールを使用して暗号化を有効にするには**

1. AWS マネジメントコンソール にサインインし、AWS Glue コンソール ([https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)) を開きます。

1. ナビゲーションペインで、**[データカタログ]** を選択します。

1. **[データカタログの設定]** ページで、**[メタデータの暗号化]** チェックボックスを選択し、AWS KMS​ キーを選択します。

   暗号化を有効にするとき、カスタマーマネージドキーを指定しない場合、暗号化設定では AWS マネージド KMS キーが使用されます。

1. (オプション) カスタマーマネージドキーを使用して Data Catalog を暗号化すると、リソースを暗号化および復号化するため、Data Catalog は IAM ロールを登録するオプションを提供します。お客様に代わって AWS Glue が引き受ける IAM ロールの許可を付与する必要があります。データを暗号化および復号する AWS KMS アクセス許可が含まれます。

   Data Catalog に新しいリソースを作成すると、AWS Glue はデータを暗号化するために提供される IAM ロールを引き受けます。同様に、コンシューマがリソースにアクセスすると、AWS Glue はデータを復号化する IAM ロールを引き受けます。必要な許可を持つ IAM ロールを登録した場合、呼び出し元のプリンシパルはキーにアクセスしてデータを復号化する許可の必要がなくなります。
**重要**  
カスタマーマネージドキーを使用して Data Catalog リソースを暗号化するときに限り、KMS オペレーションを IAM ロールに委任できます。KMS ロール委任の機能は、現時点では Data Catalog リソースの暗号化に AWS マネージドキーの使用をサポートしていません。
**警告**  
IAM ロールを有効にして KMS の操作を委任すると、以前に AWS マネージドキーで暗号化された Data Catalog リソースにアクセスできなくなります。

   1. お客様に代わって AWS Glue が引き受けられる IAM ロールを有効にし、データの暗号化および復号化できるようにするには、**[KMS 操作を IAM ロールに委任する]** オプションを選択します。

   1. 次に、IAM ロールを選択します。

      IAM ロールを作成するには、[AWS Glue の IAM ロールを作成する](https://docs.aws.amazon.com/glue/latest/dg/create-an-iam-role.html) を参照してください。

      Data Catalog にアクセスするために AWS Glue が引き受ける IAM ロールには、Data Catalog のメタデータを暗号化および復号化する許可が必要です。IAM ロールを作成し、次のインラインポリシーをアタッチできます。
      + 次のポリシーを追加し、Data Catalog を暗号化および復号化する AWS KMS 許可を含めてください。

------
#### [ JSON ]

****  

        ```
        {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
            {
              "Effect": "Allow",
              "Action": [
                "kms:Decrypt",
                "kms:Encrypt",
                "kms:GenerateDataKey"
              ],
              "Resource": "arn:aws:kms:us-east-1:111122223333:key/<key-id>"
            }
          ]
        }
        ```

------
      + 次に、AWS Glue サービスが IAM ロールを引き受けるには、ロールに次の信頼ポリシーを追加します。

------
#### [ JSON ]

****  

        ```
        {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
            {
              "Sid": "",
              "Effect": "Allow",
              "Principal": {
                "Service": "glue.amazonaws.com"
              },
              "Action": "sts:AssumeRole"
            }
          ]
        }
        ```

------
      + 次に、IAM ロールに `iam:PassRole` 許可を追加します。

------
#### [ JSON ]

****  

        ```
        {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
            {
              "Effect": "Allow",
              "Action": [
                "iam:PassRole"
              ],
              "Resource": [
                "arn:aws:iam::111122223333:role/<encryption-role-name>"
              ]
            }
          ]
        }
        ```

------

   暗号化を有効にするとき、AWS Glue が引き受ける IAM ロールを指定していない場合、Data Catalog にアクセスするプリンシパルには、次の API 操作を実行する許可が必要です。
   + `kms:Decrypt`
   + `kms:Encrypt`
   + `kms:GenerateDataKey`

------
#### [ AWS CLI ]

**SDK または AWS CLI を使用して暗号化を有効にするには**
+ `PutDataCatalogEncryptionSettings` API オペレーションを使用します。キーが指定されていない場合、AWS Glue はカスタマーアカウントに AWS マネージド暗号化キーを使用し、Data Catalog を暗号化します。

  ```
  aws glue put-data-catalog-encryption-settings \
    --data-catalog-encryption-settings '{
        "EncryptionAtRest": {
        "CatalogEncryptionMode": "SSE-KMS-WITH-SERVICE-ROLE",
        "SseAwsKmsKeyId": "arn:aws:kms:<region>:<account-id>:key/<key-id>",
        "CatalogEncryptionServiceRole":"arn:aws:iam::<account-id>:role/<encryption-role-name>"
      }
  
    }'
  ```

------

 暗号化を有効にすると、Data Catalog オブジェクトで作成するすべてのオブジェクトが暗号化されます。この設定をオフにすると、Data Catalog で作成するオブジェクトが暗号化されなくなります。必要な KMS 許可を使用して、Data Catalog の既存の暗号化オブジェクトに引き続きアクセスできます。


|  | 
| --- |
|   AWS KMS​ キーは、Data Catalog でそのキーを使用して暗号化されたすべてのオブジェクトの ​AWS KMS キーストアに、使用可能な状態で保持する必要があります。キーを削除すると、オブジェクトは復号化できなくなります。ある種のシナリオでは、このようにして、Data Catalog メタデータにアクセスできないようにする場合があります。   | 

## AWS Glue 用に KMS キーの監視
<a name="monitoring-keys"></a>

 Data Catalog リソースに KMS キーを使用すると、AWS CloudTrail または Amazon CloudWatch ログを使用して AWS Glue が AWS KMS に送信するリクエストを追跡できます。AWS CloudTrail は、KMS キーで暗号化されたデータにアクセスするために AWS Glue が呼び出す KMS 操作を監視および記録します。

 次の例は、`Decrypt` および `GenerateDataKey` オペレーションの AWS CloudTrail イベントです。

------
#### [ Decrypt ]

```
{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "AROAXPHTESTANDEXAMPLE:Sampleuser01",
        "arn": "arn:aws:sts::111122223333:assumed-role/Admin/Sampleuser01",
        "accountId": "111122223333",
        "accessKeyId": "AKIAIOSFODNN7EXAMPLE",
        "sessionContext": {
            "sessionIssuer": {
                "type": "Role",
                "principalId": "AROAXPHTESTANDEXAMPLE",
                "arn": "arn:aws:iam::111122223333:role/Admin",
                "accountId": "111122223333",
                "userName": "Admin"
            },
            "webIdFederationData": {},
            "attributes": {
                "creationDate": "2024-01-10T14:33:56Z",
                "mfaAuthenticated": "false"
            }
        },
        "invokedBy": "glue.amazonaws.com"
    },
    "eventTime": "2024-01-10T15:18:11Z",
    "eventSource": "kms.amazonaws.com",
    "eventName": "Decrypt",
    "awsRegion": "eu-west-2",
    "sourceIPAddress": "glue.amazonaws.com",
    "userAgent": "glue.amazonaws.com",
    "requestParameters": {
        "encryptionContext": {
            "glue_catalog_id": "111122223333"
        },
        "encryptionAlgorithm": "SYMMETRIC_DEFAULT"
    },
    "responseElements": null,
    "requestID": "43b019aa-34b8-4798-9b98-ee968b2d63df",
    "eventID": "d7614763-d3fe-4f84-a1e1-3ca4d2a5bbd5",
    "readOnly": true,
    "resources": [
        {
            "accountId": "111122223333",
            "type": "AWS::KMS::Key",
            "ARN": "arn:aws:kms:<region>:111122223333:key/<key-id>"
        }
    ],
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "111122223333",
    "eventCategory": "Management",
    "sessionCredentialFromConsole": "true"
}
```

------
#### [ GenerateDataKey ]

```
{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "AROAXPHTESTANDEXAMPLE:V_00_GLUE_KMS_GENERATE_DATA_KEY_111122223333",
        "arn": "arn:aws:sts::111122223333:assumed-role/Admin/V_00_GLUE_KMS_GENERATE_DATA_KEY_111122223333",
        "accountId": "111122223333",
        "accessKeyId": "AKIAIOSFODNN7EXAMPLE",
        "sessionContext": {
            "sessionIssuer": {
                "type": "Role",
                "principalId": "AROAXPHTESTANDEXAMPLE",
                "arn": "arn:aws:iam::111122223333:role/Admin",
                "accountId": "AKIAIOSFODNN7EXAMPLE",
                "userName": "Admin"
            },
            "webIdFederationData": {},
            "attributes": {
                "creationDate": "2024-01-05T21:15:47Z",
                "mfaAuthenticated": "false"
            }
        },
        "invokedBy": "glue.amazonaws.com"
    },
    "eventTime": "2024-01-05T21:15:47Z",
    "eventSource": "kms.amazonaws.com",
    "eventName": "GenerateDataKey",
    "awsRegion": "eu-west-2",
    "sourceIPAddress": "glue.amazonaws.com",
    "userAgent": "glue.amazonaws.com",
    "requestParameters": {
        "keyId": "arn:aws:kms:eu-west-2:AKIAIOSFODNN7EXAMPLE:key/AKIAIOSFODNN7EXAMPLE",
        "encryptionContext": {
            "glue_catalog_id": "111122223333"
        },
        "keySpec": "AES_256"
    },
    "responseElements": null,
    "requestID": "64d1783a-4b62-44ba-b0ab-388b50188070",
    "eventID": "1c73689b-2ef2-443b-aed7-8c126585ca5e",
    "readOnly": true,
    "resources": [
        {
            "accountId": "111122223333",
            "type": "AWS::KMS::Key",
            "ARN": "arn:aws:kms:eu-west-2:111122223333:key/AKIAIOSFODNN7EXAMPLE"
        }
    ],
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "111122223333",
    "eventCategory": "Management"
}
```

------

```
      
```