静态加密:如何使用客户托管密钥加密 Amazon Keyspaces 中的表 - Amazon Keyspaces(针对 Apache Cassandra)
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

静态加密:如何使用客户托管密钥加密 Amazon Keyspaces 中的表

您可以使用Amazon Web Services Management Console或 CQL 语句来指定Amazon KMS key,并更新 Amazon Keyspaces 中现有表的加密密钥。以下主题概述了如何为新表和现有表实施客户托管密钥。

先决条件:使用创建客户管理密钥Amazon KMS并向亚马逊 Keyspaces 授予权限

在保护 Amazon Keyspaces 表之前,您可以使用客户托管密钥,首先必须在中创建密钥Amazon Key Management Service(Amazon KMS),然后授权亚马逊 Keyspaces 使用该密钥。

第 1 步:使用创建客户管理密钥Amazon KMS

要创建用于保护 Amazon Keyspaces 表的客户托管密钥,您可以按照创建对称 KMS 密钥使用控制台或AmazonAPI。

第 2 步:授权使用您的客户管理密钥

在您可以选择客户托管密钥保护 Amazon Keyspaces 表,则该客户托管密钥的策略必须向 Amazon Keyspaces 授予代表您使用该密钥的权限。您可以全面控制客户托管密钥的策略和授权。您可以在密钥策略,一个IAM 策略,或授予.

Amazon Keyspaces 无需额外授权即可使用默认 Amazon 拥有的密钥 来保护您的Amazonaccount.

以下主题介绍如何使用允许 Amazon Keyspace 表使用客户管理密钥的 IAM 策略和授权来配置所需的权限。

客户管理密钥的密钥策略

当您选择客户托管密钥保护 Amazon Keyspaces 表,Amazon Keyspaces 将获得代表做出选择的委托人使用客户托管密钥的权限。该委托人(用户或角色)必须具有 Amazon Keyspaces 所需的客户托管密钥的权限。

Amazon Keyspaces 至少需要对客户托管密钥具备以下权限:

示例密钥策略

例如,以下示例密钥策略仅提供所需的权限。该策略具有以下效果:

  • 允许 Amazon Keyspaces 在加密操作中使用客户托管密钥并创建授权 — 但仅当它代表账户中具备使用 Amazon Keyspaces 权限的委托人行事时才可如此。如果策略语句中指定的委托人无权使用 Amazon Keyspaces,调用将失败,即使调用来自 Amazon Keyspaces 服务也是如此。

  • 这些区域有:kms:ViaService条件键仅当代表策略语句中所列委托人发出请求时,才允许权限。这些委托人不能直接调用这些操作。请注意,kms:ViaService值、Valuecassandra.*.amazonaws.com,在区域位置有星号 (*)。Amazon Keyspaces 需要权限独立于任何特定 Amazon Web Services 区域 .

  • 授予客户管理的密钥管理员(可以承担db-team角色)对客户托管密钥的只读访问权限,以及撤销授权的权限,包括授予亚马逊 Keyspaces 所需来保护表。

  • 向 Amazon Keyspaces 提供对客户托管密钥的只读访问权限。在此情况下,Amazon Keyspaces 可以直接调用这些操作。它不必代表账户委托人行事。

在使用示例密钥策略之前,请将示例委托人替换为 Amazon Web Services 账户 .

