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

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

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

可以使用控制台或 CQL 语句指定新表和 Amazon Keyspaces 现有表的加密密钥。Amazon KMS key以下主题概述了如何为新表和现有表实现客户管理的密钥。

先决条件:使用 Amazon Keyspaces 创建客户托管密钥Amazon KMS并授予权限

在使用客户管理的密钥保护 Amazon Keyspaces 表之前,必须先在Amazon Key Management Service (Amazon KMS) 中创建密钥,然后授权 Amazon Keyspaces 使用该密钥。

步骤 1:使用创建客户托管密钥Amazon KMS

要创建用于保护 Amazon Keyspaces 表的客户管理密钥,您可以按照使用控制台或Amazon API 创建对称加密 KMS 密钥中的步骤进行操作。

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

在您选择客户托管密钥来保护 Amazon Keyspaces 表之前,针对该客户托管密钥的策略必须赋予 Amazon Keyspaces 代表您使用该密钥的权限。您可以全面控制客户托管密钥的策略和授权。您可以在密钥策略IAM 策略授权中提供这些权限。

Amazon Keyspaces 无需额外授权即可使用默认的Amazon 拥有的密钥来保护您Amazon账户中的 Amazon Keyspaces 表。

以下主题显示如何使用允许 Amazon Keyspaces 表使用客户托管密钥的 IAM 策略和授权配置所需的权限。

客户托管密钥密钥策略

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

Amazon Keyspaces 至少需要针对客户托管密钥拥有以下权限:

示例密钥策略

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

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

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

  • 向客户托管密钥管理员(可担任该db-team角色的用户)对客户托管密钥的只读访问权限,以及撤销授权的权限,包括 Amazon 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 还使用授权来设置客户托管密钥的权限。要查看账户中客户管理密钥的授权,请使用ListGrants操作。Amazon Keyspaces 无需授权或任何其他权限即可使用Amazon 拥有的密钥来保护您的表。

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

每个授权特定于一个表。如果账户中包含在同一个客户托管密钥下加密密钥的多个表,则每个表都有一种授权。授权受到 A mazon 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. 在导航窗格中,选择 Tables (表),然后选择 Create table (创建表)

  3. 表详细信息部分的创建页面上,选择一个键空间并为新表提供名称。

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

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

  6. 继续进入加密设置

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

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

    注意

    如果您选择的密钥不可访问或缺少所需的权限,请参阅Amazon Key Management Service开发者指南中的密钥访问疑难解答

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

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

要创建使用客户托管密钥进行静态加密的新表,可以使用以下示例中所示CREATE TABLE语句:确保将密钥 ARN 替换为 ARN,以获得授予 Amazon Keyspaces 权限的有效密钥。

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 拥有的密钥和客户托管密钥之间更改现有表的加密密钥。

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

  1. 登录并通过以下Amazon Web Services Management Console网址打开 Amazon Keyspaces 控制台:https://console.aws.amazon.com/keyspaces/home

  2. 在导航窗格中,选择

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

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

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

    注意

    如果您选择的密钥无效,请参阅Amazon Key Management Service开发者指南中的密钥访问疑难解答

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

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

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

要更改现有表的加密密钥,您可以使用ALTER TABLE语句指定用于静态加密的客户管理密钥。确保将密钥 ARN 替换为 ARN,以获得授予 Amazon Keyspaces 权限的有效密钥。

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 Logs Amazon CloudTrailAmazon Lo CloudWatch gs 的日志中。

Amazon Keyspaces 在请求时使用包含三个密钥-值对的加密上下文。Amazon KMS

"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请求。此外,Amazon Keyspaces 使用RetireGrant操作在您删除表时删除授权。

GenerateDataKey

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

记录 GenerateDataKey 操作的事件与以下示例事件类似。该用户是Amazon Keyspaces 服务账户。参数包括客户托管密钥的 Amazon Resource (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 将 Decry pt 请求发送到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 表,Amazon 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" }