使用 Amazon S3 桶密钥降低 SSE-KMS 的成本
Amazon S3 桶密钥降低了具有 Amazon Key Management Service(Amazon KMS)密钥的 Amazon S3 服务器端加密(SSE-KMS)的成本。使用 SSE-KMS 的桶级别密钥可以通过减少从 Amazon S3 到 Amazon KMS 的请求流量,从而使您可以将 Amazon KMS 请求成本最高降低 99%。只需在 Amazon Web Services Management Console中单击几下,无需对客户端应用程序进行任何更改,您就可以将桶配置为使用 S3 桶密钥对新对象进行 SSE-KMS 加密。
注意
使用 Amazon Key Management Service(Amazon KMS)密钥的双层服务器端加密(DSSE-KMS)不支持 S3 桶密钥。
SSE-KMS 的 S3 桶密钥
访问使用 SSE-KMS 加密的数百万或数十亿个对象的工作负载可以生成大量到 Amazon KMS 的请求。当您在没有 S3 桶密钥的情况下使用 SSE-KMS 保护数据时,Amazon S3 会为每个对象使用单独的 Amazon KMS 数据密钥。在这种情况下,每次对 KMS 加密的对象发出请求时,Amazon S3 都会调用 Amazon KMS。有关 SSE-KMS 工作原理的信息,请参阅 使用具有 Amazon KMS 密钥的服务器端加密(SSE-KMS)。
当您将桶配置为使用 S3 桶密钥进行 SSE-KMS 加密时,Amazon 会从 Amazon KMS 生成生存期较短的桶级密钥,然后暂时将其保留在 S3 中。此桶级密钥将在新对象的生命周期中为其创建数据密钥。S3 桶密钥在 Amazon S3 内限时使用,从而减少了 S3 向 Amazon KMS 发出请求以完成加密操作的需求。这样可以减少从 S3 到 Amazon KMS 的流量,使您能够在 Amazon S3 中访问 Amazon KMS 加密的对象,所需成本仅为以前的一小部分。
为每个请求者生成一个唯一的桶级密钥,以确保 Amazon KMS CloudTrail 事件捕获请求者。如果两个不同的 IAM 角色各自在同一时间段内将对象放入同一个桶,则会生成两个桶级密钥,因为每个 Amazon IAM 角色都被视为不同的请求者。此外,来自不同 IAM 会话的相同角色仍将被视为不同的请求者。例如,由十个 Amazon EC2 实例组成的 Amazon EMR 集群将有十个不同的 IAM 会话,即使每个会话承担相同的角色。在这种情况下,Amazon EMR 任务将在任何给定时间使用至少十个桶级密钥。Amazon KMS 节省的请求反映了请求者的数量、请求模式和所请求对象的相对年限。例如,减少请求者数量,在有限的时间窗口内请求多个对象,并使用相同的桶级密钥进行加密,仍然可以节省更多费用。
配置 S3 桶密钥时,桶中已存在的对象不使用 S3 桶密钥。要为现有对象配置 S3 桶密钥,可以使用 COPY 操作。有关更多信息,请参阅在对象级别配置 S3 桶密钥 。
Amazon S3 将仅为由同一 Amazon KMS key 加密的对象共享 S3 桶密钥。

