使用 AWS KMS (SSE-KMS) 指定服务器端加密 - Amazon Simple Storage Service
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

使用 AWS KMS (SSE-KMS) 指定服务器端加密

创建对象时,可以指定使用借助 WS Key Management Service (AWS KMS) 客户主密钥 (CMK) 进行的服务器端加密来加密您的数据。当您要上传新对象或复制现有对象时,也是这种情况。这种加密称为 SSE-KMS。

您可以使用 S3 控制台、REST API、AWS 开发工具包和 AWS CLI 指定 SSE-KMS。有关更多信息,请参阅以下主题。

本主题描述如何使用 Amazon S3 控制台设置或更改对象的加密类型。

注意

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

添加或更改对象的加密

  1. 登录 AWS 管理控制台,并通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/

  2. Bucket (存储桶) 列表中,选择包含对象的存储桶的名称。

  3. Objects (对象) 列表中,选择要为其添加或更改加密的对象的名称。

    Object overview (对象概述) 随即打开,其中显示对象的属性。

  4. Server-side encryption settings (服务器端加密设置) 下,选择 Edit (编辑)

    Edit server-side encryption (编辑服务器端加密) 页随即打开

  5. 要为对象启用服务器端加密,请在 Server-side encryption (服务器端加密) 下选择 Enable (启用)

  6. Encryption key type (加密密钥类型) 下,选择 AWS Key Management Service key (SSE-KMS) (AWS Key Management Service 密钥 (SSE-KMS))

    重要

    如果您将 AWS KMS 选项用于默认加密配置,则您将受到 AWS KMS 的 RPS(每秒请求数)限制。有关 AWS KMS 限制以及如何请求提高限制的更多信息,请参阅 AWS KMS 限制

  7. AWS KMS key (AWS KMS 密钥) 下,选择以下选项之一:

    • AWS managed key (aws/s3) (AWS 托管密钥 (aws/s3))

    • Choose from your KMS master keys (从您的 KMS 主密钥中选择),然后选择 KMS master key (KMS 主密钥)

    • Enter KMS master key ARN (输入 KMS 主密钥 ARN),然后输入您的 AWS KMS 密钥 ARN。

    重要

    您只能使用在存储桶所在的 AWS 区域中启用的 KMS CMK。当您选择 Choose from your KMS master keys (从您的 KMS 主密钥中选择) 时,S3 控制台每个区域仅列出 100 个 KMS CMK。如果您在同一区域中有超过 100 个 CMK,则只会在 S3 控制台中看到前 100 个 CMK。若要使用控制台中未列出的 KMS CMK,请选择自定义 KMS ARN,然后输入相应的 KMS CMK ARN。

    当您在 Amazon S3 中使用 AWS KMS CMK 进行服务器端加密时,您必须选择与存储桶在同一区域中启用的 CMK。此外,Amazon S3 仅支持对称 CMK,不支持非对称 CMK。有关更多信息,请参阅《AWS Key Management Service 开发人员指南》中的使用对称和非对称密钥

    有关创建 AWS KMS CMK 的更多信息,请参阅《AWS Key Management Service 开发人员指南》中的创建密钥。有关将 AWS KMS 与 Amazon S3 结合使用的更多信息,请参阅使用在 AWS Key Management Service 中存储 CMK 的服务器端加密 (SSE-KMS) 保护数据

  8. 选择保存更改

注意

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

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

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

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

  • x-amz-server-side-encryption-context

  • x-amz-server-side-encryption-bucket-key-enabled

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

  • PUT 对象 — 使用 PUT API 上传数据时,您可以指定这些请求标头。

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

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

  • 开始分段上传 — 使用分段上传 API 上传大型对象时,可以指定这些标头。您可以在启动请求中指定这些标头。

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

重要
  • 如果您不让针对受 AWS KMS 保护的对象的所有 GET 和 PUT 请求使用安全套接字语言 (SSL) 或 Signature Version 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 S3 中,对象或存储桶 Amazon 资源名称 (ARN) 通常用作加密上下文。如果您在不启用 S3 存储桶密钥的情况下使用 SSE-KMS,则将对象 ARN 用作加密上下文,例如,arn:aws:s3:::object_ARN。但是,如果您在启用 S3 存储桶密钥的情况下使用 SSE-KMS,则将存储桶 ARN 用于加密上下文,例如,arn:aws:s3:::bucket_ARN

有关 Amazon S3 中加密上下文的信息,请参阅加密上下文。有关加密上下文的一般信息,请参阅《AWS Key Management Service 开发人员指南》中的 AWS Key Management Service 概念 - 加密上下文

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

您可以使用 x-amz-server-side-encryption-aws-kms-key-id 标头指定用于保护数据的客户托管 CMK 的 ID。如果您指定 x-amz-server-side-encryption:aws:kms,但未提供 x-amz-server-side-encryption-aws-kms-key-id,Amazon S3 将使用 AWS KMS 中的 AWS 托管 CMK 来保护数据。如果要使用客户托管 AWS KMS CMK,则必须提供客户托管 CMK 的 x-amz-server-side-encryption-aws-kms-key-id

重要

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

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

您可以使用 x-amz-server-side-encryption-aws-bucket-key-enabled 请求标头在对象级别启用或禁用 S3 存储桶密钥。S3 存储桶密钥可以通过减少从 Amazon S3 到 AWS KMS 的请求流量,来降低您的 AWS KMS 请求成本。有关更多信息,请参阅 使用 Amazon S3 存储桶密钥降低 SSE-KMS 的成本

如果您指定 x-amz-server-side-encryption:aws:kms,但未提供 x-amz-server-side-encryption-aws-bucket-key-enabled,则您的对象将使用目标存储桶的 S3 存储桶密钥设置来加密对象。有关更多信息,请参阅 使用 REST API、AWS 开发工具包或 AWS CLI 在对象级别配置 S3 存储桶密钥

使用 AWS 开发工具包时,您可以请求 Amazon S3 使用 AWS Key Management Service (AWS KMS) 客户主密钥 (CMK)。此部分提供的示例演示了如何使用适用于 Java 和 .NET 的 AWS 开发工具包。有关其他软件开发工具包的信息,请转到示例代码和库

重要

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

复制操作

在复制对象时,您将添加相同的请求属性(ServerSideEncryptionMethodServerSideEncryptionKeyManagementServiceKeyId)来请求 Amazon S3 使用 AWS KMS CMK。有关复制对象的更多信息,请参阅 复制对象

Put 操作

Java

当使用适用于 Java 的 AWS 开发工具包上传对象时,您可以通过添加 SSEAwsKeyManagementParams 属性请求 Amazon S3 使用 AWS KMS CMK,如以下请求所示:

PutObjectRequest putRequest = new PutObjectRequest(bucketName, keyName, file).withSSEAwsKeyManagementParams(new SSEAwsKeyManagementParams());

在这种情况下,Amazon S3 使用 AWS 托管 CMK(请参阅使用服务器端加密与存储在 AWS KMS 中的 CMK)。您可以选择创建对称客户托管 CMK 并在请求中指定该密钥。

PutObjectRequest putRequest = new PutObjectRequest(bucketName, keyName, file).withSSEAwsKeyManagementParams(new SSEAwsKeyManagementParams(keyID));

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

有关上传对象的工作代码示例,请参阅以下主题。您将需要更新这些代码示例并提供加密信息,如上述代码片段所示。

.NET

当使用适用于 .NET 的 AWS 开发工具包上传对象时,您可以通过添加 ServerSideEncryptionMethod 属性请求 Amazon S3 使用 AWS KMS CMK,如以下请求所示:

PutObjectRequest putRequest = new PutObjectRequest { BucketName = bucketName, Key = keyName, // other properties. ServerSideEncryptionMethod = ServerSideEncryptionMethod.AWSKMS };

在这种情况下,Amazon S3 使用 AWS 托管 CMK。有关更多信息,请参阅 使用在 AWS Key Management Service 中存储 CMK 的服务器端加密 (SSE-KMS) 保护数据。您可以选择创建自己的对称客户托管 CMK 并在请求中指定该密钥。

PutObjectRequest putRequest1 = new PutObjectRequest { BucketName = bucketName, Key = keyName, // other properties. ServerSideEncryptionMethod = ServerSideEncryptionMethod.AWSKMS, ServerSideEncryptionKeyManagementServiceKeyId = keyId };

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

有关上传对象的工作代码示例,请参阅以下主题。您将需要更新这些代码示例并提供加密信息,如上述代码片段所示。

预签名 URL

Java

在为使用 AWS KMS CMK 加密的对象创建预签名 URL 时,您必须显式指定 Signature Version 4。

ClientConfiguration clientConfiguration = new ClientConfiguration(); clientConfiguration.setSignerOverride("AWSS3V4SignerType"); AmazonS3Client s3client = new AmazonS3Client( new ProfileCredentialsProvider(), clientConfiguration); ...

有关代码示例,请参阅 使用预签名 URL 共享对象

.NET

在为使用 AWS KMS CMK 加密的对象创建预签名 URL 时,您必须显式指定 Signature Version 4。

AWSConfigs.S3Config.UseSignatureVersion4 = true;

有关代码示例,请参阅 使用预签名 URL 共享对象