使用 Amazon S3 存储桶密钥降低 SSE-KMS 的成本 - Amazon Simple Storage Service
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

欢迎使用新的 Amazon S3 用户指南! Amazon S3 用户指南结合了以下三个已停用的指南中的信息和说明:Amazon S3 开发人员指南Amazon S3 控制台用户指南Amazon S3 入门指南

使用 Amazon S3 存储桶密钥降低 SSE-KMS 的成本

Amazon S3 存储桶密钥使用 AWS Key Management Service (KMS) 降低了 Amazon S3 服务器端加密的成本。SSE 此存储桶级别密钥通过减少从 Amazon S3 到 AWS KMS 的请求流量,从而将 AWS KMS 请求成本降低多达 99%。只需在 AWS 管理控制台中单击几下,并且无需对客户端应用程序进行任何更改,您就可以将存储桶配置为使用 S3 存储桶密钥对新对象进行基于 AWS KMS 的加密。

SSE-KMS 的 S3 存储桶密钥

访问使用 SSE-KMS 加密的数百万或数十亿个对象的工作负载可以生成大量到 AWS KMS 的请求。当您在没有 S3 存储桶密钥的情况下使用 SSE-KMS 保护数据时,Amazon S3 会为每个对象使用单独的 AWS KMS 数据密钥。每次对 KMS 加密的对象发出请求时,它都会调用 AWS KMS。有关 SSE-KMS 工作原理的信息,请参阅使用在 AWS Key Management Service 中存储 CMK 的服务器端加密 (SSE-KMS) 保护数据

当您将存储桶配置为使用 S3 存储桶密钥进行 SSE-KMS 加密时,AWS KMS 会生成存储桶级密钥,该密钥用于为添加到存储桶中的对象创建唯一的数据密钥。此 S3 存储桶密钥在 Amazon S3 内的限时使用,从而减少了 Amazon S3 向 AWS KMS 发出请求,以完成加密操作的需求。这样可以减少从 S3 到 AWS KMS 的流量,使您能够在 S3 中访问 AWS KMS 加密的对象,所需成本仅为以前的一小部分。

配置 S3 存储桶密钥时,存储桶中已存在的对象不使用 S3 存储桶密钥。要为现有对象配置 S3 存储桶密钥,可以使用 COPY 操作。有关更多信息,请参阅 使用 REST API、AWS 开发工具包或 AWS CLI 在对象级别配置 S3 存储桶密钥

Amazon S3 将仅为由同一 AWS KMS 客户主密钥 (CMK) 加密的对象共享 S3 存储桶密钥。


        图中显示了 AWS KMS 生成的存储桶密钥,该存储桶密钥为 S3 中存储桶中的对象创建数据密钥。

配置 S3 存储桶密钥

您可以通过 Amazon S3 控制台、AWS 开发工具包、AWS CLI 或 REST API 将存储桶配置为使用 S3 存储桶密钥对新对象进行 SSE-KMS 加密。您还可以使用 REST API、AWS 开发工具包或 AWS CLI,利用单个按对象的 KMS 密钥覆盖存储桶中特定对象的 S3 存储桶密钥配置。您还可以查看 S3 存储桶密钥设置。

在将存储桶配置为使用 S3 存储桶密钥之前,请查看启用 S3 存储桶密钥之前需要注意的更改

使用 Amazon S3 控制台配置 S3 存储桶密钥

创建新存储桶时,您可以将存储桶配置为使用 S3 存储桶密钥对新对象进行 SSE-KMS 加密。您还可以通过更新存储桶属性,从而将现有存储桶配置为使用 S3 存储桶密钥对新对象进行 SSE-KMS 加密。 

有关更多信息,请参阅 将存储桶配置为将 S3 存储桶密钥与 SSE-KMS 结合使用于新对象

REST API、AWS CLI 和 AWS 开发工具包 支持 S3 存储桶密钥

您可以使用 REST API、AWS CLI 或 AWS 开发工具包将存储桶配置为使用 S3 存储桶密钥对新对象进行 SSE-KMS 加密。您还可以在对象级别启用 S3 存储桶密钥。

有关更多信息,请参阅下列内容: 

以下 API 支持 SSE-KMS 的 S3 存储桶密钥:

使用 AWS CloudFormation

在 AWS CloudFormation 中,AWS::S3::Bucket 资源包括名为 BucketKeyEnabled 的加密属性,您可以使用该属性来启用或禁用 S3 存储桶密钥。