{ "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 还使用授权来对客户托管密钥设置权限。要查看有关账户中客户托管密钥的授权,请使用ListGrantsoperation. Amazon Keyspaces 不需要授予或任何其他权限即可使用 Amazon 拥有的密钥 保护您的表。

Amazon Keyspaces 在执行后台系统维护和连续数据保护任务时使用授予权限。它还使用授权来生成表密钥。

每个授权特定于一个表。如果该账户包含在同一客户托管密钥下加密的多个表,则每个表都有一种授权。该授权受Amazon Keyspaces 加密上下文,其中包括表名和 Amazon Web Services 账户 ID。该授权包括停用授予如果不再需要它。

要创建授权,Amazon Keyspaces 必须拥有调用的权限。CreateGrant代表创建了加密表的用户。

此密钥策略还可以允许账户撤销授予在客户托管密钥上。但是,如果您对某个活动加密表撤销授权,Amazon Keyspaces 将无法保护和维护该表。

第 3 步:指定新表的客户托管密钥

请按照以下步骤使用 Amazon Keyspaces 控制台或 CQL 在新表上指定客户托管密钥。

使用客户管理密钥创建加密表(控制台)

  1. 登录到Amazon Web Services Management Console,然后打开 Amazon Keyspaces 控制台,在https://console.aws.amazon.com/keyspaces/home.

  2. 在导航窗格中,选择,然后选择创建表

  3. 在存储库的创建表页面中的表详细信息部分中,选择一个密钥空间并提供新表的名称。

  4. 架构部分中,为您的表创建架构。

  5. 表设置部分,选择。自定义设置.

  6. 继续加密设置.

    在此步骤中,您将选择表的加密设置。

    静态加密部分下的选择Amazon KMS key中,选择选项。选择其他 KMS 密钥(高级),然后在搜索字段中选择Amazon KMS key或输入 Amazon 资源名称 (ARN)。

    注意

    如果您选择的密钥不可访问或缺少所需权限,请参阅密钥访问故障排除中的Amazon Key Management Service开发人员指南 的第一个版本。

  7. 选择 Create (创建) 以创建加密表。

使用客户托管密钥进行静态加密 (CQL) 创建新表

若要创建使用客户托管密钥进行静态加密的新表,可以使用CREATE TABLE语句,如以下示例所示。请确保使用授予 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 具有所需的权限。要确认密钥配置正确,请参阅密钥访问故障排除中的Amazon Key Management Service开发人员指南 的第一个版本。

第 4 步:更新现有表的加密密钥

您还可以使用 Amazon Keyspaces 控制台或 CQL 在 Amazon 拥有的密钥 和客户管理的 KMS 密钥。

使用新的客户管理密钥(控制台)更新现有表

  1. 登录到Amazon Web Services Management Console,然后打开 Amazon Keyspaces 控制台,在https://console.aws.amazon.com/keyspaces/home.

  2. 在导航窗格中,选择 Tables (表)

  3. 选择要更新的表,然后选择其他设置选项卡。

  4. 静态加密部分,选择。管理加密以编辑表的加密设置。

    位置在选择Amazon KMS key中,选择选项。选择其他 KMS 密钥(高级),然后在搜索字段中选择Amazon KMS key或输入 Amazon 资源名称 (ARN)。

    注意

    如果您选择的密钥无效,请参阅密钥访问故障排除中的Amazon Key Management Service开发人员指南 的第一个版本。

    或者,您也可以选择 Amazon 拥有的密钥 对于使用客户托管密钥加密的表。

  5. 选择保存更改。以保存对表所做的更改。

更新用于现有表的加密密钥

若要更改现有表的加密密钥,请使用ALTER TABLE语句指定用于静态加密的客户管理密钥。请确保使用授予 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 具有所需的权限。要确认密钥配置正确,请参阅密钥访问故障排除中的Amazon Key Management Service开发人员指南 的第一个版本。

要将加密密钥更改回默认静态加密选项,请使用 Amazon 拥有的密钥 ,您可以使用ALTER TABLE语句,如以下示例所示。

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

第 5 步:在日志中使用 Amazon Keyspaces 加密上下文

加密上下文 是一组包含任意非机密数据的键值对。在请求中包含加密上下文以加密数据时,Amazon KMS 以加密方式将加密上下文绑定到加密的数据。要解密数据,您必须传入相同的加密上下文。

Amazon Keyspaces 使用相同的加密上下文在所有Amazon KMS加密操作。如果您使用的是客户托管密钥保护 Amazon Keyspaces 表,则可使用加密上下文在审核记录和日志中标识客户托管密钥的使用。它还以明文形式显示在日志中,例如在Amazon CloudTrailAmazon CloudWatch Logs.

在其请求Amazon KMS,Amazon Keyspaces 将使用具有三个键值对的加密上下文。

"encryptionContextSubset": { "aws:cassandra:keyspaceName": "my_keyspace", "aws:cassandra:tableName": "mytable" "aws:cassandra:subscriberId": "111122223333" }
  • 密钥空间— 第一个密钥-值对用于标识包含 Amazon Keyspaces 正在加密的表的密钥空间。密钥是 aws:cassandra:keyspaceName。该值是密钥空间的名称。

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

    例如:

    "aws:cassandra:keyspaceName": "my_keyspace"
  • — 第二个密钥-值对用于标识 Amazon Keyspaces 正在加密的表。密钥是 aws:cassandra:tableName。值为表的名称。

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

    例如:

    "aws:cassandra:tableName": "my_table"
  • 账户— 第三个键-值对标识 Amazon Web Services 账户 . 密钥是 aws:cassandra:subscriberId。该值为账户 ID。

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

    例如:

    "aws:cassandra:subscriberId": "111122223333"

第 6 步:使用配置监控Amazon CloudTrail

如果您使用的是客户托管密钥来保护您的 Amazon Keyspaces 表,您可以使用Amazon CloudTrail日志来跟踪 Amazon Keyspaces 发送到Amazon KMS代表您。

这些区域有:GenerateDataKeyDescribeKeyDecrypt, 和CreateGrant请求将在本部分中讨论。此外,亚马逊 Keyspaces 使用RetireGrant操作来在您删除表时删除授权。

GenerateDataKey

Amazon Keyspaces 会创建一个唯一的表密钥来加密静态数据。它发送GenerateDataKey请求发送到Amazon KMS,它为表指定 KMS 键。

记录 GenerateDataKey 操作的事件与以下示例事件类似。该用户是 Amazon Keyspaces 服务账户。参数包括客户托管密钥的 Amazon 资源名称 (ARN)、需要 256 位密钥的密钥说明符以及加密上下文,用于标识密钥空间、表和 Amazon Web Services 账户 .

{ "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 需要解密表密钥,以便它可以解密层次结构中位于其下方的密钥。然后,解密表中的数据。要解密表密钥,Amazon Keyspaces 将发送一个Decrypt请求发送到Amazon KMS,它为表指定 KMS 键。

记录 Decrypt 操作的事件与以下示例事件类似。用户是您的 Amazon Web Services 账户 谁正在访问表。参数包括加密表密钥(作为密文 blob)和加密上下文,用于标识表和 Amazon Web Services 账户 .Amazon 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 表,亚马逊 Keyspaces 会使用授予以允许该服务执行连续数据保护与维护和持久性任务。这些授权不是 Amazon 拥有的密钥 .

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" }