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

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

创建对象时,可以指定使用借助 Amazon Key Management Service (Amazon KMS) 密钥进行的服务器端加密来加密您的数据。这种加密称为 SSE-KMS。当您上载新对象或复制现有对象时,您可以应用加密。

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

注意

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

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

注意

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

添加或更改对象的加密

  1. 登录到 Amazon Web Services Management Console,然后通过以下网址打开 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 (加密密钥类型) 下,请选择 Amazon Key Management Service key (SSE-KMS) (Amazon Key Management Service 密钥(SSE-KMS))

    重要

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

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

    • Amazon 托管密钥 (aws/s3)

    • 从 Amazon KMS keys 中选择,然后选择 KMS key (KMS 密钥)

    • 输入 KMS 主密钥 ARN,然后输入您的 Amazon KMS 密钥 Amazon Resource Name (ARN)。

    重要

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

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

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

  8. 选择保存更改

注意

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

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

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

  • 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 操作上传数据时,您可以指定这些请求标头。

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

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

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

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

重要
  • 如果您不让针对受 Amazon KMS 保护的对象的所有 GET 和 PUT 请求使用安全套接字层 (SSL)、传输层安全性 (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 S3 会自动使用对象或存储桶 Amazon Resource Name (ARN) 作为加密上下文对。如果您在不启用 S3 Bucket 密钥的情况下使用 SSE-KMS,则将对象 ARN 用作加密上下文,例如,arn:aws:s3:::object_ARN。但是,如果您在启用 S3 存储桶密钥的情况下使用 SSE-KMS,则将存储桶 ARN 用于加密上下文,例如 arn:aws:s3:::bucket_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,但未提供 x-amz-server-side-encryption-aws-kms-key-id,Amazon S3 将使用 Amazon 托管密钥来保护数据。如果要使用客户托管密钥,则必须提供客户托管密钥的 x-amz-server-side-encryption-aws-kms-key-id 标头。

重要

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

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

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

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

使用 Amazon 开发工具包时,您可以请求 Amazon S3 使用 Amazon KMS keys。此部分提供的示例演示了如何使用适用于 Java 和 .NET 的 Amazon 开发工具包。有关其他 SDK 的信息,请转到示例代码和库

重要

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

复制操作

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

Put 操作

Java

当使用 Amazon SDK for Java 上传对象时,您可以通过添加 SSEAwsKeyManagementParams 属性请求 Amazon S3 使用 Amazon KMS key,如以下请求所示。

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

在这种情况下,Amazon S3 使用 Amazon 托管密钥(请参阅使用具有 Amazon Key Management Service (SSE-KMS) 的服务器端加密保护数据。您可以选择创建对称 KMS 密钥并在请求中指定该密钥。

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

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

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

.NET

当使用 Amazon SDK for .NET 上传对象时,您可以通过添加 ServerSideEncryptionMethod 属性请求 Amazon S3 使用 Amazon KMS key,如以下请求所示。

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

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

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

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

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

预签名 URL

Java

在为使用 Amazon KMS key 加密的对象创建预签名 URL 时,您必须显式指定签名版本 4。

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

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

.NET

在为使用 Amazon KMS key 加密的对象创建预签名 URL 时,您必须显式指定签名版本 4。

AWSConfigs.S3Config.UseSignatureVersion4 = true;

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