有关更多信息,请参阅 使用 AWS CloudFormation

启用 S3 存储桶密钥之前需要注意的更改

在启用 S3 存储桶密钥之前,请注意以下相关更改:

用于复制和上传的 kms:Decrypt 权限

重要

要复制或上传带 S3 存储桶密钥的对象,CMK 的 AWS KMS 密钥策略必须包含调用委托人的 kms:Decrypt 权限。

启用 S3 存储桶密钥时,CMK 的 AWS KMS 密钥策略必须包含调用委托人的 kms:Decrypt 权限。如果调用的委托人在除 AWS KMS CMK 之外的其他账户中,则还必须在 IAM 策略中包含 kms:Decrypt 权限。对 kms:Decrypt 的调用会在使用 S3 存储桶密钥之前验证 S3 存储桶密钥的完整性。

如果您使用客户托管的 AWS KMS CMK,则只需在密钥策略中包含 kms:Decrypt 权限。如果您使用 AWS 托管 CMK (aws/s3) 为服务器端加密启用 S3 存储桶密钥,则您的 AWS KMS 密钥策略已包含 kms:Decrypt 权限。

IAM 或 KMS 密钥策略

如果您现有的 IAM 策略或 AWS KMS 密钥策略使用您的对象 Amazon 资源名称 (ARN) 作为加密上下文来优化或限制对 AWS KMS CMK 的访问,则这些策略将不适用于 S3 存储桶密钥。S3 存储桶密钥使用存储桶 ARN 作为加密上下文。在启用 S3 存储桶密钥之前,请更新 IAM 策略或 AWS KMS 密钥策略,以将存储桶 ARN 用作加密上下文。

有关加密上下文和 S3 存储桶密钥的更多信息,请参阅密上下文 (x-amz-server-side-encryption-context)

AWS KMS CloudTrail 事件

启用 S3 存储桶密钥后,AWS KMS CloudTrail 事件会记录存储桶 ARN 而不是对象 ARN。此外,您会在日志中看到 SSE-KMS 对象的 KMS CloudTrail 事件较少。 由于 Amazon S3 中的密钥材料是有时间限制的,因此向 AWS KMS 发出的请求较少。 

将 S3 存储桶密钥与复制功能结合使用

您可以将 S3 存储桶密钥与同区域复制 (SRR) 和跨区域复制 (CRR) 结合使用。

当 Amazon S3 复制加密对象时,它通常会在目标存储桶中保留副本对象的加密设置。但是,如果源对象未加密且目标存储桶使用默认加密或 S3 存储桶密钥,则 Amazon S3 会使用目标存储桶的配置加密对象。

重要

要将复制与 S3 存储桶密钥结合使用,用于加密对象复制的 CMK 的 AWS KMS 密钥策略必须包含调用委托人的 kms:Decrypt 权限。对 kms:Decrypt 的调用会在使用 S3 存储桶密钥之前验证 S3 存储桶密钥的完整性。有关更多信息,请参阅 将 S3 存储桶密钥与复制功能结合使用。有关 SSE-KMS 和 S3 存储桶密钥的更多信息,请参阅 Amazon S3 存储桶密钥和复制

以下示例说明了 S3 存储桶密钥如何与复制结合使用。有关更多信息,请参阅 复制通过 AWS KMS CMK 使用服务器端加密 (SSE) 创建的对象。 

例 示例 1 – 源对象使用 S3 存储桶密钥,目标存储桶使用默认加密

如果源对象使用 S3 存储桶密钥,但目标存储桶将默认加密与 SSE-KMS 结合使用,则副本对象将在目标存储桶中维护其 S3 存储桶密钥加密设置。目标存储桶仍将默认加密与 SSE-KMS 结合使用。

例 示例 2 – 源对象未加密,目标存储桶将 S3 存储桶密钥与 SSE-KMS 结合使用

如果源对象未加密,而目标存储桶将 S3 存储桶密钥与 SSE-KMS 结合使用,则将使用目标存储桶中的 SSE-KMS,借助 S3 存储桶密钥对源对象进行加密。这将导致源对象的 ETag 与副本对象的 ETag 不同。您必须更新使用 ETag 的应用程序以应对这种差异。

使用 S3 存储桶密钥

有关启用和使用 S3 存储桶密钥的更多信息,请参阅以下各部分: