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

使用具有 Amazon KMS 密钥的服务器端加密(SSE-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 对于上传的新对象自动启用具有 Amazon S3 托管式密钥的服务器端加密(SSE-S3)。

除非您另行指定,否则默认情况下存储桶使用 SSE-S3 来加密对象。但是,您可以选择将存储桶配置为改为使用具有 Amazon Key Management Service (Amazon KMS) 密钥的服务器端加密 (SSE-KMS)。有关更多信息,请参阅 使用 Amazon KMS (SSE-KMS) 指定服务器端加密

Amazon KMS 是一项服务,可将安全、高度可用的硬件和软件结合起来,以提供可扩展到云的密钥管理系统。Amazon S3 使用具有 Amazon KMS 的服务器端加密(SSE-KMS)来加密您的 S3 对象数据。此外,当为对象请求 SSE-KMS 时,作为对象元数据一部分的 S3 校验和将以加密形式存储。有关校验和的更多信息,请参阅检查对象完整性

如果使用 KMS 密钥,您可以通过 Amazon Web Services Management ConsoleAmazon KMS API 使用 Amazon KMS 来执行以下操作:

  • 集中创建、查看、编辑、监控、启用或禁用、轮换以及安排删除 KMS 密钥。

  • 定义控制如何使用和谁可以使用 KMS 密钥的策略。

  • 审计它们的使用情况以确认它们被正确使用。Amazon KMS API 支持审计,但 Amazon KMSAmazon Web Services Management Console 不支持。

Amazon KMS 中的安全控制可帮助您满足与加密相关的合规性要求。您可以利用这些 KMS 密钥来保护在 Amazon S3 存储桶中的数据。将 SSE-KMS 加密用于 S3 存储桶时,Amazon KMS keys 必须位于该存储桶所在的同一区域中。

使用 Amazon KMS keys 无需支付额外费用。有关更多信息,请参阅 Amazon Key Management Service 开发人员指南中的 Amazon KMS key 概念Amazon KMS 定价

权限

要将使用 Amazon KMS key 加密的对象上载到 Amazon S3,您需要该密钥的 kms:GenerateDataKey 权限。要下载使用 Amazon KMS key 加密的对象,您需要 kms:Decrypt 权限。有关分段上传所需的 Amazon KMS 权限的信息,请参阅分段上传 API 和权限

Amazon KMS keys

当您使用具有 Amazon KMS 的服务器端加密(SSE-KMS)时,您可以使用默认的 Amazon 托管式密钥,也可以指定您已创建的客户托管式密钥。Amazon KMS 支持信封加密。S3 将 Amazon KMS 特征用于信封加密来进一步保护您的数据。信封加密是一种加密方法,它使用数据密钥对明文数据进行加密,然后使用 KMS 密钥对该数据密钥进行加密。有关信封加密的更多信息,请参阅 Amazon Key Management Service 开发人员指南中的信封加密

如果未指定客户托管密钥,首次将使用 SSE-KMS 加密的对象添加到存储桶时,Amazon S3 会自动在 Amazon Web Services 账户 中创建 Amazon 托管式密钥。默认情况下,Amazon S3 将此 KMS 密钥用于 SSE-KMS。

注意

通过 SSE-KMS(使用 Amazon 托管式密钥)加密的对象不能跨账户共享。如果您需要跨账户共享 SSE-KMS 数据,则必须使用来自 Amazon KMS 的客户自主管理型密钥

如果要使用客户托管式密钥进行 SSE-KMS 加密,可以在配置 SSE-KMS 之前创建对称加密客户托管式密钥。然后,为存储桶配置 SSE-KMS 时,请指定现有的客户托管密钥。有关对称加密密钥的更多信息,请参阅《Amazon Key Management Service 开发人员指南》中的对称加密 KMS 密钥

创建客户托管密钥可为您提供更大的灵活性和控制力。例如,您可以创建、轮换和禁用客户托管密钥。您还可以定义访问控制和审核用于保护数据的客户托管密钥。有关客户托管式密钥和 Amazon 托管式密钥的更多信息,请参阅《Amazon Key Management Service 开发人员指南》中的客户密钥和 Amazon 密钥

注意

与标准 KMS 密钥不同,当您将服务器端加密与存储在外部密钥存储中的客户托管式密钥结合使用时,您有责任确保密钥材料的可用性和耐久性。有关外部密钥存储及其如何更改责任共担模式的更多信息,请参阅《Amazon Key Management Service 开发者指南》中的外部密钥存储

如果您选择使用 Amazon 托管式密钥或客户托管式密钥加密数据,则 Amazon KMS 和 Amazon S3 执行以下信封加密操作:

  1. Amazon S3 请求明文数据密钥以及使用指定 KMS 密钥加密的数据密钥的副本。

  2. Amazon KMS 生成数据密钥,使用 KMS 密钥为其进行加密,然后将明文数据密钥和加密的数据密钥发送到 Amazon S3。

  3. Amazon S3 使用数据密钥加密数据,并在使用后尽快从内存中删除该明文密钥。

  4. Amazon S3 将加密的数据密钥作为元数据与加密数据一起存储。

当请求解密数据时,Amazon S3 和 Amazon KMS 将执行以下操作:

  1. Amazon S3 在 Decrypt 请求中向 Amazon KMS 发送加密的数据密钥。

  2. Amazon KMS 使用相同的 KMS 密钥为加密的数据密钥解密,然后将明文数据密钥返回到 Amazon S3。

  3. Amazon S3 使用明文数据密钥解密已加密的数据,并尽快从内存中删除该明文数据密钥。

重要

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

要识别指定 SSE-KMS 的请求,您可以使用 Amazon S3 Storage Lens 存储统计管理工具指标中的 All SSE-KMS requests(所有 SSE-KMS 请求)和 % all SSE-KMS requests(所有 SSE-KMS 请求的百分比)指标。S3 Storage Lens 存储统计管理工具是一项云存储分析特征,您可以使用它在整个组织范围内了解对象存储的使用情况和活动。有关更多信息,请参阅使用 S3 Storage Lens 存储统计管理工具访问存储活动和使用情况。有关指标的完整列表,请参阅 S3 Storage Lens 存储统计管理工具指标词汇表

Amazon S3 存储桶密钥

当您配置使用 Amazon KMS 的服务器端加密(SSE-KMS)时,您可以将存储桶配置为使用 S3 存储桶密钥实现 SSE-KMS。使用 SSE-KMS 的存储桶级别密钥可以通过减少从 Amazon S3 到 Amazon KMS 的流量请求,从而使您可以将 Amazon KMS 请求成本最高降低 99%。

当您将存储桶配置为使用 S3 存储桶密钥对新对象实现 SSE-KMS 时,Amazon KMS 会生成存储桶级别密钥,该密钥用于为存储桶中的对象创建唯一的数据密钥。此 S3 存储桶密钥在 Amazon S3 内限时使用,从而进一步减少了 Amazon S3 向 Amazon KMS 发出请求以完成加密操作的需求。有关使用 S3 存储桶密钥的更多信息,请参阅 使用 Amazon S3 存储桶密钥降低 SSE-KMS 的成本

需要服务器端加密

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

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

如要求使用特定 Amazon KMS key 对存储桶中的对象进行加密,可以使用 s3:x-amz-server-side-encryption-aws-kms-key-id 条件键。要指定 KMS 密钥,必须使用 arn:aws:kms:region:acct-id:key/key-id 格式的键 Amazon 资源名称(ARN)。Amazon Identity and Access Management 不验证 s3:x-amz-server-side-encryption-aws-kms-key-id 的字符串是否存在。

注意

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

有关特定于 Amazon S3 的条件密钥的完整列表,请参阅 Amazon S3 的条件密钥

加密上下文

加密上下文是一组键值对,其中包含有关数据的其他上下文信息。加密上下文没有加密。在为加密操作指定加密上下文时,Amazon S3 必须指定与解密操作相同的加密上下文。否则,解密将失败。Amazon KMS 会将加密上下文用作其他已经过验证的数据 (AAD) 以支持经过身份验证的加密。有关加密上下文的更多信息,请参阅 Amazon Key Management Service 开发人员指南中的加密上下文

默认情况下,Amazon S3 使用对象或存储桶 Amazon 资源名称(ARN)作为加密上下文对:

  • 如果您在不启用 S3 存储桶密钥的情况下使用 SSE-KMS,则将对象 ARN 用作加密上下文。

    arn:aws:s3:::object_ARN
  • 如果您使用 SSE-KMS 并启用 S3 存储桶密钥,则将存储桶 ARN 用作加密上下文。有关 S3 存储桶的更多信息,请参阅 使用 Amazon S3 存储桶密钥降低 SSE-KMS 的成本

    arn:aws:s3:::bucket_ARN

您可以选择使用 s3:PutObject 请求中的 x-amz-server-side-encryption-context 标头提供其他的加密上下文对。但是,由于加密上下文未加密,请确保它不包含敏感信息。Amazon S3 将此额外的密钥对与默认加密上下文一起存储。当处理 PUT 请求时,Amazon S3 会将 aws:s3:arn 的默认加密上下文附加到您提供的上下文中。

您可以使用加密上下文来标识和分类加密操作。您还可以使用默认的加密上下文 ARN 值来跟踪 Amazon CloudTrail 中的相关请求,方法是通过查看哪个 Amazon S3 ARN 与哪个加密密钥一起使用。

在 CloudTrail 日志文件的 requestParameters 字段中,加密上下文与以下内容类似。

"encryptionContext": { "aws:s3:arn": "arn:aws:s3:::DOC-EXAMPLE-BUCKET1/file_name" }

在将 SSE-KMS 与可选的 S3 存储桶密钥特征一起使用时,加密上下文值是存储桶的 ARN。

"encryptionContext": { "aws:s3:arn": "arn:aws:s3:::DOC-EXAMPLE-BUCKET1" }

发送对 Amazon KMS 加密对象的请求

  • 重要

    对 Amazon KMS 加密对象的所有 GETPUT 请求必须使用安全套接字层协议(SSL)和传输层安全性协议(TLS)发出。还必须使用有效的凭证对请求进行签名,例如 Amazon 签名版本 4(或 Amazon 签名版本 2)。

    Amazon 签名版本 4 是将身份验证信息添加到通过 HTTP 发送的 Amazon 请求的过程。出于安全考虑,大多数 Amazon 请求都必须使用访问密钥(包括访问密钥 ID 和秘密访问密钥)进行签名。这两个密钥通常称为您的安全凭证。有关更多信息,请参阅对请求进行身份验证 (Amazon Signature Version 4)Signature Version 4 签名过程

  • 重要

    如果对象使用 SSE-KMS,则不应对 GET 请求和 HEAD 请求发送加密请求标头。否则,您会收到 HTTP 400 错误请求错误。