在 Amazon 中使用客户托管的密钥 QLDB - 亚马逊 Quantum Ledger 数据库(亚马逊QLDB)

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

在 Amazon 中使用客户托管的密钥 QLDB

您可以使用 AWS Management Console、 AWS Command Line Interface (AWS CLI) 或,为 Amazon 中的 AWS KMS key 新账本和现有账本指定。QLDB API QLDB以下主题介绍如何在中管理和监控客户托管密钥的使用情况QLDB。

先决条件

必须先在 AWS Key Management Service (AWS KMS) 中创建密钥,然后才能使用客户管理的密钥保护QLDB账本。您还必须指定QLDB允许代表您创建授权 AWS KMS key 的密钥策略。

创建客户托管的密钥

要创建客户托管密钥,请按照《AWS Key Management Service 开发人员指南》创建对称加密KMS密钥中的步骤进行操作。QLDB不支持非对称密钥

设置密钥策略

密钥策略是控制中客户托管密钥访问权限的主要方法 AWS KMS。每个 KMS 密钥必须只有一个密钥策略。密钥政策文档中的声明决定了谁有权使用KMS密钥以及他们如何使用密钥。有关更多信息,请参阅中的使用密钥策略 AWS KMS

创建客户托管式密钥时,可以指定密钥策略。要更改现有客户托管密钥的密钥策略,请参阅更改密钥策略

QLDB要允许使用您的客户托管密钥,密钥策略必须包含以下 AWS KMS 操作的权限:

密钥策略示例

以下是您可以使用的关键策略示例QLDB。此策略允许有权使用该账户QLDB的委托人111122223333对资源arn:aws:kms:us-east-1:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab调用DescribeKeyCreateGrant操作。

要使用此政策,请替换 us-east-1, 111122223333,以及 1234abcd-12ab-34cd-56ef-1234567890ab 在示例中包含您自己的信息。

