使用 Amazon S3 存储桶密钥将 亚马逊云科技 密钥管理服务的成本降低多达 99%

作者:威尔·卡文 | 202

许多行业的客户在数据安全和隐私方面面临着越来越严格的审计和合规要求。某些合规框架,例如FISMA、FEDRAMP、PCI DSS和SOC 2,有用于验证系统安全的特定监管标准。对这些合规框架的共同要求是对静态数据采用更严格的加密标准,组织必须使用他们控制的加密密钥对数据进行加密。为了在本地满足这些要求,客户必须投入专用资源来维护加密模块。在云中,客户使用根据使用量定价的加密产品。

除非客户选择其他类型的服务器端 加密,否则@@ 亚马逊简单存储服务 (Amazon S3) 使用亚马逊 S3 托管的服务器端加密 (SSE-S3) 对所有新对象进行加密。SSE-S3 满足了许多 Amazon S3 客户的安全要求,但遵守某些合规框架的客户可能需要加强对其加密密钥的控制。这些客户可以信赖 亚马逊云科技 密钥管理服务 (亚马逊云科技 KMS) 和使用 亚马逊云科技 KMS (SSE-KMS) 进行 服务器端加密 。 SSE-KMS 按请求收取 亚马逊云科技 KMS 费用和每个 亚马逊云科技 KMS 密钥的月度存储费。随着客户将其工作负载扩展到数百万或数十亿个对象,他们的 亚马逊云科技 KMS 成本可能会增加。在繁重的读/写应用程序中,客户会敏锐地体验到这种情况,在这些应用程序中,客户数据的访问频率很高。为了帮助客户降低这笔成本,Amazon S3 推出了 S3 存储桶密钥 。实际上,S3存储桶密钥可以将亚马逊云科技 KMS的成本降低多达99%,自2020年底推出以来,已为客户节省了超过8000万美元。

在这篇文章中,我将向您展示如何要求写入存储桶的所有对象使用 SSE-KMS,如何在存储桶上启用 S3 存储桶密钥,如何在多租户存储桶中使用 S3 存储桶密钥,以及如何评估通过对象级 SSE-KMS 加密的现有对象。使用 S3 存储桶密钥可以帮助您节省 亚马逊云科技 KMS 账单,同时仍符合使用 SSE-KMS 加密数据的安全要求。

背景

SSE-KMS 为客户提供了对其加密密钥的控制以及审核密钥使用情况的能力。这些额外的控制措施对于必须向审计员证明其加密密钥的所有权、对密钥轮换计划的控制以及加密密钥权限的管理的企业客户非常重要。使用 SSE-KMS 加密对象时,亚马逊云科技 KMS 会收到来自 Amazon S3 的加密请求,并发回一个唯一的数据密钥来加密该对象。

使用 S3 存储桶密钥,亚马逊云科技 KMS 会生成一个有时间限制的存储桶级密钥,而不是单独调用 亚马逊云科技 KMS 来加密每个对象。Amazon S3 使用此存储桶级密钥创建唯一的数据密钥来加密存储桶中的对象,从而无需额外的 亚马逊云科技 KMS 请求即可完成加密操作。S3 存储桶密钥减少了从 Amazon S3 到 亚马逊云科技 KMS 的请求流量,使您能够访问亚马逊 S3 中的加密对象,而费用仅为之前的一小部分。

先决条件

要关注博客文章,您的 亚马逊云科技 身份和访问管理 (IAM) 委托人(用户或角色 )需要创建存储桶和使用 亚马逊云科技 KMS 密钥的权限。

Minimum IAM permissions to use Bucket Keys
{
   "Version":"2012-10-17",
   "Statement":[
{
   "Sid": "Permissions to use Bucket Keys",
   "Effect":"Allow",
   "Principal": {"AWS": "arn:aws:iam::111122223333:user/willcavin"},
         "Action":[
         "s3:PutObject",
         "s3:GetObject",
         "s3:CreateBucket",
         "kms:Decrypt",
         "kms:GenerateDataKey"
         ],
         "Resource":"arn:aws:s3:::willcavinbucket/*"
      }
   ]
}

图 1:使用 S3 存储桶密钥的 IAM 权限示例

写入存储桶的所有对象都需要 SSE-KMS

