指定具有 Amazon KMS 密钥的双层服务器端加密(DSSE-KMS) - Amazon Simple Storage Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

指定具有 Amazon KMS 密钥的双层服务器端加密(DSSE-KMS)

重要

Amazon S3 现在将具有 Amazon S3 托管密钥的服务器端加密(SSE-S3)作为 Amazon S3 中每个存储桶的基本加密级别。从 2023 年 1 月 5 日起,上传到 Amazon S3 的所有新对象都将自动加密,不会产生额外费用,也不会影响性能。S3 存储桶默认加密配置和上传的新对象的自动加密状态可在 Amazon CloudTrail 日志、S3 清单、S3 Storage Lens 存储统计管理工具、Amazon S3 控制台中获得,并可用作 Amazon Command Line Interface 和 Amazon SDK 中的附加 Amazon S3 API 响应标头。有关更多信息,请参阅默认加密常见问题解答

默认情况下,所有 Amazon S3 存储桶都配置了加密,所有上传到 S3 存储桶的新对象都会自动静态加密。具有 Amazon S3 托管密钥的服务器端加密(SSE-S3)是 Amazon S3 中每个存储桶的默认加密配置。要使用其他类型的加密,您可以指定要在 S3 PUT 请求中使用的服务器端加密类型,也可以在目标存储桶中设置默认加密配置。

如果您想在 PUT 请求中指定不同的加密类型,则可以使用具有 Amazon Key Management Service(Amazon KMS)密钥的服务器端加密(SSE-KMS)、具有 Amazon KMS 密钥的双层服务器端加密(DSSE-KMS)或具有客户提供的密钥的服务器端加密(SSE-C)。如果您想在目标存储桶中设置不同的默认加密配置,则可以使用 SSE-KMS 或 DSSE-KMS。

当您上传新对象或复制现有对象时,您可以应用加密。

您可以使用 Amazon S3 控制台、Amazon S3 REST API 和 Amazon Command Line Interface(Amazon CLI)指定 DSSE-KMS。有关更多信息,请参阅以下主题。

注意

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

注意

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

本节介绍如何使用 Amazon S3 控制台,将对象的加密类型设置或更改为使用具有 Amazon Key Management Service(Amazon KMS)密钥的双层服务器端加密(DSSE-KMS)。

注意

如果更改对象的加密方法,则会创建一个新对象来替换旧对象。如果启用 S3 版本控制,则会创建对象的新版本,而现有对象将变为旧版本。更改属性的角色也会成为新对象(或对象版本)的拥有者。

添加或更改对象的加密
  1. 登录到 Amazon Web Services Management Console,然后通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/

  2. 在左侧导航窗格中,选择存储桶

  3. 存储桶列表中,选择包含您想要加密的对象的存储桶的名称。

  4. 对象列表中,选择要为其添加或更改加密的对象旁边的复选框。

    将显示对象的详细信息页面,其中有几个部分显示您的对象的属性。

  5. 选择属性选项卡。

  6. 向下滚动到默认加密部分,然后选择编辑

    编辑默认加密页面随即打开。

  7. 加密类型下,选择具有 Amazon Key Management Service 密钥的双层服务器端加密(DSSE-KMS)

  8. Amazon KMS 密钥下,执行以下操作以选择您的 KMS 密钥:

    • 要从可用的 KMS 密钥列表中进行选择,请选择从您的 Amazon KMS keys 中进行选择,然后从可用密钥的列表中选择您的 KMS 密钥

      Amazon 托管式密钥(aws/s3)和您的客户自主管理型密钥都显示在此列表中。有关客户自主管理型密钥的更多信息,请参阅《Amazon Key Management Service 开发人员指南》中的客户密钥和 Amazon 密钥

    • 要输入 KMS 密钥 ARN,请选择输入 Amazon KMS key ARN,然后在显示的字段中输入您的 KMS 密钥 ARN。

    • 要在 Amazon KMS 控制台中创建新的客户自主管理型密钥,请选择创建 KMS 密钥

      有关创建 Amazon KMS key 的更多信息,请参阅《Amazon Key Management Service 开发人员指南》中的创建密钥

    重要

    您只能使用与存储桶所在相同的 Amazon Web Services 区域中可用的 KMS 密钥。Amazon S3 控制台仅列出与存储桶位于同一区域中的前 100 个 KMS 密钥。要使用未列出的 KMS 密钥,您必须输入 KMS 密钥 ARN。如果您希望使用其他账户拥有的 KMS 密钥,则必须首先有权使用该密钥,然后必须输入相应的 KMS 密钥 ARN。

    Amazon S3 仅支持对称加密 KMS 密钥,不支持非对称 KMS 密钥。有关更多信息,请参阅《Amazon Key Management Service 开发人员指南》中的确定非对称 KMS 密钥

  9. 对于存储桶密钥,选择禁用。DSSE-KMS 不支持 S3 存储桶密钥。

  10. 选择 Save Changes(保存更改)。

