保管データ暗号化: カスタマーマネージドキーを使用して Amazon Keyspaces のテーブルを暗号化する方法 - Amazon Keyspaces (Apache Cassandra 向け)

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

保管データ暗号化: カスタマーマネージドキーを使用して Amazon Keyspaces のテーブルを暗号化する方法

コンソールまたは CQL を使用すると、新しいテーブルに対して AWS KMS key を指定し、Amazon Keyspaces の既存のテーブルで暗号化キーを更新できます。次のトピックでは、新規および既存のテーブルにカスタマーマネージドキーを実装する方法について説明します。

前提条件: AWS KMS を使用してカスタマーマネージドキーを作成し、Amazon Keyspaces にアクセス許可を付与する

Amazon Keyspaces テーブルをカスタマーマネージドキーで保護できるようにするには、まず AWS Key Management Service (AWS KMS) でキーを作成し、次に Amazon Keyspaces に対してそのキーの使用を許可します。

ステップ 1: AWS KMS を使用してカスタマーマネージドキーを作成する

Amazon Keyspaces テーブルの保護に使用するカスタマーマネージドキーを作成するには、コンソールまたは AWS API を使用して「Creating symmetric encryption KMS keys (対称暗号化 KMS キーの作成)」 のステップに従います。

ステップ 2: カスタマーマネージドキーの使用を認可する

カスタマーマネージドキーを選択して Amazon Keyspaces テーブルを保護できるようにするには、あらかじめ、そのカスタマーマネージドキーに関するポリシーにより、そのキーの使用許可を Amazon Keyspaces に付与する必要があります。カスタマーマネージドキーに関するポリシーと権限については、ユーザーが完全に制御します。これらのアクセス権限は、キーポリシーIAM ポリシー、または 許可で指定できます。

Amazon Keyspaces では、デフォルトの AWS 所有のキー を使用して AWS アカウント内で Amazon Keyspaces テーブルを保護する場合、追加の認可は必要ありません。

以下のトピックでは、Amazon Keyspaces テーブルでカスタマーマネージドキーを使用できるようにする IAM ポリシーと権限を使用して、必要な許可を設定する方法を示します。

カスタマーマネージドキーのキーポリシー

カスタマーマネージドキーを選択して Amazon Keyspaces テーブルを保護する場合、Amazon Keyspaces には、選択を行うプリンシパルの代わって KMS キーを使用する許可が付与されます。そのプリンシパル (ユーザーまたはロール) は、Amazon Keyspaces で必要となるカスタマーマネージドキーに対する許可を取得しておく必要があります。

Amazon Keyspaces には、少なくとも、カスタマーマネージドキーに対する次の許可が必要です。

キーポリシーの例

例えば、次のキーポリシーの例では、必要なアクセス許可のみを提供します。このポリシーには、以下の影響があります。

  • Amazon Keyspaces に対して、暗号化オペレーションでのそのカスタマーマネージドキーの使用と、権限の作成を許可します。ただしこれは、Amazon Keyspaces の使用許可を持つアカウント内のプリンシパルに代わって Amazon Keyspaces により処理が行われている場合に限られます。ポリシーステートメントで指定されたプリンシパルが Amazon Keyspaces の使用許可を持っていない場合、Amazon Keyspaces サービスからのコールであっても、コールは失敗します。

  • kms:ViaService 条件キーは、ポリシーステートメントにリストされているプリンシパルの代わりに Amazon Keyspaces からリクエストが送信された場合にのみアクセス許可を受け入れます。これらのプリンシパルは、これらのオペレーションを直接呼び出すことはできません。kms:ViaService の値である cassandra.*.amazonaws.com は、リージョンの位置にアスタリスク (*) が付いていることに注意してください。Amazon Keyspaces には、特定の AWS リージョン から独立した許可が必要です。

  • カスタマーマネージドキー管理者 (db-team ロールを引き受けることができるユーザー) に、カスタマーマネージドキーへの読み取り専用アクセス権と、権限 (テーブルを保護するために Amazon Keyspaces で必要となる権限を含む) を取り消す許可を与えます。

  • Amazon Keyspaces に、カスタマーマネージドキーへの読み取り専用アクセス権を付与します。この場合、Amazon Keyspaces によりこれらのオペレーションが直接呼び出されます。アカウントプリンシパルに代わって処理する必要はありません。

