本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
静态加密:如何使用客户管理的密钥加密 Amazon Keyspaces 中的表
您可以使用控制台或 CQL 语句来指定Amazon KMS key用于新表并更新 Amazon Keyspaces 中现有表的加密密钥。以下主题概述了如何为新表和现有表实施客户托管密钥。
主题
先决条件:使用创建客户托管密钥Amazon KMS并向 Amazon Keyspaces 授予权限
在您可以使用保护亚马逊 Keyspaces 表之前客户托管密钥,首先必须在中创建密钥Amazon Key Management Service(Amazon KMS) 然后授权亚马逊密 Keyspaces 使用该密钥。
第 1 步:使用创建客户托管密钥Amazon KMS
要创建用于保护 Amazon Keyspace 表的客户托管密钥,您可以按照中的步骤操作创建对称加密 KMS 密钥使用控制台或AmazonAPI。
第 2 步:授权使用您的客户管理密钥
在你可以选择客户托管密钥要保护 Amazon Keyspaces 表,该客户托管密钥的策略必须赋予 Amazon Keyspaces 代表您使用该 Keyspace 的权限。您可以完全控制客户托管密钥的策略和授权。您可以在密钥策略、IAM 策略或授权中提供这些权限。
亚马逊 Keyspaces 不需要额外的授权即可使用默认值Amazon 拥有的密钥保护您的亚马逊 Keyspaces 表Amazonaccount.
以下主题展示了如何使用允许 Amazon Keyspace 表使用客户托管密钥的 IAM 策略和授权配置所需的权限。
客户托管密钥的主要策略
当你选择客户托管密钥为保护 Amazon Keyspaces 表,Amazon Keyspaces 将获得代表做出选择的委托人使用客户托管密钥的权限。该委托人(用户或角色)必须具有 Amazon Keyspace 所需的客户托管密钥权限。
Amazon Keyspaces 对客户托管密钥至少需要具备以下权限:
kms:ReEncrypt*(对于公里:ReEncrypt来自和公里:ReEncrypt至)
kms:GenerateData键 * (用于kms:GenerateData密钥和kms:GenerateDataKeyWithout明文)
示例密钥策略
例如,以下示例密钥策略仅提供所需的权限。该策略具有以下效果:
-
允许 Amazon Keyspaces 在加密操作中使用客户托管密钥并创建授权,但仅当它代表账户中具备 Amazon Keyspaces 使用权限的委托人行事时才可如此。如果策略语句中指定的委托人无权使用 Amazon Keyspaces,调用将失败,即使调用来自 Amazon Keyspaces 服务也是如此。
-
这些区域有:kms:ViaService条件密钥仅当 Amazon Keyspaces 代表策略语句中所列委托人发出请求时,才允许权限。这些委托人不能直接调用这些操作。请注意,
kms:ViaService值cassandra.*.amazonaws.com在“区域”位置中有一个星号 (*)。亚马逊 Keyspaces 需要独立于任何特定的权限Amazon Web Services 区域. -
为客户管理的密钥管理员(可以假设
db-teamrole) 对客户托管密钥的只读访问权限以及撤销授权的权限,包括亚马逊 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 在新表上指定客户托管密钥。
使用客户托管密钥(控制台)创建加密表
登录到Amazon Web Services Management Console,然后打开亚马逊 Keyspaces 控制台https://console.aws.amazon.com/keyspaces/home
. -
在导航窗格中,选择 Tables (表),然后选择 Create table (创建表)。
-
在存储库的创建表在中的页面表详细信息部分中,选择键空间并提供新表的名称。
-
在架构部分中,为表创建架构。
在表设置部分,选择。自定义设置.
-
继续到加密设置.
在此步骤中,您将选择表的加密设置。
在静态加密位置在部分选择Amazon KMS key中,选择选项选择不同的 KMS 密钥(高级),然后在搜索字段中,选择Amazon KMS key也可输入 Amazon Resource Name(ARN)。
注意 如果您选择的密钥无法访问或缺少所需的权限,请参阅密钥访问故障排除中的Amazon Key Management Service开发人员指南 的第一个版本。
-
选择 Create (创建) 以创建加密表。
使用客户托管密钥创建新表以进行静态加密 (CQL)
要创建使用客户托管密钥进行静态加密的新表,可以使用CREATE TABLE语句,如以下示例所示。确保将密钥 ARN 替换为 ARN,以获得授予 Amazon Keyspace 的权限的有效密钥。
CREATE TABLEmy_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 密钥。
使用新的客户管理密钥(控制台)更新现有表
登录到Amazon Web Services Management Console,然后打开亚马逊 Keyspaces 控制台https://console.aws.amazon.com/keyspaces/home
. -
在导航窗格中,选择表。
-
选择要更新的表,然后选择其他设置选项卡。
-
在静态加密部分,选择。管理加密以编辑表的加密设置。
位置在选择Amazon KMS key中,选择选项选择不同的 KMS 密钥(高级)在搜索字段中,选择一个Amazon KMS key也可输入 Amazon Resource Name(ARN)。
注意 如果您选择的密钥无效,请参阅密钥访问故障排除中的Amazon Key Management Service开发人员指南 的第一个版本。
或者,您也可以选择Amazon 拥有的密钥对于使用客户托管密钥加密的表。
-
选择保存更改以保存对表所做的更改。
更新用于现有表的加密密钥
要更改现有表的加密密钥,请使用ALTER
TABLE指定适用于静态加密的客户托管密钥。确保将密钥 ARN 替换为 ARN,以获得授予 Amazon Keyspace 的权限的有效密钥。
ALTER TABLEmy_keyspace.my_tableWITH 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 TABLEmy_keyspace.my_tableWITH CUSTOM_PROPERTIES = { 'encryption_specification':{ 'encryption_type' : 'AWS_OWNED_KMS_KEY' } };
第 5 步:在日志中使用 Amazon Keyspaces 加密上下文
加密上下文 是一组包含任意非机密数据的键值对。在请求中包含加密上下文以加密数据时,Amazon KMS 以加密方式将加密上下文绑定到加密的数据。要解密数据,您必须传入相同的加密上下文。
Amazon Keyspaces 在所有时候使用相同的加密上下文。Amazon KMS加密操作。如果您将客户托管密钥要保护 Amazon Keyspaces 表,您可以使用加密上下文在审核记录和日志中标识客户托管密钥的使用。它还以明文形式显示在日志中,例如,在日志中显示。Amazon CloudTrail和亚马逊CloudWatch日志.
在它的请求中Amazon KMS,Amazon Keyspaces 使用具有三个密钥-值对的加密上下文。
"encryptionContextSubset": { "aws:cassandra:keyspaceName": "my_keyspace", "aws:cassandra:tableName": "mytable" "aws:cassandra:subscriberId": "111122223333" }
-
键空间— 第一个密钥-值对用于标识包含 Amazon Keyspace 正在加密的表的密 Keyspaces 间。密钥是
aws:cassandra:keyspaceName。值是密钥空间的名称。"aws:cassandra:keyspaceName": "<keyspace-name>"例如:
"aws:cassandra:keyspaceName": "my_keyspace" -
表Account — 第二个密钥-值对用于标识 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
如果您将客户托管密钥为了保护您的亚马逊 Keyspaces 表,您可以使用Amazon CloudTrail用于跟踪 Amazon Keyspaces 发送到的请求的日志Amazon KMS代表您。
这些区域有:GenerateDataKey、DescribeKey、Decrypt, 和CreateGrant本部分将讨论请求。此外,亚马逊 Keyspaces 使用RetireGrant操作来在您删除表时删除授权。
- GenerateData密钥
-
Amazon Keyspaces 会创建唯一的表密钥来加密静态数据。它会发送GenerateData密钥请求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
-
当您使用客户托管密钥为了保护您的亚马逊 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" }