注意

此操作将加密应用于所有指定的对象。加密文件夹时,请等待保存操作完成,然后再将新对象添加到文件夹。

创建对象时(即上传新对象或复制现有对象时),您可以指定使用具有 Amazon KMS keys 的双层服务器端加密(DSSE-KMS)来加密数据。为此,请将 x-amz-server-side-encryption 标头添加到请求。将标头的值设置为加密算法 aws:kms:dsse。Amazon S3 通过返回响应标头 x-amz-server-side-encryption 来确认已使用 DSSE-KMS 加密来存储对象。

如果您指定值为 aws:kms:dssex-amz-server-side-encryption 标头,则还可以使用以下请求标头:

  • x-amz-server-side-encryption: AES256 | aws:kms | aws:kms:dsse

  • x-amz-server-side-encryption-aws-kms-key-id: SSEKMSKeyId

支持 DSSE-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 请求标头。

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

  • CopyObject – 复制对象时,您同时具有源对象和目标对象。如果使用 CopyObject 操作传递 DSSE-KMS 标头,它们仅应用于目标对象。复制现有对象时,不论源对象是否已经加密,都不会加密目标对象,除非您显式请求服务器端加密。

  • POST 对象 – 使用 POST 操作上传对象时,可在表单字段(而不是在请求标头)中提供相同的信息。

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

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

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

  • 如果对象使用 DSSE-KMS,则不应对 GET 请求和 HEAD 请求发送加密请求标头,否则您将得到 HTTP 400(错误请求)错误。

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

如果您指定 x-amz-server-side-encryption:aws:kms:dsse,Amazon S3 API 将支持带有 x-amz-server-side-encryption-context 标头的加密上下文。加密上下文是一组键值对,其中包含有关数据的其他上下文信息。

Amazon S3 自动使用对象的 Amazon 资源名称(ARN)作为加密上下文对;例如 arn:aws:s3:::object_ARN

您可以选择使用 x-amz-server-side-encryption-context 标头提供其他的加密上下文对。但是,由于加密上下文未加密,请确保它不包含敏感信息。Amazon S3 将此额外的密钥对与默认加密上下文一起存储。

有关 Amazon S3 中加密上下文的信息,请参阅 加密上下文。有关加密上下文的一般信息,请参阅 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。如果您指定 x-amz-server-side-encryption:aws:kms:dsse 标头但未提供 x-amz-server-side-encryption-aws-kms-key-id 标头,Amazon S3 将使用 Amazon 托管式密钥(aws/s3)来保护数据。如果要使用客户托管密钥,则必须提供客户托管密钥的 x-amz-server-side-encryption-aws-kms-key-id 标头。

重要

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

当您上传新对象或复制现有对象时,可以指定使用 DSSE-KMS 来加密数据。为此,请将 --server-side-encryption aws:kms:dsse 参数添加到请求。使用 --ssekms-key-id example-key-id 参数添加您创建的客户自主管理型 Amazon KMS 密钥。如果您指定 --server-side-encryption aws:kms:dsse,但未提供 Amazon KMS 密钥 ID,则 Amazon S3 将使用 Amazon 托管式密钥(aws/s3)。

aws s3api put-object --bucket DOC-EXAMPLE-BUCKET --key example-object-key --server-side-encryption aws:kms:dsse --ssekms-key-id example-key-id --body filepath

您可以通过将未加密的对象复制回原位来加密该对象以使用 DSSE-KMS。

aws s3api copy-object --bucket DOC-EXAMPLE-BUCKET --key example-object-key --body filepath --bucket DOC-EXAMPLE-BUCKET --key example-object-key --sse aws:kms:dsse --sse-kms-key-id example-key-id --body filepath