为目录存储桶中的新对象上传指定具有 Amazon KMS 的服务器端加密(SSE-KMS) - Amazon Simple Storage Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

为目录存储桶中的新对象上传指定具有 Amazon KMS 的服务器端加密(SSE-KMS)

对于目录存储桶,要使用服务器端加密来加密您的数据,可以使用具有 Amazon S3 托管式密钥的服务器端加密(SSE-S3)(默认设置)或具有 Amazon Key Management Service(Amazon KMS)密钥的服务器端加密(SSE-KMS)。我们建议存储桶的默认加密使用所需的加密配置,并且不要在 CreateSession 请求或 PUT 对象请求中覆盖存储桶默认加密。然后,使用所需的加密设置自动对新对象进行加密。有关目录存储桶中加密覆盖行为的更多信息,请参阅 Specifying server-side encryption with Amazon KMS for new object uploads

默认情况下,所有 Amazon S3 存储桶都配置了加密,所有上传到 S3 存储桶的新对象都会自动静态加密。具有 Amazon S3 托管密钥的服务器端加密(SSE-S3)是 Amazon S3 中每个存储桶的默认加密配置。如果要为目录存储桶指定不同的加密类型,可以使用具有 Amazon Key Management Service(Amazon KMS)密钥的服务器端加密(SSE-KMS)。要使用 SSE-KMS 加密目录存储桶中的新对象,必须将具有 KMS 密钥(特别是 customer managed key)的 SSE-KMS 指定为目录存储桶的默认加密配置。Amazon 托管式密钥 (aws/s3) 不受支持。在存储桶的生命周期内,SSE-KMS 配置只能支持每个目录存储桶 1 个 customer managed key。在为 SSE-KMS 指定客户自主管理型密钥后,无法覆盖存储桶的 SSE-KMS 配置的客户自主管理型密钥。然后,当您使用 SSE-KMS 为新的对象指定服务器端加密设置时,必须确保加密密钥与您为目录存储桶的默认加密配置指定的客户自主管理型密钥相同。要对数据使用新的客户自主管理型密钥,我们建议使用新的客户自主管理型密钥将现有对象复制到新的目录存储桶中。

当您上传新对象或复制现有对象时,您可以应用加密。如果更改对象的加密,则会创建一个新对象来替换旧对象。

可以使用 REST API 操作、Amazon SDK 和 Amazon Command Line Interface(Amazon CLI)指定 SSE-KMS。

注意
  • 对于目录存储桶,加密覆盖行为如下所示:

    • 当您将 CreateSession 与 REST API 结合使用来验证可用区端点 API 请求并对其进行授权(CopyObjectUploadPartCopy 除外)时,仅当之前使用 SSE-KMS 指定了存储桶的默认加密时,才能将加密设置覆盖为 SSE-S3 或 SSE-KMS。

    • 当您将 CreateSession 与 Amazon CLI 或 Amazon SDK 结合使用来验证可用区端点 API 请求并对其进行授权(CopyObjectUploadPartCopy 除外)时,您根本无法覆盖加密设置。

    • 在发出 CopyObject 请求时,仅当之前使用 SSE-KMS 指定了存储桶的默认加密时,才能将加密设置覆盖为 SSE-S3 或 SSE-KMS。当您发出 UploadPartCopy 请求时,无法覆盖加密设置。

  • 您可以在 Amazon S3 中使用多区域 Amazon KMS keys。但是,Amazon S3 目前将多区域密钥视为单区域密钥,且不使用密钥的多区域特征。有关更多信息,请参阅 Amazon Key Management Service 开发人员指南中的使用多区域密钥

  • 如果您希望使用其它账户拥有的 KMS 密钥,您必须有权使用该密钥。有关 KMS 密钥的跨账户权限的更多信息,请参阅《Amazon Key Management Service 开发人员指南》中的创建其他账户可以使用的 KMS 密钥

注意

在存储桶的生命周期内,对于每个目录存储桶只支持 1 个 customer managed keyAmazon 托管式密钥 (aws/s3) 不受支持。将具有客户自主管理型密钥的 SSE-KMS 指定为存储桶的默认加密配置后,您无法更改存储桶的 SSE-KMS 配置的客户自主管理型密钥。

对于除 CopyObjectUploadPartCopy 之外的可用区端点(对象级)API 操作,可以通过 CreateSession 验证请求和为请求授权,以实现低延迟。我们建议存储桶的默认加密使用所需的加密配置,并且不要在 CreateSession 请求或 PUT 对象请求中覆盖存储桶默认加密。然后,使用所需的加密设置自动对新对象进行加密。要使用 SSE-KMS 加密目录存储桶中的新对象,必须将具有 KMS 密钥(特别是 customer managed key)的 SSE-KMS 指定为目录存储桶的默认加密配置。然后,在为可用区端点 API 操作创建会话时,将在会话期间使用 SSE-KMS 和 S3 存储桶密钥自动加密和解密新对象。有关目录存储桶中加密覆盖行为的更多信息,请参阅 Specifying server-side encryption with Amazon KMS for new object uploads