サンプルキーポリシーを使用する前に、サンプルプリンシパルを AWS アカウント の実際のプリンシパルに置き換えます。

{ "Id": "key-policy-cassandra", "Version":"2012-10-17", "Statement": [ { "Sid" : "Allow access through Amazon Keyspaces for all principals in the account that are authorized to use Amazon Keyspaces", "Effect": "Allow", "Principal": {"AWS": "arn:aws:iam::111122223333:user/db-lead"}, "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey", "kms:CreateGrant" ], "Resource": "*", "Condition": { "StringLike": { "kms:ViaService" : "cassandra.*.amazonaws.com" } } }, { "Sid": "Allow administrators to view the customer managed key and revoke grants", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/db-team" }, "Action": [ "kms:Describe*", "kms:Get*", "kms:List*", "kms:RevokeGrant" ], "Resource": "*" } ] }

Amazon Keyspaces の認可への権限の使用

Amazon Keyspaces は、キーポリシーに加え、権限を使ってカスタマーマネージドキーに対しアクセス許可を設定できます。アカウントにあるカスタマーマネージドキーへの権限を表示するには、ListGrants オペレーションを使用します。Amazon Keyspaces では、AWS 所有のキー を使用してテーブルを保護する場合に、権限や追加のアクセス許可は必要ありません。

Amazon Keyspaces は、バックグラウンドシステムメンテナンスと継続的なデータ保護タスクを実行するときに、権限のアクセス許可を使用します。また、テーブルキーの生成にグラントを使用します。

各グラントは、テーブルに固有です。アカウントに、同じカスタマーマネージドキーを使って暗号化された複数のテーブルがある場合、テーブルごとに、各タイプの権限があります。権限は、テーブル名と AWS アカウント ID が含まれている Amazon Keyspaces 暗号化コンテキストによる制約を受けます。この権限には、権限が不要になった場合に権限の使用停止を行うための許可が含まれています。

権限を作成するには、暗号化されたテーブルを作成したユーザーに代わって CreateGrant を呼び出すアクセス許可が Amazon Keyspaces に必要です。

キーポリシーは、アカウントがカスタマーマネージドキーの権限を取り消すことも許可できます。ただし、アクティブな暗号化テーブルで権限トを取り消すと、Amazon Keyspaces はテーブルを保護して維持することはできません。

ステップ 3: 新規テーブルのカスタマーマネージドキーを指定する

以下の手順に従って、Amazon Keyspaces コンソールまたは CQL を使用して新しいテーブルでカスタマーマネージドキーを指定します。

カスタマーマネージドキーを使用して暗号化されたテーブルを作成する (コンソール)

  1. AWS Management Console にサインインし、https://console.aws.amazon.com/keyspaces/home で Amazon Keyspaces コンソールを開きます。

  2. ナビゲーションペインで [Tables (テーブル)] を選択して、[Create table (テーブルの作成)] を選択します。

  3. [Table details (テーブルの詳細)] セクションの [Create table (テーブルの作成)] ページで、キー空間を選択し、新しいテーブルに名前を付けます。

  4. [Schema (スキーマ)] セクションで、テーブルのスキーマを作成します。

  5. [Table settings (テーブルの設定)] セクションで、[Customize settings (設定のカスタマイズ)] を選択します。

  6. [Encryption settings (暗号化設定)] に進みます。

    このステップでは、テーブルの暗号化設定を選択します。

    [Encryption at rest (保管データ暗号化)] セクションの [Choose an AWS KMS key ( を選択)] で、オプション [Choose a different KMS key (advanced) (異なる KMS キーの選択 (高度))] を選択し、検索フィールドで、AWS KMS key を選択するか「Amazon リソースネーム (ARN)」と入力します。

    注記

    選択したキーにアクセスできない場合、または必要な許可を取得していない場合は、『AWS Key Management Service デベロッパーガイド』の「Troubleshooting key access(キーアクセスのトラブルシューティング)」 を参照してください。

  7. [Create (作成)] を選択して暗号化テーブルを作成します。

保管データ暗号化 (CQL) にカスタマーマネージドキーが使用される新しいテーブルを作成する

保管データ暗号化にカスタマーマネージドキーが使用される新しいテーブルを作成するには、次の例に示すように、CREATE TABLE ステートメントを使用します。キー ARN を、Amazon Keyspaces に付与されたアクセス許可がある有効キーの ARN に置き換えてください。

CREATE TABLE my_keyspace.my_table(id bigint, name text, place text STATIC, PRIMARY KEY(id, name)) WITH CUSTOM_PROPERTIES = { 'encryption_specification':{ 'encryption_type': 'CUSTOMER_MANAGED_KMS_KEY', 'kms_key_identifier':'arn:aws:kms:eu-west-1:5555555555555:key/11111111-1111-111-1111-111111111111' } };

Invalid Request Exception を受け取った場合、カスタマーマネージドキーが有効であり Amazon Keyspaces に必要な許可が付与されていることを確認する必要があります。キーが正しく設定されているか確認するには、『AWS Key Management Service デベロッパーガイド』の「Troubleshooting key access(キーアクセスのトラブルシューティング)」 を参照してください。

ステップ 4: 既存のテーブルの暗号化キーを更新する

Amazon Keyspaces コンソールまたは CQL を使用して、AWS 所有のキー とカスタマーマネージド KMS キーの間で既存のテーブルの暗号化キーをいつでも変更することができます。

新しいカスタマーマネージドキーで既存のテーブルを更新する (コンソール)

  1. AWS Management Console にサインインし、https://console.aws.amazon.com/keyspaces/home で Amazon Keyspaces コンソールを開きます。

  2. ナビゲーションペインで、[Tables (テーブル)] を選択します。

  3. 更新するテーブルを選択し、次に [Additional settings (追加設定)] タブを選択します。

  4. [Encryption at rest (保管データ暗号化)] セクションで、[Manage Encryption (暗号化の管理)] を選択してテーブルの暗号化設定を編集します。

    [Choose an AWS KMS key ( を選択)] で、オプション [Choose a different KMS key (advanced) (異なる KMS キーの選択 (高度))] を選択し、検索フィールドで、AWS KMS key を選択するか「Amazon Resource Name (ARN)」(Amazon リソースネーム (ARN)) を入力します。

    注記

    選択したキーが有効でない場合は、「AWS Key Management Service デベロッパーガイド」の「Troubleshooting key access(キーアクセスのトラブルシューティング) 」を参照してください。

    また、カスタマーマネージドキーで暗号化されているテーブルに対しては、AWS 所有のキー を選択できます。

  5. [Save changes (変更を保存)] を選択して、テーブルに加えた変更内容を保存します。

既存のテーブルに使用される暗号化キーを更新する

既存のテーブルの暗号化キーを変更するには、ALTER TABLE ステートメントを使用して、保管データ暗号化に使用するカスタマーマネージドキーを指定します。キー ARN を、Amazon Keyspaces に付与されたアクセス許可がある有効キーの ARN に置き換えてください。

ALTER TABLE my_keyspace.my_table WITH CUSTOM_PROPERTIES = { 'encryption_specification':{ 'encryption_type': 'CUSTOMER_MANAGED_KMS_KEY', 'kms_key_identifier':'arn:aws:kms:eu-west-1:5555555555555:key/11111111-1111-111-1111-111111111111' } };

Invalid Request Exception を受け取った場合、カスタマーマネージドキーが有効であり Amazon Keyspaces に必要な許可が付与されていることを確認する必要があります。キーが正しく設定されているか確認するには、『AWS Key Management Service デベロッパーガイド』の「Troubleshooting key access(キーアクセスのトラブルシューティング)」を参照してください。

AWS 所有のキー を使用して暗号化キーをデフォルトの保管データ暗号化オプションに戻すには、以下の例に示すように、ALTER TABLE ステートメントを使用します。

ALTER TABLE my_keyspace.my_table WITH CUSTOM_PROPERTIES = { 'encryption_specification':{ 'encryption_type' : 'AWS_OWNED_KMS_KEY' } };

ステップ 5: ログで Amazon Keyspaces 暗号化コンテキストを使用する

暗号化コンテキスト は、一連のキー値のペアおよび任意非シークレットデータを含みます。データを暗号化するリクエストに暗号化コンテキストを組み込むと、AWS KMS は暗号化コンテキストを暗号化されたデータに暗号化してバインドします。データを復号するには、同じ暗号化コンテキストに渡す必要があります。

Amazon Keyspaces は、すべての AWS KMS 暗号化オペレーションで同じ暗号化コンテキストを使用します。カスタマーマネージドキーを使用して Amazon Keyspaces テーブルを保護する場合は、暗号化コンテキストを使用して、監査の記録やログ内でカスタマーマネージドキーの使用を特定することができます。これは、AWS CloudTrail のログや Amazon CloudWatch Logs などのログにもプレーンテキストで表示されます。

Amazon Keyspaces は AWS KMS へのリクエストで 3 つのキーバリューペアがある暗号化コンテキストを使用します。

"encryptionContextSubset": { "aws:cassandra:keyspaceName": "my_keyspace", "aws:cassandra:tableName": "mytable" "aws:cassandra:subscriberId": "111122223333" }
  • Keyspace (キー空間) — 1 つ目のキーバリューペアは、Amazon Keyspaces により暗号化されるテーブルが含まれているキー空間を識別します。キーは、aws:cassandra:keyspaceName です。この値は、このキー空間の名前です。

    "aws:cassandra:keyspaceName": "<keyspace-name>"

    例:

    "aws:cassandra:keyspaceName": "my_keyspace"
  • Table (テーブル) - 2 つ目のキーバリューペアは、Amazon Keyspaces により暗号化されるテーブルを識別します。キーは、aws:cassandra:tableName です。この値は、テーブルの名前です。

    "aws:cassandra:tableName": "<table-name>"

    例:

    "aws:cassandra:tableName": "my_table"
  • アカウント - 3 番目のキーバリューペアは、AWS アカウント を識別します。キーは、aws:cassandra:subscriberId です。値は、アカウント ID です。

    "aws:cassandra:subscriberId": "<account-id>"

    例:

    "aws:cassandra:subscriberId": "111122223333"

ステップ 6: AWS CloudTrail を使用してモニタリングを設定する

カスタマーマネージドキーを使用して Amazon Keyspaces のテーブルを保護する場合、AWS CloudTrail ログを使用して、Amazon Keyspaces がユーザーに代わって AWS KMS に送信したリクエストを追跡することができます。

このセクションでは、GenerateDataKeyDescribeKeyDecrypt、および CreateGrant の各リクエストについて説明します。さらに、Amazon Keyspaces では、テーブルを削除するときに RetireGrant オペレーションを使用して権限を削除します。

GenerateDataKey

Amazon Keyspaces では、保管中のデータを暗号化するために一意のテーブルキーが作成します。また、GenerateDataKey リクエストを、テーブルの KMS キーを指定する AWS KMS に送信します。

GenerateDataKey 演算を記録するイベントは、次のようなサンプルイベントになります。ユーザーは Amazon Keyspaces サービスアカウントです。このパラメータには、カスタマーマネージドキーの Amazon リソースネーム (ARN)、256 ビットキーを必要とするキー指定子、および、キー空間とテーブルと AWS アカウント を識別する暗号化コンテキストが含まれます。

{ "eventVersion": "1.08", "userIdentity": { "type": "AWSService", "invokedBy": "AWS Internal" }, "eventTime": "2021-04-16T04:56:05Z", "eventSource": "kms.amazonaws.com", "eventName": "GenerateDataKey", "awsRegion": "us-east-1", "sourceIPAddress": "AWS Internal", "userAgent": "AWS Internal", "requestParameters": { "keySpec": "AES_256", "encryptionContext": { "aws:cassandra:keyspaceName": "my_keyspace", "aws:cassandra:tableName": "my_table", "aws:cassandra:subscriberId": "123SAMPLE012" }, "keyId": "arn:aws:kms:eu-west-1:5555555555555:key/11111111-1111-111-1111-111111111111" }, "responseElements": null, "requestID": "5e8e9cb5-9194-4334-aacc-9dd7d50fe246", "eventID": "49fccab9-2448-4b97-a89d-7d5c39318d6f", "readOnly": true, "resources": [ { "accountId": "123SAMPLE012", "type": "AWS::KMS::Key", "ARN": "arn:aws:kms:eu-west-1:5555555555555:key/11111111-1111-111-1111-111111111111" } ], "eventType": "AwsApiCall", "managementEvent": true, "eventCategory": "Management", "recipientAccountId": "123SAMPLE012", "sharedEventID": "84fbaaf0-9641-4e32-9147-57d2cb08792e" }
DescribeKey

Amazon Keyspaces では、DescribeKey オペレーションを使用して、選択した KMS キーがアカウントとリージョンに存在するかどうかが判断されます。

DescribeKey 演算を記録するイベントは、次のようなサンプルイベントになります。ユーザーは Amazon Keyspaces サービスアカウントです。このパラメータには、カスタマーマネージドキーの ARN と、256 ビットキーを要求するキー識別子が含まれます。

{ "eventVersion": "1.08", "userIdentity": { "type": "IAMUser", "principalId": "AIDAZ3FNIIVIZZ6H7CFQG", "arn": "arn:aws:iam::123SAMPLE012:user/admin", "accountId": "123SAMPLE012", "accessKeyId": "AKIAIOSFODNN7EXAMPLE", "userName": "admin", "sessionContext": { "sessionIssuer": {}, "webIdFederationData": {}, "attributes": { "mfaAuthenticated": "false", "creationDate": "2021-04-16T04:55:42Z" } }, "invokedBy": "AWS Internal" }, "eventTime": "2021-04-16T04:55:58Z", "eventSource": "kms.amazonaws.com", "eventName": "DescribeKey", "awsRegion": "us-east-1", "sourceIPAddress": "AWS Internal", "userAgent": "AWS Internal", "requestParameters": { "keyId": "arn:aws:kms:eu-west-1:5555555555555:key/11111111-1111-111-1111-111111111111" }, "responseElements": null, "requestID": "c25a8105-050b-4f52-8358-6e872fb03a6c", "eventID": "0d96420e-707e-41b9-9118-56585a669658", "readOnly": true, "resources": [ { "accountId": "123SAMPLE012", "type": "AWS::KMS::Key", "ARN": "arn:aws:kms:eu-west-1:5555555555555:key/11111111-1111-111-1111-111111111111" } ], "eventType": "AwsApiCall", "managementEvent": true, "eventCategory": "Management", "recipientAccountId": "123SAMPLE012" }
Decrypt

Amazon Keyspaces のテーブルにアクセスすると、階層内でそのテーブルキーの下のキーの復号化を可能にするために、Amazon Keyspaces によりテーブルキーが復号化される必要があります。次に、テーブル内のデータを復号化します。テーブルキーを復号化するために、そのテーブルの KMS キーを指定する AWS KMS に対して Amazon Keyspaces から Decrypt リクエストが送信されます。

Decrypt 演算を記録するイベントは、次のようなサンプルイベントになります。ユーザーは、テーブルにアクセスしている AWS アカウント のプリンシパルです。パラメータには、暗号化されたテーブルキー (暗号化テキストの blob として)、およびテーブルと AWS アカウント を識別する暗号化コンテキストが含まれます。AWS KMS では、暗号化テキストからカスタマーマネージドキーの ID が取得されます。

{ "eventVersion": "1.08", "userIdentity": { "type": "AWSService", "invokedBy": "AWS Internal" }, "eventTime": "2021-04-16T05:29:44Z", "eventSource": "kms.amazonaws.com", "eventName": "Decrypt", "awsRegion": "us-east-1", "sourceIPAddress": "AWS Internal", "userAgent": "AWS Internal", "requestParameters": { "encryptionContext": { "aws:cassandra:keyspaceName": "my_keyspace", "aws:cassandra:tableName": "my_table", "aws:cassandra:subscriberId": "123SAMPLE012" }, "encryptionAlgorithm": "SYMMETRIC_DEFAULT" }, "responseElements": null, "requestID": "50e80373-83c9-4034-8226-5439e1c9b259", "eventID": "8db9788f-04a5-4ae2-90c9-15c79c411b6b", "readOnly": true, "resources": [ { "accountId": "123SAMPLE012", "type": "AWS::KMS::Key", "ARN": "arn:aws:kms:eu-west-1:5555555555555:key/11111111-1111-111-1111-111111111111" } ], "eventType": "AwsApiCall", "managementEvent": true, "eventCategory": "Management", "recipientAccountId": "123SAMPLE012", "sharedEventID": "7ed99e2d-910a-4708-a4e3-0180d8dbb68e" }
CreateGrant

カスタマーマネージドキーを使用して Amazon Keyspaces テーブルを保護する場合、Amazon Keyspaces では、権限を使用して、サービスによるデータの継続的保護とメンテナンスおよび耐久タスクの実行を許可します。これらの権限は、AWS 所有のキー では不要です。

Amazon Keyspaces により作成される権限はテーブルごとに固有となります。CreateGrant リクエストのプリンシパルは、テーブルを作成したユーザーです。

CreateGrant 演算を記録するイベントは、次のようなサンプルイベントになります。このパラメータには、そのテーブルのカスタマーマネージドキーの ARN、被付与 (グランティー) プリンシパルと使用停止プリンシパル (Amazon Keyspaces サービス)、およびこの権限の対象となるオペレーションが含まれます。また、指定された暗号化コンテキストを使用するすべての暗号化オペレーションを必要とする制約も含まれています。

{ "eventVersion": "1.08", "userIdentity": { "type": "IAMUser", "principalId": "AIDAZ3FNIIVIZZ6H7CFQG", "arn": "arn:aws:iam::arn:aws:kms:eu-west-1:5555555555555:key/11111111-1111-111-1111-111111111111:user/admin", "accountId": "arn:aws:kms:eu-west-1:5555555555555:key/11111111-1111-111-1111-111111111111", "accessKeyId": "AKIAI44QH8DHBEXAMPLE", "userName": "admin", "sessionContext": { "sessionIssuer": {}, "webIdFederationData": {}, "attributes": { "mfaAuthenticated": "false", "creationDate": "2021-04-16T04:55:42Z" } }, "invokedBy": "AWS Internal" }, "eventTime": "2021-04-16T05:11:10Z", "eventSource": "kms.amazonaws.com", "eventName": "CreateGrant", "awsRegion": "us-east-1", "sourceIPAddress": "AWS Internal", "userAgent": "AWS Internal", "requestParameters": { "keyId": "a7d328af-215e-4661-9a69-88c858909f20", "operations": [ "DescribeKey", "GenerateDataKey", "Decrypt", "Encrypt", "ReEncryptFrom", "ReEncryptTo", "RetireGrant" ], "constraints": { "encryptionContextSubset": { "aws:cassandra:keyspaceName": "my_keyspace", "aws:cassandra:tableName": "my_table", "aws:cassandra:subscriberId": "123SAMPLE012" } }, "retiringPrincipal": "cassandratest.us-east-1.amazonaws.com", "granteePrincipal": "cassandratest.us-east-1.amazonaws.com" }, "responseElements": { "grantId": "18e4235f1b07f289762a31a1886cb5efd225f069280d4f76cd83b9b9b5501013" }, "requestID": "b379a767-1f9b-48c3-b731-fb23e865e7f7", "eventID": "29ee1fd4-28f2-416f-a419-551910d20291", "readOnly": false, "resources": [ { "accountId": "123SAMPLE012", "type": "AWS::KMS::Key", "ARN": "arn:aws:kms:eu-west-1:5555555555555:key/11111111-1111-111-1111-111111111111" } ], "eventType": "AwsApiCall", "managementEvent": true, "eventCategory": "Management", "recipientAccountId": "123SAMPLE012" }