{ "Version": "2012-10-17", "Statement": [ { "Sid" : "Allow access to principals authorized to use Amazon QLDB", "Effect" : "Allow", "Principal" : { "AWS" : "*" }, "Action" : [ "kms:DescribeKey", "kms:CreateGrant" ], "Resource" : "arn:aws:kms:us-east-1:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "Condition" : { "StringEquals" : { "kms:ViaService" : "qldb.us-east-1.amazonaws.com", "kms:CallerAccount" : "111122223333" } } } ] }

为新分类账指定 AWS KMS key

使用QLDB控制台或创建新账本时,请按照以下步骤指定KMS密钥 AWS CLI。

您可以使用 ID、别名或 Amazon 资源名称 (ARN) 来指定客户托管密钥。要了解更多信息,请参阅《AWS Key Management Service 开发者指南》中的密钥标识符 (KeyId)

注意

不支持跨区域密钥。指定的KMS密钥必须与您的账本 AWS 区域 相同。

  1. 登录 AWS Management Console,然后通过 https://console.aws.amazon.com/ql db 打开亚马逊QLDB控制台。

  2. 选择 创建分类账

  3. 创建分类账 页面上,执行以下操作:

    • 分类帐信息-输入在当前 AWS 账户 和区域的所有分类帐中唯一的分类帐名称

    • 权限模式 - 选择要分配给分类帐的权限模式:

      • 允许全部

      • 标准已推荐

    • 加密静态数据-选择用于静态加密的密KMS钥类型:

      • 使用 AWS 拥有的KMS密KMS钥-使用由您代表自己拥有和管理 AWS 的密钥。这是默认选项,无需额外设置。

      • 选择其他 AWS KMS 密钥-在您的账户中使用由您创建、拥有和管理的对称加密KMS密钥。

        要使用 AWS KMS 控制台创建新密钥,请选择创建 AWS KMS 密钥。有关更多信息,请参阅《AWS Key Management Service 开发人员指南》中的创建对称加密KMS密钥

        要使用现有KMS密钥,请从下拉列表中选择一个密钥或指定一个KMS密钥ARN。

  4. 根据需要进行设置后,选择 创建分类账

    当QLDB账本的状态变为 “有效” 时,您可以访问账本。这个过程可能需要几分钟。

使用使用默认密钥 AWS 拥有的密钥 或客户托管密钥在中QLDB创建账本。 AWS CLI

例 — 使用默认 AWS 拥有的密钥创建分类账
aws qldb create-ledger --name my-example-ledger --permissions-mode STANDARD
例 — 创建包含客户托管密钥的分类账
aws qldb create-ledger \ --name my-example-ledger \ --permissions-mode STANDARD \ --kms-key arn:aws:kms:us-east-1:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab

更新现有分类账的 AWS KMS key

您也可以随时使用QLDB控制台或 AWS CLI 将现有账本的KMS密钥更新为 AWS 拥有的密钥 或客户托管密钥。

注意

亚马逊QLDB于 2021 年 7 月 22 AWS KMS keys 日推出了对客户管理的支持。默认情况下,在发布之前创建的所有账本都 AWS 拥有的密钥 受到保护,但目前不符合使用客户托管密钥进行静态加密的资格。

您可以在QLDB控制台上查看账本的创建时间。

中的关键更改QLDB是异步的。在处理关键变更期间,分类账完全可以访问,不会对性能产生任何影响。秘钥更新所用时间因分类账大小而异。

您可以使用 ID、别名或 Amazon 资源名称 (ARN) 来指定客户托管密钥。要了解更多信息,请参阅《AWS Key Management Service 开发者指南》中的密钥标识符 (KeyId)

注意

不支持跨区域密钥。指定的KMS密钥必须与您的账本 AWS 区域 相同。

  1. 登录 AWS Management Console,然后通过 https://console.aws.amazon.com/ql db 打开亚马逊QLDB控制台。

  2. 在导航窗格中,选择分类账

  3. 在分类账列表中,选择要更新的分类帐,然后选择编辑分类账

  4. 编辑账本页面上,选择用于静态加密的密KMS钥类型:

    • 使用 AWS 拥有的KMS密KMS钥-使用由您代表自己拥有和管理 AWS 的密钥。这是默认选项,无需额外设置。

    • 选择其他 AWS KMS 密钥-在您的账户中使用由您创建、拥有和管理的对称加密KMS密钥。

      要使用 AWS KMS 控制台创建新密钥,请选择创建 AWS KMS 密钥。有关更多信息,请参阅《AWS Key Management Service 开发人员指南》中的创建对称加密KMS密钥

      要使用现有KMS密钥,请从下拉列表中选择一个密钥或指定一个KMS密钥ARN。

  5. 选择“确认更改”。

使用使用默认密钥 AWS 拥有的密钥 或客户托管密钥更新中的QLDB现有账本。 AWS CLI

例 — 使用默认 AWS 拥有的密钥创建分类账
aws qldb update-ledger --name my-example-ledger --kms-key AWS_OWNED_KMS_KEY
例 — 更新包含客户托管密钥的分类账
aws qldb update-ledger \ --name my-example-ledger \ --kms-key arn:aws:kms:us-east-1:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab

监控 AWS KMS keys

如果您使用客户托管密钥来保护您的亚马逊QLDB账本,则可以使用AWS CloudTrailAmazon CloudWatch Lo gs 来跟踪代表您QLDB发送的请求。 AWS KMS 有关更多信息,请参阅 AWS Key Management Service 开发人员指南 中的 监控 AWS KMS keys

以下示例是操作CreateGrant、、GenerateDataKeyDecryptEncrypt、和的 CloudTrail 日志条目DescribeKey

CreateGrant

当您指定客户托管密钥来保护您的账本时,QLDB会 AWS KMS 代表您向发送CreateGrant请求以允许访问您的KMS密钥。此外,在您删除账本时,QLDB使用该RetireGrant操作来删除授权。

QLDB创建的赠款特定于账本。CreateGrant 请求CreateGrant的委托人是创建了表的用户。

记录 CreateGrant 操作的事件与以下示例事件类似。这些参数包括客户托管密钥的 Amazon 资源名称 (ARN)、被授权人委托人和即将退休的委托人(QLDB服务),以及拨款涵盖的操作。

{ "eventVersion": "1.08", "userIdentity": { "type": "AssumedRole", "principalId": "AKIAIOSFODNN7EXAMPLE:sample-user", "arn": "arn:aws:sts::111122223333:assumed-role/Admin/sample-user", "accountId": "111122223333", "accessKeyId": "AKIAI44QH8DHBEXAMPLE", "sessionContext": { "sessionIssuer": { "type": "Role", "principalId": "AKIAIOSFODNN7EXAMPLE", "arn": "arn:aws:iam::111122223333:role/Admin", "accountId": "111122223333", "userName": "Admin" }, "webIdFederationData": {}, "attributes": { "mfaAuthenticated": "false", "creationDate": "2021-06-04T21:37:11Z" } }, "invokedBy": "qldb.amazonaws.com" }, "eventTime": "2021-06-04T21:40:00Z", "eventSource": "kms.amazonaws.com", "eventName": "CreateGrant", "awsRegion": "us-west-2", "sourceIPAddress": "qldb.amazonaws.com", "userAgent": "qldb.amazonaws.com", "requestParameters": { "keyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "granteePrincipal": "qldb.us-west-2.amazonaws.com", "operations": [ "DescribeKey", "GenerateDataKey", "Decrypt", "Encrypt" ], "retiringPrincipal": "qldb.us-west-2.amazonaws.com" }, "responseElements": { "grantId": "b3c83f999187ccc0979ef2ff86a1572237b6bba309c0ebce098c34761f86038a" }, "requestID": "e99188d7-3b82-424e-b63e-e086d848ed60", "eventID": "88dc7ba5-4952-4d36-9ca8-9ab5d9598bab", "readOnly": false, "resources": [ { "accountId": "111122223333", "type": "AWS::KMS::Key", "ARN": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" } ], "eventType": "AwsApiCall", "managementEvent": true, "eventCategory": "Management", "recipientAccountId": "111122223333" }
GenerateDataKey

当您指定客户管理的密钥来保护您的账本时,QLDB会创建一个唯一的数据密钥。它向发送GenerateDataKey请求 AWS KMS ,指定账本的客户托管密钥。

记录 GenerateDataKey 操作的事件与以下示例事件类似。用户是QLDB服务帐号。这些参数包括客户托管密钥的、需要长度为 32 字节的数据密钥说明符以及标识内部密钥层次结构节点的加密上下文。ARN

{ "eventVersion": "1.08", "userIdentity": { "type": "AWSService", "invokedBy": "qldb.amazonaws.com" }, "eventTime": "2021-06-04T21:40:01Z", "eventSource": "kms.amazonaws.com", "eventName": "GenerateDataKey", "awsRegion": "us-west-2", "sourceIPAddress": "qldb.amazonaws.com", "userAgent": "qldb.amazonaws.com", "requestParameters": { "keyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "numberOfBytes": 32, "encryptionContext": { "key-hierarchy-node-id": "LY4HWMnkeZWKYi6MlitVJC", "key-hierarchy-node-version": "1" } }, "responseElements": null, "requestID": "786977c9-e77c-467a-bff5-9ad5124a4462", "eventID": "b3f082cb-3e75-454e-bf0a-64be13075436", "readOnly": true, "resources": [ { "accountId": "111122223333", "type": "AWS::KMS::Key", "ARN": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" } ], "eventType": "AwsApiCall", "managementEvent": true, "eventCategory": "Management", "recipientAccountId": "111122223333", "sharedEventID": "26688de5-0b1c-43d3-bc4f-a18029b08446" }
Decrypt

当您访问账本时,会QLDB调用该Decrypt操作来解密账本存储的数据密钥,以便它可以访问账本中的加密数据。

记录 Decrypt 操作的事件与以下示例事件类似。用户是QLDB服务帐号。参数包括客户托管密钥ARN的参数和标识内部密钥层次结构节点的加密上下文。

{ "eventVersion": "1.08", "userIdentity": { "type": "AWSService", "invokedBy": "qldb.amazonaws.com" }, "eventTime": "2021-06-04T21:40:56Z", "eventSource": "kms.amazonaws.com", "eventName": "Decrypt", "awsRegion": "us-west-2", "sourceIPAddress": "qldb.amazonaws.com", "userAgent": "qldb.amazonaws.com", "requestParameters": { "keyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "encryptionAlgorithm": "SYMMETRIC_DEFAULT", "encryptionContext": { "key-hierarchy-node-id": "LY4HWMnkeZWKYi6MlitVJC", "key-hierarchy-node-version": "1" } }, "responseElements": null, "requestID": "28f2dd18-3cc1-4fe2-82f7-5154f4933ebf", "eventID": "603ad5d4-4744-4505-9c21-bd4a6cbd4b20", "readOnly": true, "resources": [ { "accountId": "111122223333", "type": "AWS::KMS::Key", "ARN": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" } ], "eventType": "AwsApiCall", "managementEvent": true, "eventCategory": "Management", "recipientAccountId": "111122223333", "sharedEventID": "7b6ce3e3-a764-42ec-8f90-5418c97ec411" }
Encrypt