有合规性要求的客户通常希望要求对上传到其 S3 存储桶的所有对象使用 SSE-KMS 进行加密。这可以通过 S3 存储桶策略 来实现 。以下存储桶策略拒绝对未使用 SSE-KMS 加密的存储桶进行任何写入。通过在指定 SSE-KMS 的 PutObject 请求中添加加密请求标头,您可以使用此策略成功将对象上传到存储桶。或者,您也可以在 存储桶 上设置 默认的存储桶加密配置 ,以便使用 SSE-KMS 自动加密新对象,即使您的客户端未向上传请求添加加密标头也是如此。除非您在 PutObject 请求中特别禁用 S3 存储桶密钥,否则此存储桶策略与在默认存储桶加密配置中启用 S3 存储桶密钥相结合,将验证上传的对象使用 S3 存储桶密钥。

 {
 "Version": "2012-10-17",
 "Id": "PutObjPolicy",
 "Statement": [{
 		"Sid": "DenyObjectsThatAreNotSSEKMS",
 		"Effect": "Deny",
 		"Principal": "*",
 		"Action": "s3:PutObject",
 		"Resource": "arn:aws:s3:::example-bucket/*",
 		"Condition": {
 		"Null": {
 		"s3:x-amz-server-side-encryption-aws-kms-key-id": "true"
           }
      }
   }]
 }

图 2:启用 S3 存储桶密钥的 IAM 权限示例

在存储桶上启用 S3 存储桶密钥

通过编辑存储桶上的默认加密,可以通过 Amazon S3 控制台启用 S3 存储桶密钥。选择存储桶后,选择 属性 。在 “ 默认加密” 下 ,选择 “编辑”

加密密钥类型下 ,选择 亚马逊云科技 密钥管理服务密钥 (SSE-KMS)。 在 亚马逊云科技 KMS 密钥下 ,选择您的首选 亚马逊云科技 KMS 密钥。在 “ 存储桶密钥” 下 ,选择 “ 启用” 。选择 “ 保存更改” 。

Figure 3 Example default encryption configuration to enable S3 Bucket Keys

图 3:启用 S3 存储桶密钥的默认加密配置示例

使用 亚马逊云科技 命令行界面

aws s3api put-bucket-encryption --bucket <bucket-name> --server-side-encryption-configuration '{
        "Rules": [
            {
                "ApplyServerSideEncryptionByDefault": {
                    "SSEAlgorithm": "aws:kms",
                    "KMSMasterKeyID": "<KMS-Key-ARN>"
                },
                "BucketKeyEnabled": true
            }
        ]
    }'

请注意,Amazon S3 为添加到您的存储桶的新对象启用 S3 存储桶密钥。现有对象不使用 S3 存储桶密钥。

在多租户环境中使用 S3 存储桶密钥

许多客户在多租户场景中使用 S3 存储桶,他们可能有多个团队或最终客户将对象上传到共享存储桶进行分析或数据处理。S3 存储桶密钥旨在在此模型中使用。您只需在存储桶默认加密配置中启用 S3 存储桶密钥,然后让您的最终客户将其首选的客户管理的 亚马逊云科技 KMS 密钥添加到其 Amazon S3 请求标头中。这允许最终客户使用其客户管理的 亚马逊云科技 KMS 密钥加密对象,并使多租户存储桶所有者能够为上传到其存储桶的对象启用 S3 存储桶密钥。

在此结构中,每个租户都与您共享其客户管理的 亚马逊云科技 KMS 密钥,因此您可以执行服务(数据分析、数据处理等)。如果租户决定他们不再希望你访问他们的数据,那么他们只需删除你对他们的密钥的访问权限。该模型在为相关方提供访问权限的同时,保持了关键材料的机密性。

Figure 4 Example multi-tenant bucket using AWS KMS keys

图 4:使用 亚马逊云科技 KMS 密钥的多租户存储桶示例

使用 SSE-KMS 对象评估读取密集型存储桶

