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

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

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

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

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

必须先在 Amazon Key Management Service (Amazon KMS) 中创建客户自主管理型密钥并授权 Amazon Keyspaces 使用该密钥,然后才能使用该密钥保护 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 Keyspaces 在加密操作中使用客户自主管理型密钥并创建授权,但仅当它代表账户中拥有 Amazon Keyspaces 使用权限的主体行事时才可如此。如果策略语句中指定的主体无权使用 Amazon Keyspaces,调用将失败,即使调用来自 Amazon Keyspaces 服务也是如此。

  • 仅当 Amazon Keyspaces 代表策略语句中所列主体发出请求时,kms:ViaService 条件键才允许权限。这些委托人不能直接调用这些操作。请注意,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 在执行后台系统维护和持续数据保护任务时使用授予权限。它还使用授权来生成表密钥。

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

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

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

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

  6. 继续进入加密设置

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

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

    注意

    如果您选择的密钥不可访问或缺少所需的权限,请参阅《Amazon Key Management Service 开发人员指南》中的密钥访问问题排查

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

创建使用客户自主管理型密钥进行静态加密 (CQL) 的新表

要创建使用客户自主管理型密钥进行静态加密 (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 拥有的密钥和客户自主管理型 KMS 密钥之间更改现有表的加密密钥。

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

  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 开发人员指南》中的密钥访问问题排查

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

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 的请求。

本节将讨论 GenerateDataKeyDescribeKeyDecryptCreateGrant 请求。此外,Amazon Keyspaces 还使用 RetireGrant 操作在您删除表时删除授权。

GenerateDataKey

Amazon Keyspaces 会创建一个唯一表密钥来加密静态数据。它将 GenerateDataKey 请求发送到指定表 KMS 密钥的 Amazon 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 会向 Amazon KMS 发送一个 Decrypt 请求,该请求将指定表的 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" }