AWS Key Management Service
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

Amazon Simple Storage Service (Amazon S3) 如何使用 AWS KMS

本主题将讨论如何使用 AWS KMS 保护 Amazon S3 数据中心内的静态数据。可通过两种方式将 AWS KMS 与 Amazon S3 配合使用。您可以使用服务器端加密来借助主密钥保护您的数据,也可以将 AWS KMS 客户主密钥 (CMK) 与 Amazon S3 加密客户端配合使用来保护您的客户端上的数据。

服务器端加密:使用 SSE-KMS

您可以使用三种不同的服务器端加密模式(SSE-S3、SSE-C 或 SSE-KMS)来保护 Amazon S3 中的静态数据。

本主题的其余部分将讨论如何使用具有 AWS KMS 托管密钥的服务器端加密 (SSE-KMS) 来保护数据。

您可以使用 Amazon S3 控制台或 API 请求加密和选择客户主密钥 (CMK)。在控制台中,选中相应的框以执行加密,并从列表中选择 CMK。对于 Amazon S3 API,通过在 GET 或 PUT 请求中设置相应标头,指定加密并选择您的 CMK。有关更多信息,请参阅使用具有 AWS KMS 托管密钥的服务器端加密 (SSE-KMS) 保护数据

您可以为账户中的 Amazon S3 选择客户托管 CMKAWS 托管 CMK。如果选择加密您的数据,AWS KMS 和 Amazon S3 将执行以下操作:

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

  • AWS KMS 创建数据密钥、使用主密钥对其进行加密,然后向 Amazon S3 发送明文数据密钥和加密的数据密钥。

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

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

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

  • Amazon S3 向 AWS KMS 发送加密的数据密钥。

  • AWS KMS 使用相应的主密钥解密密钥,然后将明文密钥发送回 Amazon S3。

  • Amazon S3 解密密文,并会尽快从内存中删除该明文数据密钥。

使用 Amazon S3 加密客户端

您可以使用自己应用程序的 AWS 开发工具包中的 Amazon S3 加密客户端来加密对象,并将它们上传到 Amazon S3。此方法允许您在本地加密数据,在将其传递给 Amazon S3 服务时确保安全。Amazon S3 服务接收您的加密数据,并且不会影响对其进行的加密或解密操作。

Amazon S3 加密客户端使用信封加密来加密对象。当您将数据传递给客户端时,客户端将调用 AWS KMS 作为您执行的加密调用的一部分。AWS KMS 会验证您是否有权使用客户主密钥 (CMK),如果有权使用,将返回一个新的明文数据密钥以及在 CMK 下加密的数据密钥。Amazon S3 加密客户端使用明文密钥加密数据,然后将密钥从内存中删除。加密的数据密钥会发送到 Amazon S3,与加密数据一起存储。

加密上下文

与 AWS KMS 集成的每项服务在请求数据密钥、加密和解密时会指定一个加密上下文。加密上下文是 AWS KMS 检查数据完整性时使用的额外的身份验证数据 (AAD)。在为加密操作指定加密上下文时,Amazon S3 会指定与解密操作相同的加密上下文。否则,解密将失败。如果您使用 SSE-KMS 或 Amazon S3 加密客户端执行加密,Amazon S3 将使用存储桶路径作为加密上下文。在 CloudTrail 日志文件的 requestParameters 字段中,加密上下文与以下示例类似。

"encryptionContext": { "aws:s3:arn": "arn:aws:s3:::bucket_name/file_name" },