配置 S3 桶密钥
您可以通过 Amazon S3 控制台、Amazon 软件开发工具包、Amazon CLI 或 REST API 将桶配置为使用 S3 桶密钥对新对象进行 SSE-KMS 加密。在您的桶上启用 S3 桶密钥后,使用其他指定 SSE-KMS 密钥上载的对象将使用其自己的 S3 桶密钥。无论您的 S3 桶密钥设置如何,您都可以在请求中包含带 true
或 false
值的 x-amz-server-side-encryption-bucket-key-enabled
标头,以覆盖桶设置。
在将桶配置为使用 S3 桶密钥之前,请查看 启用 S3 桶密钥之前需要注意的更改。
使用 Amazon S3 控制台配置 S3 桶密钥
创建新桶时,您可以将桶配置为使用 S3 桶密钥对新对象进行 SSE-KMS 加密。您还可以通过更新桶属性,从而将现有桶配置为使用 S3 桶密钥对新对象进行 SSE-KMS 加密。
有关更多信息,请参阅将桶配置为将 S3 桶密钥与 SSE-KMS 结合使用于新对象。
REST API、Amazon CLI 和 Amazon 软件开发工具包支持 S3 桶密钥
您可以使用 REST API、Amazon CLI 或 Amazon 软件开发工具包将桶配置为使用 S3 桶密钥对新对象进行 SSE-KMS 加密。您还可以在对象级别启用 S3 桶密钥。
有关更多信息,请参阅下列内容:
以下 API 操作对于 SSE-KMS 支持 S3 桶密钥:
-
-
ServerSideEncryptionRule
接受用于启用和禁用 S3 桶密钥的BucketKeyEnabled
参数。
-
-
-
ServerSideEncryptionRule
返回BucketKeyEnabled
的设置。
-
-
PutObject、CopyObject、CreateMultipartUpload 和 POST Object
-
x-amz-server-side-encryption-bucket-key-enabled
请求标头在对象级别启用或禁用 S3 桶密钥。
-
-
HeadObject、GetObject、UploadPartCopy、UploadPart 和 CompleteMultipartUpload
-
x-amz-server-side-encryption-bucket-key-enabled
响应标头指示是否为对象启用或禁用了 S3 桶密钥。
-
使用 Amazon CloudFormation
在 Amazon CloudFormation 中,AWS::S3::Bucket
资源包括名为 BucketKeyEnabled
的加密属性,您可以使用该属性来启用或禁用 S3 桶密钥。
有关更多信息,请参阅使用 Amazon CloudFormation。
启用 S3 桶密钥之前需要注意的更改
在启用 S3 桶密钥之前,请注意以下相关更改:
IAM 或 Amazon KMS 密钥策略
如果您现有的 Amazon Identity and Access Management(IAM)策略或 Amazon KMS 密钥策略使用您的对象 Amazon 资源名称(ARN)作为加密上下文来优化或限制对 KMS 密钥的访问,则这些策略将不使用 S3 桶密钥。S3 桶密钥使用桶 ARN 作为加密上下文。在启用 S3 桶密钥之前,请更新 IAM policy 或 Amazon KMS 密钥策略,以将桶 ARN 用作加密上下文。
有关加密上下文和 S3 桶密钥的更多信息,请参阅加密上下文。
Amazon KMS 的 CloudTrail 事件
启用 S3 桶密钥后,Amazon KMS CloudTrail 事件会记录桶 ARN 而不是对象 ARN。此外,您在日志中看到的 SSE-KMS 对象的 KMS CloudTrail 事件较少。因为 Amazon S3 中的密钥材料是有时间限制的,所以对 Amazon KMS 的请求减少。
将 S3 桶密钥与复制功能结合使用
您可以将 S3 桶密钥与同区域复制(SRR)和跨区域复制(CRR)结合使用。
当 Amazon S3 复制加密对象时,它通常会在目标桶中保留副本对象的加密设置。但是,如果源对象未加密且目标桶使用默认加密或 S3 桶密钥,则 Amazon S3 会使用目标桶的配置加密对象。
以下示例说明了 S3 桶密钥如何与复制结合使用。有关更多信息,请参阅复制使用服务器端加密(SSE-C、SSE-S3、SSE-KMS、DSSE-KMS)创建的对象。
例 示例 1 – 源对象使用 S3 桶密钥;目标桶使用原定设置加密
如果源对象使用 S3 桶密钥,但目标桶将原定设置加密与 SSE-KMS 结合使用,则副本对象将在目标桶中维护其 S3 桶密钥加密设置。目标桶仍将原定设置加密与 SSE-KMS 结合使用。
例 示例 2 – 源对象未加密;目标桶将 S3 桶密钥与 SSE-KMS 结合使用
如果源对象未加密,而目标桶将 S3 桶密钥与 SSE-KMS 结合使用,则将通过在目标桶中将 S3 桶密钥与 SSE-KMS 结合使用来加密复制的对象。这将导致源对象的 ETag
与副本对象的 ETag
不同。您必须更新使用 ETag
的应用程序以应对这种差异。
使用 S3 桶密钥
有关启用和使用 S3 桶密钥的更多信息,请参阅以下各部分: