Amazon DynamoDB 如何使用Amazon KMS - Amazon Key Management Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

Amazon DynamoDB 如何使用Amazon KMS

Amazon DynamoDB是一种完全托管的可扩展式 NoSQL 数据库服务。DynamoDB 与Amazon Key Management Service(Amazon KMS)来支持静态加密服务器端加密功能。

静态加密,DynamoDB 可以透明方式对 DynamoDB 表中的所有客户数据进行加密,包括其主键及本地和全局数据。二级索引,无论何时将表保留到磁盘上。(如果表具有排序键,则标记范围边界的一些排序键将以明文形式存储在表元数据中。) 当您访问表时,DynamoDB 会以透明方式解密表数据。您无需更改应用程序即可使用或管理加密表。

静态加密DynamoDB 流全局表, 和备份只要将这些对象保存到持久性媒体中。有关本主题中表的语句也适用于这些对象。

将对所有 DynamoDB 表进行加密。没有为新表或现有表启用或禁用加密的选项。默认情况下,所有表都在Amazon拥有的客户主密钥(CMK) 的数据 DynamoDB 帐户。但是,您可以选择一个选项来对部分或全部表进行加密客户托管 CMKAmazon托管 CMK对于您的帐户中的 DynamoDB。

注意

在 2018 年 11 月之前,静态加密是一项可选功能,它仅支持Amazon托管 CMDynamoDB。如果已对任一 DynamoDB 表启用静态加密,这些表将继续在Amazon托管 CMK,除非您使用Amazon Web Services Management Console或者UpdateTable操作切换到客户管理的 CMK 或Amazon拥有的 CMK。

适用于 DynamoDB 的客户端加密

除了属于服务器端加密 功能的静态加密以外,Amazon 还提供 Amazon DynamoDB 加密客户端。此客户端加密 库使您能够在将表数据提交到 DynamoDB 之前对该数据进行保护。利用服务器端加密,您的数据可通过 HTTPS 连接在传输中进行加密,在 DynamoDB 终端节点进行解密,然后在存储在 DynamoDB 中之前重新进行加密。客户端加密在 DynamoDB 中为数据从其源到存储提供端到端保护。

您可以将 DynamoDB 加密客户端与静态加密结合使用。要帮助您确定此策略是否适合您的 DynamoDB 数据,请参阅客户端或服务器端加密?中的Amazon DynamoDB 加密客户端开发人员指南.

使用 CMK 和数据密钥

DynamoDB 静态加密功能使用Amazon KMS客户主密钥 (CMK) 和数据密钥的层次结构来保护表数据。DynamoDB 使用相同的密钥层次结构来保护这些对象,当将 DynamoDB 流、全局表和备份写入持久性媒体时。

客户主密钥 (CMK)