QLDB调用该Encrypt操作使用您的客户托管密钥将纯文本加密为密文。

记录 Encrypt 操作的事件与以下示例事件类似。用户是QLDB服务帐号。这些参数包括客户托管密钥ARN的参数和指定账本内部唯一 ID 的加密上下文。

{ "eventVersion": "1.08", "userIdentity": { "type": "AWSService", "invokedBy": "qldb.amazonaws.com" }, "eventTime": "2021-06-04T21:40:01Z", "eventSource": "kms.amazonaws.com", "eventName": "Encrypt", "awsRegion": "us-west-2", "sourceIPAddress": "qldb.amazonaws.com", "userAgent": "qldb.amazonaws.com", "requestParameters": { "keyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "encryptionContext": { "LedgerId": "F6qRNziJLUXA4Vy2ZUv8YY" }, "encryptionAlgorithm": "SYMMETRIC_DEFAULT" }, "responseElements": null, "requestID": "b2daca7d-4606-4302-a2d7-5b3c8d30c64d", "eventID": "b8aace05-2e37-4fed-ae6f-a45a1c6098df", "readOnly": true, "resources": [ { "accountId": "111122223333", "type": "AWS::KMS::Key", "ARN": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" } ], "eventType": "AwsApiCall", "managementEvent": true, "eventCategory": "Management", "recipientAccountId": "111122223333", "sharedEventID": "ce420ab0-288e-4b4f-aee8-541e18a28aa5" }
DescribeKey

