使用具有 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 客户主密钥(CMKS)加密您的 Amazon S3 对象。 AWS KMS 仅对对象数据加密。不会加密任何对象元数据。

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

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

注意

您需要 kms:Decrypt 上传或下载 Amazon S3 对象加密 AWS KMS CMK,这是除了 kms:ReEncryptkms:GenerateDataKey,和 kms:DescribeKey 权限。有关详细信息,请参阅 未能将大文件上传到 Amazon S3 使用 AWS KMS CMK.

AWS 托管 CMK 和客户托管 CMK

使用服务器端加密时 AWS KMS (SSE-KMS),您可以使用默认值 AWS 管理CMK,或者您可以指定 客户管理CMK 您已创建的。

如果您未指定客户管理CMK, Amazon S3 自动创建 AWS 在您的 AWS 第一次将加密对象添加到一个桶中的SSE-KMS的时间。默认情况下,Amazon S3 使用此 CMK 进行 SSE-KMS 加密。

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

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

重要

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

AWS 签名版本 4

如果您要上传或访问使用 SSE-KMS 加密的对象,则需使用 AWS 签名版本 4 来提高安全性。有关如何使用 AWS SDK,请参阅 在请求验证中指定签名版本.

重要

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

SSE-KMS 亮点

SSE-KMS 的亮点如下:

  • 您可以选择您创建和管理的客户管理的CMK,或者您可以选择一个 AWS 管理CMK Amazon S3 创建您的 AWS 帐户并管理您。像客户管理的CMK,您的 AWS 管理CMK对您的 AWS 账户和地区。仅仅仅 Amazon S3 有权代表您使用此CMK。 Amazon S3 仅支持对称的CMK。

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

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

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

  • 安全控制措施 AWS KMS 可以帮助您满足加密相关的合规要求。

需要服务器端加密

如果要求对特定 Amazon S3 存储桶中的所有对象进行服务器端加密,请使用策略。例如,以下桶策略拒绝上传对象(s3:PutObject)如果请求不包括 x-amz-server-side-encryption 通过SSE-KMS请求服务器端加密的标题。

{ "Version":"2012-10-17", "Id":"PutObjectPolicy", "Statement":[{ "Sid":"DenyUnEncryptedObjectUploads", "Effect":"Deny", "Principal":"*", "Action":"s3:PutObject", "Resource":"arn:aws-cn:s3:::awsexamplebucket1/*", "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)arn:aws-cn:kms:region:acct-id:key/key-id" 格式。

注意

上传对象时,可以指定 AWS KMS CMK使用 x-amz-server-side-encryption-aws-kms-key-id 标题。如果请求中没有标题, Amazon S3 假设 AWS 管理CMK。无论如何, AWS KMS 密钥ID Amazon S3 对象加密的使用必须与 AWS KMS 政策中的密钥ID,否则 Amazon S3 拒绝请求。

完整列表 Amazon S3‐特定条件密钥以及指定条件密钥的更多信息,请参阅 Amazon S3 条件键.

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

有关使用 Amazon S3 控制台中存储的CMKS AWS KMS,参见 如何添加加密到S3对象?Amazon Simple Storage Service 控制台用户指南.

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

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

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