使用具有 AWS Key Management Service 中存储的 CMK 的服务器端加密 (SSE-KMS) 保护数据 - Amazon Simple Storage Service
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

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

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

使用 AWS KMS CMK 需支付额外费用。有关更多信息,请参阅 AWS Key Management Service Developer Guide 中的 AWS Key Management Service 概念 - 客户主密钥 (CMK)AWS Key Management Service 定价

注意

在上传或下载使用 AWS KMS CMK 加密的 Amazon S3 对象时,您需要具有 kms:Decrypt 权限。这是对 kms:ReEncryptkms:GenerateDataKeykms:DescribeKey 权限的补充。有关更多信息,请参阅将使用 AWS KMS CMK 加密的大文件上传到 Amazon S3 失败

AWS 托管 CMK 和客户托管 CMK

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

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

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

创建自己的客户托管 CMK 可为您提供更大的灵活性和对 CMK 的控制。例如,您可以创建、轮换和禁用客户托管的 CMK。您还可以定义访问控制和审核用于保护数据的客户托管 CMK。有关客户托管和 AWS 托管 CMK 的更多信息,请参阅 AWS Key Management Service Developer Guide 中的AWS KMS 概念

重要

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

AWS 签名版本 4

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

重要

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

SSE-KMS 亮点

SSE-KMS 的亮点如下:

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

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

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

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

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

需要服务器端加密

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

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

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

注意

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

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

在 Amazon S3 控制台中使用 AWS Key Management Service

有关在 Amazon S3 控制台中使用 AWS KMS 中存储的 CMK 的更多信息,请参阅 Amazon Simple Storage Service 控制台用户指南 中的如何向 S3 对象添加加密?

Amazon S3 中针对 AWS Key Management Service 的 API 支持

要在对象创建 REST API 中请求 SSE-KMS,请使用 x-amz-server-side-encryption 请求标头。要指定用于对象的 AWS KMS CMK 的 ID,请使用 x-amz-server-side-encryption-aws-kms-key-id。Amazon S3 API 还使用 x-amz-server-side-encryption-context 标头支持加密上下文。有关更多信息,请参阅使用 REST API 在 Amazon S3 中指定 AWS Key Management Service

AWS 开发工具包还提供了一个包装程序 API,供您使用 Amazon S3 请求 SSE-KMS。有关更多信息,请参阅 使用 AWS 开发工具包在 Amazon S3 中指定 AWS Key Management Service