在使用 REST API 的可用区端点 API 调用(CopyObjectUploadPartCopy 除外)中,您无法覆盖 CreateSession 请求中加密设置(x-amz-server-side-encryptionx-amz-server-side-encryption-aws-kms-key-idx-amz-server-side-encryption-contextx-amz-server-side-encryption-bucket-key-enabled)的值。无需在可用区端点 API 调用中显式指定这些加密设置值,Amazon S3 将使用 CreateSession 请求中的加密设置值来保护目录存储桶中的新对象。

注意

当您使用 Amazon CLI 或 Amazon SDK 时,对于 CreateSession,会话令牌会自动刷新,以避免在会话到期时服务中断。Amazon CLI 或 Amazon SDK 将存储桶的默认加密配置用于 CreateSession 请求。不支持覆盖 CreateSession 请求中的加密设置值。此外,在可用区端点 API 调用(CopyObjectUploadPartCopy 除外)中,不支持覆盖 CreateSession 请求中加密设置的值。

对于 CopyObject,要使用 SSE-KMS 加密目录存储桶中新的对象副本,必须将具有 KMS 密钥(特别是 customer managed key)的 SSE-KMS 指定为目录存储桶的默认加密配置。然后,当您使用 SSE-KMS 为新的对象副本指定服务器端加密设置时,必须确保加密密钥与您为目录存储桶的默认加密配置指定的客户自主管理型密钥相同。对于 UploadPartCopy,要使用 SSE-KMS 加密目录存储桶中新的对象分段副本,必须将具有 KMS 密钥(特别是 customer managed key)的 SSE-KMS 指定为目录存储桶的默认加密配置。无法在 UploadPartCopy 请求标头中使用 SSE-KMS 为新的对象分段副本指定服务器端加密设置。此外,您在 CreateMultipartUpload 请求中提供的加密设置必须与目标存储桶的默认加密配置相匹配。

支持 SSE-KMS 的 Amazon S3 REST API 操作

目录存储桶中的以下对象级 REST API 操作接受 x-amz-server-side-encryptionx-amz-server-side-encryption-aws-kms-key-idx-amz-server-side-encryption-context 请求标头。

  • CreateSession:当您使用可用区端点(对象级)API 操作(CopyObject 和 UploadPartCopy 除外)时,可以指定这些请求标头。

  • PutObject – 使用 PUT API 操作上传数据时,您可以指定这些请求标头。

  • CopyObject – 复制对象时,您同时具有源对象和目标对象。如果使用 CopyObject 操作传递 SSE-KMS 标头,这些标头仅应用于目标对象。

  • CreateMultipartUpload – 使用分段上传 API 操作上传大型对象时,可以指定这些标头。您可以在 CreateMultipartUpload 请求中指定这些标头。

使用服务器端加密存储对象时,以下 REST API 操作的响应标头将返回 x-amz-server-side-encryption 标头。

重要
  • 如果您针对受 Amazon KMS 保护的对象发出 GETPUT 请求时未使用传输层安全性协议(TLS)或签名版本 4,则所有这些请求都将失败。

  • 如果对象使用 SSE-KMS,则不应对 GET 请求和 HEAD 请求发送加密请求标头,否则将显示 HTTP 400 BadRequest 错误。