静态加密功能在Amazon KMS客户主密钥 (CMK)。默认情况下,DynamoDB 使用Amazon拥有的 CMK(在 DynamoDB 服务账户中创建和管理的多租户加密密钥。但是,DynamoDB 可以在客户托管 CMKAmazon托管 CMK对于 DynamoDB (aws/dynamodb)在您的 Amazon Web Services 账户 . 您可以为每个表选择不同的 CMK。为表选择的 CMK 也可用于对其本地和全局二级索引、流和备份进行加密。

当您创建或更新表时,可以为表选择 CMK。可在 DynamoDB 控制台中或使用UpdateTableoperation. 切换密钥的过程是无缝的,不需要停机或降低服务质量。

重要

DynamoDB 仅支持对称 CMK. 您无法使用非对称 CMK来加密您的 DynamoDB 表。要获取确定 CMK 是对称还是非对称的帮助,请参阅识别对称 CMK 和非对称 CMK

使用客户托管 CMK 可获得以下功能:

如果您需要以下任意功能,请使用 Amazon 托管 CMK:

但是,Amazon 拥有的 CMK 是免费的,其使用不会计入 Amazon KMS 资源或请求配额。客户托管 CMK 和 Amazon 托管 CMK 针对每个 API 调用会产生费用,并且 Amazon KMS 配额适用于这些 CMK。

表密钥

DynamoDB 使用表 CMK 来生成和加密唯一数据密钥,称为表密钥. 该表密钥将在加密表的生命周期内保留。

该表密钥用作密钥加密密钥。DynamoDB 使用此表密钥来保护用于加密表数据的数据加密密钥。DynamoDB 会为表中的每个底层结构生成唯一的数据加密密钥,但多个表项目可能受相同的数据加密密钥保护。


              使用静态加密对 DynamoDB 表进行加密

当您首次访问加密表时,DynamoDB 会向发送请求Amazon KMS来使用 CMK 解密表密钥。然后,它会使用明文表密钥来解密数据加密密钥,并使用明文数据加密密钥解密表数据。

DynamoDB 生成、使用和存储表密钥和数据加密密钥。Amazon KMS. 它会借助高级加密标准 (AES) 加密和 256 位加密密钥保护所有密钥。然后,它存储加密密钥及加密数据,以便它们可根据需要用于解密表数据。

如果更改表的 CMK,DynamoDB 会生成新的表密钥。然后,它使用新的表密钥来重新加密数据加密密钥。

表密钥缓存

要避免调用Amazon KMS对于每个 DynamoDB 操作,DynamoDB 会针对每个连接将明文表密钥缓存在内存中。如果 DynamoDB 在处于不活动状态 5 分钟后获取缓存表密钥的请求,它会向Amazon KMS解密表密钥。此调用将捕获对 CMK 的访问策略所做的任何更改。Amazon KMS或者Amazon Identity and Access Management(IAM) 自上次请求解密表密钥以来。

授权使用 CMK

如果您将客户托管 CMKAmazon托管 CMK来保护 DynamoDB 表,则该 CMK 的策略必须向 DynamoDB 提供代表您使用它的权限。上的授权上下文Amazon适用于 DynamoDB 的托管 CMK 包括其密钥策略并授予该委托人使用此策略的权限。

您可以全面控制客户托管 CMK 的策略和授权。由于 Amazon 托管 CMK 在您的账户中,因此,您可以查看其策略和授权。但由于它由 Amazon 托管,因此,您无法更改策略。

DynamoDB 无需额外授权即可使用默认的Amazon拥有的 CMK来 DynamoDB 护您的 Amazon Web Services 账户 .

Amazon 托管 CMK 密钥策略

当 DynamoDB 使用Amazon托管 CMK对于 DynamoDB (aws/dynamodb),它将代表正在访问加密操作中的用户执行此操作。DynamoDB 资源. Amazon 托管 CMK 的密钥策略向账户中的所有用户授予对指定操作使用 Amazon 托管 CMK 的权限。但是,权限仅在 DynamoDB 代表用户提出请求时才被授予。这些区域有:ViaService 条件不允许任何用户使用Amazon托管 CMK,除非请求源于 DynamoDB 服务。

与所有 Amazon 托管密钥的策略类似,此密钥策略由 Amazon 服务建立。您无法更改它,但可以随时查看它。有关详细信息,请参阅 查看密钥策略

密钥策略中的策略语句具有以下影响:

  • 允许账户中的用户使用Amazon托管 CMK 适用于 DynamoDynamoDB 的请求来自于代表他们的 DynamoDynamoDB。该策略还允许用户为 CMK 创建授权

  • 允许账户中的授权 IAM 身份查看Amazon托管 CMDynamoDB 和撤销授予,它允许 DynamoDB 使用 CMK。DynamoDB 使用GRANT适用于持续维护操作。

  • 允许 DynamoDB 执行只读操作来查找Amazon适用于您的账户中 DynamoDB 的托管 CMK。

{ "Version" : "2012-10-17", "Id" : "auto-dynamodb-1", "Statement" : [ { "Sid" : "Allow access through Amazon DynamoDB for all principals in the account that are authorized to use Amazon DynamoDB", "Effect" : "Allow", "Principal" : { "AWS" : "*" }, "Action" : [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:CreateGrant", "kms:DescribeKey" ], "Resource" : "*", "Condition" : { "StringEquals" : { "kms:CallerAccount" : "111122223333", "kms:ViaService" : "dynamodb.us-west-2.amazonaws.com" } } }, { "Sid" : "Allow direct access to key metadata to the account", "Effect" : "Allow", "Principal" : { "AWS" : "arn:aws:iam::111122223333:root" }, "Action" : [ "kms:Describe*", "kms:Get*", "kms:List*", "kms:RevokeGrant" ], "Resource" : "*" }, { "Sid" : "Allow DynamoDB Service with service principal name dynamodb.amazonaws.com to describe the key directly", "Effect" : "Allow", "Principal" : { "Service" : "dynamodb.amazonaws.com" }, "Action" : [ "kms:Describe*", "kms:Get*", "kms:List*" ], "Resource" : "*" } ] }

客户托管 CMK 密钥策略

当您选择客户托管 CMK来保护 DynamoDB 表,DynamoDB 将获得代表做出选择的委托人使用 CMK 的权限。该委托人(用户或角色)必须具有 DynamoDB 所需的 CMK 权限。您可以在密钥策略,一个IAM 策略,或授予.

DynamoDB 至少需要对客户托管 CMK 具备以下权限:

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

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

  • 这些区域有:kms:ViaService条件键仅当代表策略语句中所列委托人 DynamoDB 出请求时,才允许权限。这些委托人不能直接调用这些操作。请注意,kms:ViaService值、dynamodb.*.amazonaws.com)在区域位置中具有星号 (*)。DynamoDB 需要权限独立于任何特定的 Amazon Web Services 区域 ,以便它可以进行跨区域调用来支持DynamoDB 全局表.

  • 授予 CMK 管理员(可以假设db-team角色)对 CMK 的只读访问权限,以及撤销授权的权限,包括授予 DynamoDB 需要的来保护表。

  • 赋予 DynamoDB 对 CMK 的只读访问权限。在此情况下,DynamoDB 可以直接调用这些操作。而不必代表账户委托人行事。

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

{ "Id": "key-policy-dynamodb", "Version":"2012-10-17", "Statement": [ { "Sid" : "Allow access through Amazon DynamoDB for all principals in the account that are authorized to use Amazon DynamoDB", "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" : "dynamodb.*.amazonaws.com" } } }, { "Sid": "Allow administrators to view the CMK and revoke grants", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/db-team" }, "Action": [ "kms:Describe*", "kms:Get*", "kms:List*", "kms:RevokeGrant" ], "Resource": "*" }, { "Sid": "Allow DynamoDB to get information about the CMK", "Effect": "Allow", "Principal": { "Service":["dynamodb.amazonaws.com"] }, "Action": [ "kms:Describe*", "kms:Get*", "kms:List*" ], "Resource": "*" } ] }

使用授权来授权 DynamoDB

除密钥策略之外,DynamoDB 还使用授权来对客户托管 CMK 或Amazon托管 CMK,用于 DynamoDB 控制台(aw/ 动态)。要查看有关您的账户中 CMK 的授权,请使用ListGrantsoperation. DynamoDB 不需要授予或任何其他权限即可使用Amazon拥有的 CMK保护您的表。

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

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

要创建授权,DynamoDB 必须具备调用的权限。CreateGrant代表创建了加密表的用户执行此操作。适用于Amazon托管 CMK,DynamoDB 将获取kms:CreateGrant权限来自密钥策略,它允许帐户用户调用CreateGrant仅当 DynamoDB 代表授权用户提出请求时才适用于此。

该密钥策略还可以允许账户撤销对 CMK 授权。但是,如果您对某个活动加密表撤销授权,DynamoDB 将无法保护和维护该表。

DynamoDB 加密上下文

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

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

加密上下文还可以用作在策略和授权中进行授权的条件。DynamoDB 使用加密上下文来限制GRANT允许访问客户托管 CMK 或Amazon托管 CMK 在您的账户和区域中。

在其请求Amazon KMS时,DynamoDB 使用具有两个密钥-值对的加密上下文。

"encryptionContextSubset": { "aws:dynamodb:tableName": "Books" "aws:dynamodb:subscriberId": "111122223333" }
  • — 第一个密钥-值对标识 DynamoDB 正在加密的表。密钥是 aws:dynamodb:tableName。值为表的名称。

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

    例如:

    "aws:dynamodb:tableName": "Books"
  • 账户— 第二个密钥-值对用于标识 Amazon Web Services 账户 . 密钥是 aws:dynamodb:subscriberId。该值为账户 ID。

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

    例如:

    "aws:dynamodb:subscriberId": "111122223333"

监控与的 DynamoDB 交互Amazon KMS

如果您将客户托管 CMKAmazon托管 CMK来保护您的 DynamoDB 表,您可以使用Amazon CloudTrail日志来跟踪 DynamoDB 发送到的请求Amazon KMS代表您。

本部分将讨论 GenerateDataKeyDecryptCreateGrant 请求。此外,DynamoDB 使用DescribeKey操作来确定所选 CMK 是否存在于账户和区域中。它还使用 RetireGrant 操作来在您删除表时删除授权。

GenerateDataKey

当您对表启用静态加密时,DynamoDB 会创建一个唯一表密钥。它将 GenerateDataKey 请求发送到指定表 CMK 的 Amazon KMS。

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

{ "eventVersion": "1.05", "userIdentity": { "type": "AWSService", "invokedBy": "dynamodb.amazonaws.com" }, "eventTime": "2018-02-14T00:15:17Z", "eventSource": "kms.amazonaws.com", "eventName": "GenerateDataKey", "awsRegion": "us-west-2", "sourceIPAddress": "dynamodb.amazonaws.com", "userAgent": "dynamodb.amazonaws.com", "requestParameters": { "encryptionContext": { "aws:dynamodb:tableName": "Services", "aws:dynamodb:subscriberId": "111122223333" }, "keySpec": "AES_256", "keyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" }, "responseElements": null, "requestID": "229386c1-111c-11e8-9e21-c11ed5a52190", "eventID": "e3c436e9-ebca-494e-9457-8123a1f5e979", "readOnly": true, "resources": [ { "ARN": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "accountId": "111122223333", "type": "AWS::KMS::Key" } ], "eventType": "AwsApiCall", "recipientAccountId": "111122223333", "sharedEventID": "bf915fa6-6ceb-4659-8912-e36b69846aad" }
Decrypt

当您访问加密的 DynamoDB 表时,DynamoDB 需要解密表密钥,以便它可以解密层次结构中位于其下方的密钥。然后,解密表中的数据。解密表密钥。DynamoDB 会发送Decrypt请求Amazon KMS,它指定表 CMK。

记录 Decrypt 操作的事件与以下示例事件类似。用户是您的 Amazon Web Services 账户 谁正在访问表。参数包括加密表密钥(作为密文 blob)和加密上下文,用于标识表和 Amazon Web Services 账户 .Amazon KMS将从密文中派生 CMK 的 ID。

{ "eventVersion": "1.05", "userIdentity": { "type": "AssumedRole", "principalId": "AROAIGDTESTANDEXAMPLE:user01", "arn": "arn:aws:sts::111122223333:assumed-role/Admin/user01", "accountId": "111122223333", "accessKeyId": "AKIAIOSFODNN7EXAMPLE", "sessionContext": { "attributes": { "mfaAuthenticated": "false", "creationDate": "2018-02-14T16:42:15Z" }, "sessionIssuer": { "type": "Role", "principalId": "AROAIGDT3HGFQZX4RY6RU", "arn": "arn:aws:iam::111122223333:role/Admin", "accountId": "111122223333", "userName": "Admin" } }, "invokedBy": "dynamodb.amazonaws.com" }, "eventTime": "2018-02-14T16:42:39Z", "eventSource": "kms.amazonaws.com", "eventName": "Decrypt", "awsRegion": "us-west-2", "sourceIPAddress": "dynamodb.amazonaws.com", "userAgent": "dynamodb.amazonaws.com", "requestParameters": { "encryptionContext": { "aws:dynamodb:tableName": "Books", "aws:dynamodb:subscriberId": "111122223333" } }, "responseElements": null, "requestID": "11cab293-11a6-11e8-8386-13160d3e5db5", "eventID": "b7d16574-e887-4b5b-a064-bf92f8ec9ad3", "readOnly": true, "resources": [ { "ARN": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "accountId": "111122223333", "type": "AWS::KMS::Key" } ], "eventType": "AwsApiCall", "recipientAccountId": "111122223333" }
CreateGrant

当您使用客户托管 CMKAmazon托管 CMK来保护您的 DynamoDB 表,则动态 DB 使用GRANT以允许该服务执行连续数据保护与维护和持久性任务。Amazon 拥有的 CMK 不需要这些授权。

DynamoDB 创建的授权特定于表。CreateGrant 请求的委托人是创建了表的用户。

记录 CreateGrant 操作的事件与以下示例事件类似。参数包括表的 CMK 的 Amazon 资源名称 (ARN)、被授权委托人和停用委托人(DynamoDB 服务)以及授权涵盖的操作。它还包括要求所有加密操作都使用指定加密上下文的约束。

{ "eventVersion": "1.05", "userIdentity": { "type": "AssumedRole", "principalId": "AROAIGDTESTANDEXAMPLE:user01", "arn": "arn:aws:sts::111122223333:assumed-role/Admin/user01", "accountId": "111122223333", "accessKeyId": "AKIAIOSFODNN7EXAMPLE", "sessionContext": { "attributes": { "mfaAuthenticated": "false", "creationDate": "2018-02-14T00:12:02Z" }, "sessionIssuer": { "type": "Role", "principalId": "AROAIGDTESTANDEXAMPLE", "arn": "arn:aws:iam::111122223333:role/Admin", "accountId": "111122223333", "userName": "Admin" } }, "invokedBy": "dynamodb.amazonaws.com" }, "eventTime": "2018-02-14T00:15:15Z", "eventSource": "kms.amazonaws.com", "eventName": "CreateGrant", "awsRegion": "us-west-2", "sourceIPAddress": "dynamodb.amazonaws.com", "userAgent": "dynamodb.amazonaws.com", "requestParameters": { "keyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "retiringPrincipal": "dynamodb.us-west-2.amazonaws.com", "constraints": { "encryptionContextSubset": { "aws:dynamodb:tableName": "Books", "aws:dynamodb:subscriberId": "111122223333" } }, "granteePrincipal": "dynamodb.us-west-2.amazonaws.com", "operations": [ "DescribeKey", "GenerateDataKey", "Decrypt", "Encrypt", "ReEncryptFrom", "ReEncryptTo", "RetireGrant" ] }, "responseElements": { "grantId": "5c5cd4a3d68e65e77795f5ccc2516dff057308172b0cd107c85b5215c6e48bde" }, "requestID": "2192b82a-111c-11e8-a528-f398979205d8", "eventID": "a03d65c3-9fee-4111-9816-8bf96b73df01", "readOnly": false, "resources": [ { "ARN": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "accountId": "111122223333", "type": "AWS::KMS::Key" } ], "eventType": "AwsApiCall", "recipientAccountId": "111122223333" }