QLDB调用DescribeKey操作来确定您指定的KMS密钥是否存在于 AWS 账户 和区域中。

记录 DescribeKey 操作的事件与以下示例事件类似。委托人是您 AWS 账户 中指定KMS密钥的用户。参数包括客户托管密钥的。ARN

{ "eventVersion": "1.08", "userIdentity": { "type": "AssumedRole", "principalId": "AKIAIOSFODNN7EXAMPLE:sample-user", "arn": "arn:aws:sts::111122223333:assumed-role/Admin/sample-user", "accountId": "111122223333", "accessKeyId": "AKIAI44QH8DHBEXAMPLE", "sessionContext": { "sessionIssuer": { "type": "Role", "principalId": "AKIAIOSFODNN7EXAMPLE", "arn": "arn:aws:iam::111122223333:role/Admin", "accountId": "111122223333", "userName": "Admin" }, "webIdFederationData": {}, "attributes": { "mfaAuthenticated": "false", "creationDate": "2021-06-04T21:37:11Z" } }, "invokedBy": "qldb.amazonaws.com" }, "eventTime": "2021-06-04T21:40:00Z", "eventSource": "kms.amazonaws.com", "eventName": "DescribeKey", "awsRegion": "us-west-2", "sourceIPAddress": "qldb.amazonaws.com", "userAgent": "qldb.amazonaws.com", "requestParameters": { "keyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" }, "responseElements": null, "requestID": "a30586af-c783-4d25-8fda-33152c816c36", "eventID": "7a9caf07-2b27-44ab-afe4-b259533ebb88", "readOnly": true, "resources": [ { "accountId": "111122223333", "type": "AWS::KMS::Key", "ARN": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" } ], "eventType": "AwsApiCall", "managementEvent": true, "eventCategory": "Management", "recipientAccountId": "111122223333" }