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

使用具有 Amazon Key Management Service (SSE-KMS) 的服务器端加密保护数据

服务器端加密是由接收数据的应用程序或服务在其目的地对数据进行加密。Amazon Key Management Service (Amazon KMS) 是一项将安全、高度可用的硬件和软件结合起来,提供可扩展到云的密钥管理系统的服务。Amazon S3 使用 Amazon KMS keys 加密您的 Amazon S3 对象。Amazon KMS 只加密对象数据。不会加密任何对象元数据。

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

  • 集中创建 KMS 密钥

  • 定义控制如何使用 KMS 密钥的策略

  • 审核它们的使用情况以确认它们被正确使用

Amazon KMS 中的安全控制可帮助您满足与加密相关的合规性要求。您可以利用这些 KMS 密钥来保护在 Amazon S3 Bucket 中的数据。将 SSE-KMS 加密用于 S3 Bucket 时,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 使用信封加密 进一步保护您的数据。信封加密是一种加密方法,它使用数据密钥对明文数据进行加密,然后使用根密钥对该数据密钥进行加密。

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

如果要使用客户托管密钥进行 SSE-KMS 加密,可以在配置 SSE-KMS 之前创建客户托管密钥。然后,为存储桶配置 SSE-KMS 时,请指定现有的客户托管密钥。

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

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

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

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

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

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

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

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

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

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

重要

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

Amazon S3 Bucket 密钥

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

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

需要服务器端加密

如果要求对特定 Amazon S3 Bucket 中的所有对象进行服务器端加密,请使用策略。例如,如果请求不包含用于请求服务器端加密 (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 Resource Name (ARN)。

注意

在上传对象时,您可以使用 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 的条件键的完整列表,请参阅 Condition keys for Amazon S3(Amazon S3 的条件密钥)。

加密上下文

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

Amazon S3 会自动使用对象或存储桶 Amazon Resource Name (ARN) 作为加密上下文对:

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

    arn:aws:s3:::object_ARN
  • 如果您使用 SSE-KMS 并启用 S3 存储桶密钥,则将存储桶 ARN 用作加密上下文。有关 S3 Bucket 的更多信息,请参阅 使用 Amazon S3 Bucket 密钥降低 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 Bucket 密钥功能一起使用时,加密上下文值是存储桶的 ARN。

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

Amazon 签名版本 4

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

重要
  • 如果您不让针对受 Amazon KMS 保护的对象的所有 GET 和 PUT 请求使用安全套接字层 (SSL)、传输层安全性 (TLS) 或签名版本 4,所有这些请求都将失败。

  • 如果对象使用 SSE-KMS,则不应对 GET 请求和 HEAD 请求发送加密请求标头,否则将显示 HTTP 400 BadRequest 错误。