Amazon Simple Storage Service
开发人员指南 (API Version 2006-03-01)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

使用具有 AWS KMS 托管密钥的服务器端加密 (SSE-KMS) 保护数据

服务器端加密是为了保护静态数据。AWS Key Management Service (AWS KMS) 是一项将安全、高度可用的硬件和软件结合起来,提供可扩展到云的密钥管理系统的服务。AWS KMS 使用客户主密钥 (CMK) 加密您的 Amazon S3 对象。可以通过 IAM 控制台中的“Encryption Keys”部分或通过 AWS KMS API 使用 AWS KMS 来集中创建加密密钥,定义策略以控制密钥的使用方法,以及审核密钥使用情况来证明它们使用得当。您可以利用这些密钥来保护您在 Amazon S3 存储桶中的数据。

首次向区域中的存储桶添加 SSE-KMS 加密的对象时,将自动为您创建一个默认 CMK。除非您选择了使用 AWS Key Management Service 单独创建的 CMK,否则此密钥将用于 SSE-KMS 加密。创建您自己的 CMK 可为您提供更大灵活性,包括创建、轮换、禁用和定义访问控制,以及审核用于保护数据的加密密钥的能力。

有关更多信息,请参阅什么是 AWS Key Management Service? (在 AWS Key Management Service Developer Guide 中)。如果您使用 AWS KMS,则使用 AWS-KMS 密钥会产生额外费用。有关更多信息,请参阅 AWS Key Management Service 定价

注意

如果您要上传或访问使用 SSE-KMS 加密的对象,则需使用 AWS 签名版本 4 来提高安全性。有关如何使用 AWS SDK 执行此操作的更多信息,请参阅在请求身份验证中指定签名版本.

SSE-KMS 的要点是:

  • 您可以选择自行创建和管理加密密钥,也可以选择使用由服务按区域级别为某个客户生成的唯一的默认服务密钥。

  • 响应中的 ETag 不是对象数据的 MD5。

  • 用于加密您的数据的数据密钥也会被加密并与它们保护的数据一起存储。

  • 可以从 IAM 控制台创建、轮换或禁用可审核的主密钥。

  • AWS KMS 中的安全控制可帮助您满足与加密相关的合规性要求。

Amazon S3 支持存储桶策略,如果您要对所有存储在存储桶中的对象执行服务器端加密,则可以使用这些策略。例如,如果请求不包含用于请求服务器端加密 (SSE-KMS) 的 s3:PutObject 标头,则下面的存储桶策略将拒绝所有人的上传对象 (x-amz-server-side-encryption) 权限。

Copy
{ "Version":"2012-10-17", "Id":"PutObjPolicy", "Statement":[{ "Sid":"DenyUnEncryptedObjectUploads", "Effect":"Deny", "Principal":"*", "Action":"s3:PutObject", "Resource":"arn:aws-cn:s3:::YourBucket/*", "Condition":{ "StringNotEquals":{ "s3:x-amz-server-side-encryption":"aws:kms" } } } ] }

Amazon S3 也支持 s3:x-amz-server-side-encryption-aws-kms-key-id 条件键,您可以使用该条件键来获取特定的对象加密 KMS 密钥。您在策略中指定的 KMS 密钥必须使用 arn:aws-cn:kms:region:acct-id:key/key-id" 格式。

注意

在上传对象时,您可以使用 x-amz-server-side-encryption-aws-kms-key-id 标头指定 KMS 密钥。如果请求中没有该标头,则 Amazon S3 采用默认 KMS 密钥。无论如何,Amazon S3 用于对象加密的 KMS 密钥 ID 必须与策略中的 KMS 密钥 ID 匹配,否则 Amazon S3 会拒绝请求。

重要

如果针对受 AWS KMS 保护的对象的所有 GET 和 PUT 请求不是通过 SSL 或通过使用 SigV4 发出的,则这些请求将会失败。

SSE-KMS 仅加密对象数据。不会加密任何对象元数据。

在 Amazon S3 管理控制台中使用 AWS Key Management Service

有关在 Amazon S3 管理控制台中使用 KMS 托管加密密钥的更多信息,请参阅 Amazon Simple Storage Service 用户指南 中的上传 S3 对象

Amazon S3 中针对 AWS Key Management Service 的 API 支持

对象创建 REST API (请参阅 使用 REST API 在 Amazon S3 中指定 AWS Key Management Service) 提供了一个请求标头 x-amz-server-side-encryption,您可以使用该标头和值 aws:kms 来请求 SSE-KMS。此外还有 x-amz-server-side-encryption-aws-kms-key-id,它指定用于对象的 AWS KMS 主加密密钥的 ID。Amazon S3 API 还使用 x-amz-server-side-encryption-context 标头支持加密上下文。

加密上下文可以是您希望的任何值,前提是该标头遵循 Base64 编码的 JSON 格式。但是,由于加密上下文不会加密并且在 AWS CloudTrail 记录打开时会被记录,因此加密上下文不应包含敏感信息。我们进一步建议您的上下文描述所加密或解密的数据,以便让您可以更好地了解 AWS KMS 生成的 CloudTrail 事件。有关更多信息,请参阅 AWS Key Management Service Developer Guide 中的加密上下文

此外,Amazon S3 还可为预定义密钥 aws:s3:arn 追加等于对象的 ARN (用于您提供的加密上下文) 的值。这仅在密钥 aws:s3:arn 尚不存在于您提供的加密上下文中时发生,在这种情况下,此预定义密钥在 Amazon S3 处理您的 Put 请求时追加。如果此 aws:s3:arn 密钥已存在于您的加密上下文中,则不会再次将它追加到您的加密上下文。

加密上下文包含此预定义密钥则意味着,您可以在 CloudTrail 中跟踪相关请求,这样您始终能够查看哪个 S3 对象的 ARN 与哪个加密密钥一起使用。此外,作为您的加密上下文的一部分的此预定义密钥保证了不同的 S3 对象之间拥有不同的加密上下文,从而为您的对象提供更高的安全性。系统将验证您的完全加密上下文是否有等于对象的 ARN 的值。

以下 Amazon S3 API 支持这些请求标头。

  • PUT 操作 - 使用 PUT API 上传数据 (请参阅 PUT Object) 时,可以指定这些请求标头。

  • Initiate Multipart Upload - 使用分段上传 API 上传大型对象时,可以指定这些标头。可以在启动请求中指定这些标头 (请参阅 Initiate Multipart Upload)。

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

  • COPY 操作 - 复制对象 (请参阅 PUT Object - Copy) 时,您同时具有源对象和目标对象。如果使用 COPY 操作传递 SSE-KMS 标头,它们将仅应用于目标对象。

AWS 软件开发工具包还提供了一个包装程序 API,您可以使用它在 Amazon S3 中请求 SSE-KMS。