使用具有 AWS Key Management Service 中存储的 CMK 的服务器端加密 (SSE-KMS) 保护数据 - Amazon Simple Storage Service

使用具有 AWS Key Management Service 中存储的 CMK 的服务器端加密 (SSE-KMS) 保护数据

服务器端加密是由接收数据的应用程序或服务在其目的地对数据进行加密。AWS Key Management Service (AWS KMS) 是一项将安全、高度可用的硬件和软件结合起来,提供可扩展到云的密钥管理系统的服务。Amazon S3 使用 AWS KMS keys 加密您的 Amazon S3 对象。AWS KMS 只加密对象数据。不会加密任何对象元数据。

如果您使用 KMS密钥,可以通过 AWS Management ConsoleAWS KMS API 使用 AWS KMS 来集中创建 KMS密钥,定义策略控制 KMS密钥的使用方法,以及审核 KMS密钥使用情况来证明它们使用得当。您可以利用这些 KMS 密钥 来保护在 Amazon S3 存储桶中的数据。将 SSE-KMS 加密用于 S3 存储桶时,AWS KMS keys 必须位于该存储桶所在的同一区域中。

使用 AWS KMS keys 无需支付额外费用。有关更多信息,请参阅 AWS Key Management Service 开发人员指南中的 AWS KMS key 概念AWS KMS 定价

重要

要将使用 AWS KMS key 加密的对象上载到 Amazon S3,您需要该密钥的 kms:Decrypt 权限和 kms:GenerateDataKey 权限。要下载使用 AWS KMS key 加密的对象,您需要 kms:Decrypt 权限。有关 AWS KMS 权限和分段上传的信息,请参阅 分段上传 API 和权限

AWS KMS keys 和客户托管密钥

将服务器端加密与 AWS KMS (SSE-KMS) 结合使用时,您可以使用原定设置的 AWS 托管密钥,也可以指定您已创建的客户托管密钥

如果未指定客户托管密钥,首次将使用 SSE-KMS 加密的对象添加到存储桶时,Amazon S3 会自动在 AWS 账户 中创建 AWS KMS key。默认情况下,Amazon S3 将此 KMS密钥用于 SSE-KMS。

如果要使用客户托管密钥进行 SSE-KMS 加密,可以在配置 SSE-KMS 之前创建客户托管密钥。然后,为存储桶配置 SSE-KMS 时,请指定现有的客户托管密钥。

创建客户托管密钥可为您提供更大的灵活性和控制力。例如,您可以创建、轮换和禁用客户托管密钥。您还可以定义访问控制和审核用于保护数据的客户托管密钥。有关客户托管式和 AWS 托管式密钥的更多信息,请参阅 AWS Key Management Service 开发人员指南中的 AWS KMS 概念

重要

当您在 Amazon S3 中使用 AWS KMS key 进行服务器端加密时,您必须选择对称的密钥。Amazon S3 仅支持对称密钥,不支持非对称密钥。有关更多信息,请参阅 AWS Key Management Service 开发人员指南中的使用对称和非对称密钥

Amazon S3 存储桶密钥

当您配置使用 AWS KMS 进行的服务器端加密 (SSE-KMS) 时,您可以将存储桶配置为使用 S3 存储桶密钥进行 SSE-KMS。SSE-KMS 的此存储桶级别密钥通过减少从 Amazon S3 到 AWS KMS 的流量请求,从而使您可以将 KMS 请求成本降低多达 99%。

当您将存储桶配置为使用 S3 存储桶密钥对新对象进行 SSE-KMS 时,AWS KMS 会生成存储桶级别密钥,该密钥用于为存储桶中的对象创建唯一的数据密钥。此存储桶密钥在 Amazon S3 内限时使用,从而进一步减少了 Amazon S3 向 AWS KMS 发出请求,以完成加密操作的需求。有关使用 S3 存储桶密钥的更多信息,请参阅 使用 Amazon S3 存储桶密钥降低 SSE-KMS 的成本

AWS 签名版本 4

如果您要上传或访问使用 SSE-KMS 加密的对象,则需使用 AWS 签名版本 4 来提高安全性。有关如何使用 AWS 开发工具包执行此操作的更多信息,请参阅 在请求身份验证中指定签名版本

重要

如果针对受 AWS KMS 保护的对象的所有 GET 和 PUT 请求不是通过 SSL 或 TLS 发出的,或者不是通过使用 SigV4 发出的,则这些请求将会失败。

SSE-KMS 亮点