自 S3 存储桶密钥推出以来,许多客户已重新加密现有数据以采用存储桶密钥并降低其 亚马逊云科技 KMS 成本。如果您有一个读取密集型存储桶,其中包含通过对象级 SSE-KMS 加密的对象,则应仔细评估访问模式,看看这对您的应用程序是否有意义。您可以使用 S3 Storage Lens 识别您 的 AW S 组织中的 亚马逊云科技 KMS 请求 ,然后放大 亚马逊云科技 KMS 请求最多的账户和存储桶。如果您通常只在创建数据后的短时间内访问数据,那么我们建议您只让对象过期,然后对所有新对象使用 S3 存储桶密钥。如果您的数据在较长的一段时间(可能是数年)内读取量很大,那么使用 S3 存储桶密钥重新加密现有的对象级 SSE-KMS 对象可能是有意义的。

要使用 S3 存储桶密钥加密您现有的 Amazon S3 对象,您可以使用 Amazon S3 批量操作。您为 S3 批处理操作提供对象列表,批处理操作会对每个对象执行指定的操作。您可以使用 S3 批量操作复制操作 复制 现有的 SSE-KMS 对象并将其写回同一个存储桶,以便在这些对象上启用 S3 存储桶密钥。单个批处理操作作业可以对数十亿个对象执行指定的操作。这 篇文章 提供了一个很好的示例,说明如何使用 亚马逊云科技 L am bda 函数检索每个对象的 SSE-KMS 密钥 ID,并通过使用相应的客户管理密钥将对象复制到位来启用 S3 存储桶密钥。

要知道的事情

许多客户通常希望在未启用 S3 存储桶密钥的情况下快速审核其账户的存储分区默认加密配置。这 篇文章 详细介绍了如何在不启用此成本节省功能的情况下快速识别和修复存储桶。

启用 S3 存储桶密钥之前需要注意的更改

如果您现有的 IAM 策略或 亚马逊云科技 KMS 密钥策略使用您的对象 A mazon 资源名称 (ARN) 作为 加密上下文 来优化或限制对您的 亚马逊云科技 KMS 密钥的访问,则这些策略将不适用于 S3 存储桶密钥。S3 存储桶密钥使用存储桶 ARN 作为加密上下文。在启用 S3 存储桶密钥之前,请更新您的 IAM 策略或 亚马逊云科技 KMS 密钥策略以使用您的存储桶 ARN 作为加密上下文。

启用 S3 存储桶密钥后,您会在日志中看到的 SSE-KMS 对象的 亚马逊云科技 KMS CloudTrail 事件较少,因为对 亚马逊云科技 KMS 的调用较少。此外,您的 亚马逊云科技 KMS CloudTrail 事件会记录您的存储桶 ARN,而不是您的对象 ARN。

使用复制 API

您可以使用 “复制” 操作来重新加密现有对象。请注意,复制操作会更改对象的上次修改日期,如果您制定了生命周期规则,则会重置对象的生命周期资格。或者,您可以在 “复制” 操作期间添加新的对象标签,以追溯识别重新加密的对象。然后,您可以创建新的生命周期规则,将这些标记的对象转移到较冷的存储空间或自行决定过期。此外,任何大于 5 GB 的对象都必须 使用分段上传 API 进行复 制 ,因为复制 API 不支持大于 5 GB 的对象。

正在清理

如果您创建了新资源来测试本文中分享的建议,请删除您的客户管理的 亚马逊云科技 KMS 密钥以及您添加到存储桶中的所有对象。

结论

许多客户都有合规性要求,要求客户控制其加密密钥,这些客户使用带有客户管理密钥的 SSE-KMS 来遵守这些监管标准。在这篇博客文章中,我们了解了如何使用 S3 存储桶策略在存储桶级别强制执行 SSE-KMS 加密。我们还了解了如何在默认存储桶加密配置中启用 S3 存储桶密钥,以便轻松利用这项节省成本的功能。我们讨论了多租户存储桶所有者如何启用 S3 存储桶密钥,同时仍允许其客户使用他们自己的客户管理的 KMS 密钥。最后,在重新加密现有 SSE-KMS 对象以使用 S3 存储桶密钥之前,我们回顾了一些重要的访问模式注意事项。

对于有数据加密合规性要求的客户,建议启用 S3 存储桶密钥的最佳做法。此功能可以节省您的 亚马逊云科技 KMS 账单,同时仍能帮助您遵守数据加密标准。现在,您拥有使用 S3 存储桶密钥最大限度地节省开支的知识和工具。

感谢您阅读此博客,如果您有任何意见或疑问,请随时将其留在评论部分。