加密上下文(x-amz-server-side-encryption-context

如果您指定 x-amz-server-side-encryption:aws:kms,Amazon S3 API 将支持您可选提供带有 x-amz-server-side-encryption-context 标头的显式加密上下文。对于目录存储桶,加密上下文是一组键值对,其中包含有关数据的上下文信息。该值必须与默认加密上下文 [即存储桶的 Amazon 资源名称(ARN)] 相匹配。不支持额外的加密上下文值。

有关目录存储桶中加密上下文的信息,请参阅加密上下文。有关加密上下文的一般信息,请参阅 Amazon Key Management Service 开发人员指南中的 Amazon Key Management Service 概念 - 加密上下文

Amazon KMS 密钥 ID(x-amz-server-side-encryption-aws-kms-key-id

您可以使用 x-amz-server-side-encryption-aws-kms-key-id 标头指定用于保护数据的客户自主管理型密钥的 ID。

在存储桶的生命周期内,SSE-KMS 配置只能支持每个目录存储桶 1 个 customer managed keyAmazon 托管式密钥 (aws/s3) 不受支持。此外,在为 SSE-KMS 指定客户自主管理型密钥后,无法覆盖存储桶的 SSE-KMS 配置的客户自主管理型密钥。

可以通过以下方式,确定您为存储桶的 SSE-KMS 配置指定的客户自主管理型密钥:

  • 您发出 HeadObject API 操作请求以查找响应中 x-amz-server-side-encryption-aws-kms-key-id 的值。

要对数据使用新的客户自主管理型密钥,我们建议使用新的客户自主管理型密钥将现有对象复制到新的目录存储桶中。

有关目录存储桶中加密上下文的信息,请参阅Amazon KMS keys

S3 桶密钥(x-amz-server-side-encryption-aws-bucket-key-enabled

始终为目录存储桶中的 GETPUT 操作启用 S3 存储桶密钥,并且不能禁用。当您通过 CopyObjectUploadPartCopy批量操作中的 Copy 操作import 任务,将 SSE-KMS 加密的对象从通用存储桶复制到目录存储桶、从目录存储桶复制到通用存储桶,或在目录存储桶之间复制时,不支持 S3 存储桶密钥。在这种情况下,每次对 KMS 加密的对象发出复制请求时,Amazon S3 都会调用 Amazon KMS。有关目录存储桶中 S3 存储桶密钥的信息,请参阅加密上下文

注意

当您使用 Amazon CLI 时,对于 CreateSession,会话令牌会自动刷新,以避免在会话到期时服务中断。不支持覆盖 CreateSession 请求的加密设置值。此外,在可用区端点 API 调用(CopyObjectUploadPartCopy 除外)中,不支持覆盖 CreateSession 请求中加密设置的值。

要使用 SSE-KMS 加密目录存储桶中的新对象,必须将具有 KMS 密钥(特别是客户自主管理型密钥)的 SSE-KMS 指定为目录存储桶的默认加密配置。然后,在为可用区端点 API 操作创建会话时,将在会话期间使用 SSE-KMS 和 S3 存储桶密钥自动加密和解密新对象。

要使用以下示例 Amazon CLI 命令,请将 user input placeholders 替换为您自己的信息。

当您上传新对象或复制现有对象时,可以指定使用具有 Amazon KMS 密钥的服务器端加密来加密数据。为此,请使用 put-bucket-encryption 命令将目录存储桶的默认加密配置设置为 SSE-KMS (aws:kms)。具体而言,就是将 --server-side-encryption aws:kms 标头添加到请求。使用 --ssekms-key-id example-key-id 添加您创建的客户托管式 Amazon KMS 密钥。如果您指定 --server-side-encryption aws:kms,则必须提供客户自主管理型密钥的 Amazon KMS 密钥 ID。目录存储桶不使用 Amazon 托管式密钥。有关示例命令,请参阅 使用 Amazon CLI

然后,当您使用以下命令上传新对象时,Amazon S3 默认情况下使用存储桶默认加密设置来加密该对象。

aws s3api put-object --bucket bucket-base-name--zone-id--x-s3 --key example-object-key --body filepath

您不需要在可用区端点 API 操作命令中显式添加 -\-bucket-key-enabled。始终为目录存储桶中的 GETPUT 操作启用 S3 存储桶密钥,并且不能禁用。当您通过 CopyObjectUploadPartCopy批量操作中的 Copy 操作import 任务,将 SSE-KMS 加密的对象从通用存储桶复制到目录存储桶、从目录存储桶复制到通用存储桶,或在目录存储桶之间复制时,不支持 S3 存储桶密钥。在这种情况下,每次对 KMS 加密的对象发出复制请求时,Amazon S3 都会调用 Amazon KMS。

可以将对象从源存储桶(例如通用存储桶)复制到新的存储桶(例如目录存储桶),然后对目标对象使用 SSE-KMS 加密。为此,请使用 put-bucket-encryption 命令将目标存储桶(例如目录存储桶)的默认加密配置设置为 SSE-KMS (aws:kms)。有关示例命令,请参阅 使用 Amazon CLI。然后,当您使用以下命令复制对象时,Amazon S3 默认情况下使用存储桶默认加密设置来加密该对象。

aws s3api copy-object --copy-source amzn-s3-demo-bucket/example-object-key --bucket bucket-base-name--zone-id--x-s3 --key example-object-key

使用 Amazon SDK 时,您可以请求 Amazon S3 使用 Amazon KMS keys 进行服务器端加密。以下示例展示了如何将 SSE-KMS 与适用于 Java 和 .NET 的 Amazon SDK 结合使用。有关其它 SDK 的信息,请参阅 Amazon 开发人员中心上的示例代码和库

注意

当您使用 Amazon SDK 时,对于 CreateSession,会话令牌会自动刷新,以避免在会话到期时服务中断。不支持覆盖 CreateSession 请求的加密设置值。此外,在可用区端点 API 调用(CopyObjectUploadPartCopy 除外)中,不支持覆盖 CreateSession 请求中加密设置的值。

要使用 SSE-KMS 加密目录存储桶中的新对象,必须将具有 KMS 密钥(特别是客户自主管理型密钥)的 SSE-KMS 指定为目录存储桶的默认加密配置。然后,在为可用区端点 API 操作创建会话时,将在会话期间使用 SSE-KMS 和 S3 存储桶密钥自动加密和解密新对象。

有关使用 Amazon SDK 将目录存储桶的默认加密配置设置为 SSE-KMS 的更多信息,请参阅使用 Amazon SDK

重要

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

有关创建客户托管密钥的更多信息,请参阅 Amazon Key Management Service 开发人员指南中的对 Amazon KMS API 进行编程