SSE-KMS 的亮点如下:

  • 您可以选择自己创建并管理的客户托管密钥,也可以选择 Amazon S3 在您的 AWS 账户 中创建并为您管理的 AWS 托管密钥。与客户托管密钥一样,您的 AWS 托管密钥对您的 AWS 账户 和区域也是唯一的。只有 Amazon S3 有权代表您使用此 KMS 密钥。Amazon S3 仅支持对称 KMS 密钥。

  • 您可以从 AWS KMS 控制台创建、轮换和禁用可审核的客户托管密钥。

  • 响应中的 ETag 不是对象数据的 MD5。

  • 用于加密您的数据的数据密钥也会被加密并与它们保护的数据一起存储。

  • AWS KMS 中的安全控制可帮助您满足与加密相关的合规性要求。

需要服务器端加密

如果要求对特定 Amazon S3 存储桶中的所有对象进行服务器端加密,请使用策略。例如,如果请求不包含用于请求服务器端加密 (SSE-KMS) 的 s3:PutObject 标头,则下面的存储桶策略将拒绝所有人的上传对象 (x-amz-server-side-encryption) 权限。

{ "Version":"2012-10-17", "Id":"PutObjectPolicy", "Statement":[{ "Sid":"DenyUnEncryptedObjectUploads", "Effect":"Deny", "Principal":"*", "Action":"s3:PutObject", "Resource":"arn:aws:s3:::awsexamplebucket1/*", "Condition":{ "StringNotEquals":{ "s3:x-amz-server-side-encryption":"aws:kms" } } } ] }

如要求使用特定 AWS KMS key 对存储桶中的对象进行加密,可以使用 s3:x-amz-server-side-encryption-aws-kms-key-id 条件键。要指定 KMS 密钥,必须使用 arn:aws:kms:region:acct-id:key/key-id" 格式的 Amazon Resource Name (ARN)。

注意

在上传对象时,您可以使用 x-amz-server-side-encryption-aws-kms-key-id 标头指定 KMS 密钥。如果请求中没有该标头,则 Amazon S3 采用 AWS 托管密钥。无论如何,Amazon S3 用于对象加密的 AWS KMS 密钥 ID 必须与策略中的 AWS KMS 密钥 ID 匹配,否则 Amazon S3 会拒绝请求。

有关 Amazon S3 特定的条件键的完整列表和有关指定条件键的更多信息,请参阅Amazon S3 条件键示例

加密上下文

Amazon S3 支持带 x-amz-server-side-encryption-context 标题的加密上下文。加密上下文是一组可选的键值对,可以包含有关数据的其他上下文信息。

有关 Amazon S3 中加密上下文的信息,请参阅 加密上下文。有关加密上下文的一般信息,请参阅 AWS Key Management Service 开发人员指南中的 AWS Key Management Service 概念 – 加密上下文

加密上下文可以是您希望的任何值,前提是该标头遵循 Base64 编码的 JSON 格式。但是,由于加密上下文不会加密并且在 AWS CloudTrail 记录打开时会被记录,因此加密上下文不应包含敏感信息。我们进一步建议您的上下文描述正在加密或解密的数据,以便让您可以更好地了解 AWS KMS 生成的 CloudTrail 事件。

在 Amazon S3 中,对象或存储桶 Amazon Resource Name (ARN) 通常用作加密上下文。如果您在不启用 S3 存储桶密钥的情况下使用 SSE-KMS,则将对象 ARN 用作加密上下文,例如,arn:aws:s3:::object_ARN。但是,如果您在启用 S3 存储桶密钥的情况下使用 SSE-KMS,则将存储桶 ARN 用于加密上下文,例如,arn:aws:s3:::bucket_ARN。有关 S3 存储桶的更多信息,请参阅 使用 Amazon S3 存储桶密钥降低 SSE-KMS 的成本

如果密钥 aws:s3:arn 未在加密上下文中,则 Amazon S3 可以将预定义的密钥附加 aws:s3:arn 到您提供的加密上下文中。Amazon S3 在处理您的请求时会附加此预定义密钥。如果您在不启用 S3 存储桶密钥的情况下使用 SSE-KMS,则该值等于对象 ARN。如果您在启用 S3 存储桶密钥的情况下使用 SSE-KMS,则该值等于存储桶 ARN。

您可以使用此预定义的密钥在 CloudTrail 中跟踪相关请求。因此,您始终可以查看哪个 Amazon S3 ARN 与哪个加密密钥一起使用。您可以使用 CloudTrail 日志来确保不同的 Amazon S3 对象和存储桶之间的加密上下文不同,从而提供了额外的安全性。将验证您的完全加密上下文是否有等于对象或存储桶 ARN 的值。