用于 Amazon DocumentDB 弹性集群的静态数据加密 - Amazon DocumentDB
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

用于 Amazon DocumentDB 弹性集群的静态数据加密

以下主题帮助您了解、创建及监控 Amazon Key Management Service 用于 Amazon DocumentDB 弹性集群的加密密钥:

Amazon DocumentDB 弹性集群自动与 Amazon Key Management Service (Amazon KMS) 集成以管理密钥,并且使用一种称作信封加密的方法保护您的数据。有关信封加密的更多信息,请参阅 Amazon Key Management Service 开发人员指南中的信封加密

Amazon KMS key 是密钥的逻辑表示。KMS 密钥包含元数据,如密钥 ID、创建日期、描述和密钥状态。KMS 密钥还包含用于加密和解密数据的密钥材料。有关 KMS 密钥的更多信息,请参阅 Amazon Key Management Service 开发人员指南中的 Amazon KMS keys

Amazon DocumentDB 弹性集群支持采用两种类型的密钥加密:

  • Amazon自有密钥 — Amazon DocumentDB 弹性集群默认使用这些密钥来自动加密个人身份数据。您无法查看、管理或使用 Amazon 拥有的密钥,或者审计其使用情况。但是无需执行任何操作或更改任何计划即可保护用于加密数据的密钥。。有关更多信息,请参阅 Amazon Key Management Service 开发人员指南中的 Amazon 自有密钥

  • 客户托管密钥 — 您创建、拥有和管理的对称性 Amazon KMS keys。由于您完全控制这一层加密,故因此可以执行此类任务如:

    • 制定和维护关键策略

    • 建立和维护 IAM 策略和授权

    • 启用和禁用密钥策略

    • 轮换加密材料

    • 添加标签

    • 创建密钥别名

    • 安排密钥删除

    有关更多信息,请参阅 Amazon Key Management Service 开发人员指南中的客户托管密钥

重要

您必须使用对称加密 KMS 密钥加密您的集群,因为 Amazon DocumentDB 仅支持对称加密 KMS 密钥。请勿使用非对称 KMS 密钥尝试对 Amazon DocumentDB elastic 集群中的数据进行加密。有关更多信息,请参阅Amazon Key Management Service开发人员指南中的非对称密钥Amazon KMS

如果 Amazon DocumentDB 不再能够有权访问集群的加密密钥 — 例如,在撤销密钥访问权限时 — 加密的集群将进入终末状态。在此情况下,您只能从备份还原集群。对于 Amazon DocumentDB,备份始终启用 1 天。此外,如果您禁用已加密 Amazon DocumentDB 集群的密钥,您最终将失去对该集群的读写访问权限。如果 Amazon DocumentDB 遇到用它无法访问的密钥加密的集群,则它会使该集群进入最终状态。在此状态下,集群不再可用,并且数据库的当前状态无法恢复。若要还原集群,您必须重新启用对 Amazon DocumentDB 的加密密钥的访问,然后从备份还原集群。

重要

在已创建加密集群的 KMS 密钥后,您无法更改它。请确保先确定您的加密密钥要求,然后再创建加密的弹性集群。

Amazon DocumentDB 弹性集群如何使用 Amazon KMS 中的授权

Amazon DocumentDB 弹性集群需要 授权 来使用客户托管密钥。

当您创建经客户托管密钥加密的集群时,Amazon DocumentDB 弹性集群将通过向 Amazon KMS 发送 CreateGrant 请求来代表您创建授权。使用 Amazon KMS 中授权给予 Amazon DocumentDB 弹性集群 访问客户账户中 KMS 密钥的权限。

Amazon DocumentDB 弹性集群要求该授权对以下内部操作使用您的客户托管密钥:

  • 向 Amazon KMS 发送 DescribeKey 请求,以验证在创建跟踪器或地理围栏集合时输入的对称性客户托管 KMS 密钥 ID 是否有效。

  • 向 Amazon KMS 发送 GenerateDataKey 请求,以生成由您的客户托管密钥加密的数据密钥。

  • Decrypt 请求发送到 Amazon KMS ,以解密加密的数据密钥,以使它们能够用于加密您的数据。

  • 您可以随时撤消针对授权的访问权限,也可以移除服务访问客户托管密钥的权限。如果您这样做,Amazon DocumentDB 弹性集群将不能访问由客户托管密钥加密的任何数据,这影响依赖于该数据的操作。

创建客户托管密钥

您可以使用 Amazon Web Services Management Console 或 Amazon KMS API 创建对称客户托管密钥。

对称客户托管密钥创建

遵循 Amazon Key Management Service开发人员指南创建对称性客户托管密钥的步骤。

密钥策略

密钥策略控制对客户托管式密钥的访问。每个客户托管式密钥必须只有一个密钥策略,其中包含确定谁可以使用密钥以及如何使用密钥的声明。创建客户托管式密钥时,可以指定密钥策略。有关更多信息,请参阅位于Amazon Key Management Service开发人员指南Amazon Key Management Service的概述中的 KMS 密钥访问信息。

要将您的客户托管密钥配合 Amazon DocumentDB 弹性集群资源一起使用,则必须在密钥策略中允许以下 API 操作:

  • kms:CreateGrant— 向客户托管密钥添加授权。授予对指定 KMS 密钥的控制访问权限,这允许 Amazon Location Service 要求的授权操作。有关授权的更多信息,请参阅 Amazon Key Management Service 开发人员指南中的授权Amazon KMS

  • kms:DescribeKey – 提供客户托管式密钥详细信息以允许 Docdb Elastic 验证密钥。

  • kms:Decrypt – 允许 Docdb Elastic 使用存储的已加密数据密钥访问已加密数据。

  • kms:GenerateDataKey – 允许 Docdb Elastic 生成并存储已加密的数据密钥,因为数据密钥并不立即用于加密。

有关更多信息,请参阅Amazon Key Management Service开发人员指南中的密钥策略中Amazon 服务权限密钥访问故障排除

通过 IAM 策略限制客户访问托管密钥

除了 KMS 密钥策略外,您还可以在 IAM policy 略中限制 KMS 密钥权限。

您可以通过各种方式使 IAM 策略更严格。例如,要允许客户管理密钥仅用于源自 Amazon DocumentDB 弹性集群的请求,您可以将 kms:ViaService 条件键 docdb-elastic.<region-name>.amazonaws.com 值结合使用。

有关更多信息,请参阅 Amazon Key Management Service 开发人员指南中的允许其他账户中的用户使用 KMS 密钥

监控您的 Amazon DocumentDB 弹性集群加密密钥

当您配合 Docdb Elastic 资源使用 Amazon KMS key 客户托管密钥时,您可以使用 Amazon CloudTrail 或 Amazon CloudWatch Logs 来跟踪 Docdb Elastic 发送到 Amazon KMS 的请求。

以下示例是CreateGrantGenerateDataKeyWithoutPlainTextDecryptDescribeKey 的事件,旨在监控由 Amazon DocumentDB 弹性集群调用的事件以访问由您的客户托管密钥加密的数据Amazon KMS keyAmazon CloudTrail:

CreateGrant
{ "eventVersion": "1.08", "userIdentity": { "type": "AssumedRole", "principalId": "AROAIGDTESTANDEXAMPLE:Sampleuser01", "arn": "arn:aws:sts::111122223333:assumed-role/Admin/Sampleuser01", "accountId": "111122223333", "accessKeyId": "AKIAIOSFODNN7EXAMPLE3", "sessionContext": { "sessionIssuer": { "type": "Role", "principalId": "AROAIGDTESTANDEXAMPLE", "arn": "arn:aws:iam::111122223333:assumed-role/Admin/Sampleuser01", "accountId": "111122223333", "userName": "Sampleuser01" }, "webIdFederationData": {}, "attributes": { "creationDate": "2023-05-09T23:04:20Z", "mfaAuthenticated": "false" } }, "invokedBy": "docdb-elastic.amazonaws.com" }, "eventTime": "2023-05-09T23:55:48Z", "eventSource": "kms.amazonaws.com", "eventName": "CreateGrant", "awsRegion": "us-east-1", "sourceIPAddress": "docdb-elastic.amazonaws.com", "userAgent": "docdb-elastic.amazonaws.com", "requestParameters": { "retiringPrincipal": "docdb-elastic.us-east-1.amazonaws.com", "granteePrincipal": "docdb-elastic.us-east-1.amazonaws.com", "operations": [ "Decrypt", "Encrypt", "GenerateDataKey", "GenerateDataKeyWithoutPlaintext", "ReEncryptFrom", "ReEncryptTo", "CreateGrant", "RetireGrant", "DescribeKey" ], "keyId": "arn:aws:kms:us-east-1:111122223333:key/1234abcd-12ab-34cd-56ef-123456SAMPLE" }, "responseElements": { "grantId": "0ab0ac0d0b000f00ea00cc0a0e00fc00bce000c000f0000000c0bc0a0000aaafSAMPLE", "keyId": "arn:aws:kms:us-east-1:111122223333:key/1234abcd-12ab-34cd-56ef-123456SAMPLE" }, "requestID": "ff000af-00eb-00ce-0e00-ea000fb0fba0SAMPLE", "eventID": "ff000af-00eb-00ce-0e00-ea000fb0fba0SAMPLE", "readOnly": false, "resources": [ { "accountId": "AWS Internal", "type": "AWS::KMS::Key", "ARN": "arn:aws:kms:us-east-1:111122223333:key/1234abcd-12ab-34cd-56ef-123456SAMPLE" } ], "eventType": "AwsApiCall", "managementEvent": true, "recipientAccountId": "111122223333", "eventCategory": "Management" }
GenerateDataKey
{ "eventVersion": "1.08", "userIdentity": { "type": "AssumedRole", "principalId": "AROAIGDTESTANDEXAMPLE:Sampleuser01", "arn": "arn:aws:sts::111122223333:assumed-role/Admin/Sampleuser01", "accountId": "111122223333", "accessKeyId": "AKIAIOSFODNN7EXAMPLE3", "sessionContext": { "sessionIssuer": { "type": "Role", "principalId": "AROAIGDTESTANDEXAMPLE", "arn": "arn:aws:iam::111122223333:assumed-role/Admin/Sampleuser01", "accountId": "111122223333", "userName": "Sampleuser01" }, "webIdFederationData": {}, "attributes": { "creationDate": "2023-05-10T18:02:59Z", "mfaAuthenticated": "false" } }, "invokedBy": "docdb-elastic.amazonaws.com" }, "eventTime": "2023-05-10T18:03:25Z", "eventSource": "kms.amazonaws.com", "eventName": "GenerateDataKey", "awsRegion": "us-east-1", "sourceIPAddress": "docdb-elastic.amazonaws.com", "userAgent": "docdb-elastic.amazonaws.com", "requestParameters": { "keySpec": "AES_256", "keyId": "arn:aws:kms:us-east-1:111122223333:key/1234abcd-12ab-34cd-56ef-123456SAMPLE" }, "responseElements": null, "requestID": "ff000af-00eb-00ce-0e00-ea000fb0fba0SAMPLE", "eventID": "ff000af-00eb-00ce-0e00-ea000fb0fba0SAMPLE", "readOnly": true, "resources": [ { "accountId": "AWS Internal", "type": "AWS::KMS::Key", "ARN": "arn:aws:kms:us-east-1:111122223333:key/1234abcd-12ab-34cd-56ef-123456SAMPLE" } ], "eventType": "AwsApiCall", "managementEvent": true, "recipientAccountId": "111122223333", "eventCategory": "Management" }
Decrypt
{ "eventVersion": "1.08", "userIdentity": { "type": "AssumedRole", "principalId": "AROAIGDTESTANDEXAMPLE:Sampleuser01", "arn": "arn:aws:sts::111122223333:assumed-role/Admin/Sampleuser01", "accountId": "111122223333", "accessKeyId": "AKIAIOSFODNN7EXAMPLE3", "sessionContext": { "sessionIssuer": { "type": "Role", "principalId": "AROAIGDTESTANDEXAMPLE", "arn": "arn:aws:iam::111122223333:assumed-role/Admin/Sampleuser01", "accountId": "111122223333", "userName": "Sampleuser01" }, "webIdFederationData": {}, "attributes": { "creationDate": "2023-05-10T18:05:49Z", "mfaAuthenticated": "false" } }, "invokedBy": "docdb-elastic.amazonaws.com" }, "eventTime": "2023-05-10T18:06:19Z", "eventSource": "kms.amazonaws.com", "eventName": "Decrypt", "awsRegion": "us-east-1", "sourceIPAddress": "docdb-elastic.amazonaws.com", "userAgent": "docdb-elastic.amazonaws.com", "requestParameters": { "encryptionAlgorithm": "SYMMETRIC_DEFAULT" }, "responseElements": null, "requestID": "ff000af-00eb-00ce-0e00-ea000fb0fba0SAMPLE", "eventID": "ff000af-00eb-00ce-0e00-ea000fb0fba0SAMPLE", "readOnly": true, "resources": [ { "accountId": "AWS Internal", "type": "AWS::KMS::Key", "ARN": "arn:aws:kms:us-east-1:111122223333:key/1234abcd-12ab-34cd-56ef-123456SAMPLE" } ], "eventType": "AwsApiCall", "managementEvent": true, "recipientAccountId": "111122223333", "eventCategory": "Management" }
DescribeKey
{ "eventVersion": "1.08", "userIdentity": { "type": "AssumedRole", "principalId": "AROAIGDTESTANDEXAMPLE:Sampleuser01", "arn": "arn:aws:sts::111122223333:assumed-role/Admin/Sampleuser01", "accountId": "111122223333", "accessKeyId": "AKIAIOSFODNN7EXAMPLE3", "sessionContext": { "sessionIssuer": { "type": "Role", "principalId": "AROAIGDTESTANDEXAMPLE", "arn": "arn:aws:iam::111122223333:assumed-role/Admin/Sampleuser01", "accountId": "111122223333", "userName": "Sampleuser01" }, "webIdFederationData": {}, "attributes": { "creationDate": "2023-05-09T23:04:20Z", "mfaAuthenticated": "false" } }, "invokedBy": "docdb-elastic.amazonaws.com" }, "eventTime": "2023-05-09T23:55:48Z", "eventSource": "kms.amazonaws.com", "eventName": "DescribeKey", "awsRegion": "us-east-1", "sourceIPAddress": "docdb-elastic.amazonaws.com", "userAgent": "docdb-elastic.amazonaws.com", "requestParameters": { "keyId": "alias/SampleKmsKey" }, "responseElements": null, "requestID": "ff000af-00eb-00ce-0e00-ea000fb0fba0SAMPLE", "eventID": "ff000af-00eb-00ce-0e00-ea000fb0fba0SAMPLE", "readOnly": true, "resources": [ { "accountId": "AWS Internal", "type": "AWS::KMS::Key", "ARN": "arn:aws:kms:us-east-1:111122223333:key/1234abcd-12ab-34cd-56ef-123456SAMPLE" } ], "eventType": "AwsApiCall", "managementEvent": true, "recipientAccountId": "111122223333", "eventCategory": "Management" }

了解更多信息

以下资源提供有关静态数据加密的更多信息:

  • 有关 Amazon KMS 概念的更多信息,请参阅 Amazon Key Management Service开发人员指南中的 Amazon Key Management Service 基本概念

  • 有关Amazon KMS安全的更多信息,请参阅Amazon Key Management Service开发人员指南中 Amazon Key Management Service 的安全最佳实践