我们使用机器学习技术将英文博客翻译为简体中文。您可以点击导航栏中的“中文(简体)”切换到英文版本。
亚马逊 S3 上的现代数据保护架构:第 1 部分
在意外泄露、人为错误和黑客攻击等不可预见的情况下,保持数据的安全性和可用性对于业务连续性和成功至关重要。为了有效减轻这些事件对关键业务资产的影响,推荐的策略之一是为这些资产创建不可更改、不可更改的副本,并将它们存储在访问受限的隔离辅助账户中。
在第一篇文章中,我们将介绍如何使用Amazon S3
解决方案概述
在这个由两部分组成的系列中,我们的目标是提出一种架构解决方案,使用原生 Amazon S3 功能(如 Amazon S3 同区域复制 (SRR) 和 Amazon S3 对象锁)安全地存储和检索不可变的数据副本。通过使用这些 S3 功能,我们可以为关键业务资产提供额外的保护层。
除了 Amazon S3 的原生功能外,该解决方案还利用某些关键附加服务来实现数据安全和事件警报。
使用亚马逊 S3 同区域复制
在此解决方案中,我们使用 S3 SRR 在另一个账户中创建对象副本。如果您当前在 S3 存储桶中存储了数据,并且必须复制现有对象,则可以使用
使用亚马逊 S3 对象锁
对于不可变的数据存储,我们使用
请注意,更改启用 S3 对象锁定的对象的保留期限或对现有对象启用 S3 对象锁定将产生 PUT API 操作和
此外,删除未指定版本 ID 的对象会将该对象的删除标记保留为当前版本,而不是完全删除该对象。但是,S3 GET API 在尝试访问当前版本时将返回 404 错误,指出找不到该对象。要进一步了解如何在存储分区级别与对象级别使用带对象锁定的 S3 SRR,请参阅
您可以在创建存储桶时启用 S3 对象锁定,如果在现有存储桶上启用对象锁定,也可以联系 亚马逊云科技 Support。另请注意,复制的对象 (在合规模式下) 将在目标存储桶中保留无法删除的数据。这将产生额外的存储成本,因此您应该选择存储类别和保留期,以平衡对额外数据副本的需求与保留它们的成本。
版本控制和删除标记的工作原理
使用 亚马逊云科技 密钥管理服务
除了启用 S3 对象锁定外,我们还需要考虑保护这些静态对象。为了保护静态数据,我们使用
我们之所以推荐 SSE-KMS 而不是 SSE-S3,是因为对 KMS 密钥本身的权限提供了额外的安全级别,只有经过授权的用户和应用程序才能解密。
您的源存储桶可能包含使用 SSE-KMS 使用服务器端加密创建的对象。默认情况下,Amazon S3 不会复制这些对象。您可以选择通过指定用于加密对象副本的 亚马逊云科技 KMS 密钥(用于目标存储桶的 亚马逊云科技 区域)来指示 Amazon S3 复制这些对象。有关更多详细信息,请参阅
使用亚马逊 EventBridge
在使用推荐的方法保护存储桶之后,我们现在需要设置警报通知以捕获实时事件警报。这将使我们能够启动补救措施以在需要时停止复制。为了设置 S3 API 操作的通知,我们使用了
在此解决方案中,我们建议使用EventBridge而不是其他选项,因为EventBridge可以提供基于内容的过滤和输入转换功能,同时可以与该解决方案中使用的其他服务无缝集成。
因此,如果发生安全事件,例如源头上的勒索软件攻击,我们可以尽早停止将受感染的文件复制到目标存储桶。我们将在本博客标题为 “自动禁用 S3 复制规则” 的部分中详细介绍这方面的详细信息。
将资产复制到隔离目标账户的架构布局
解决方案演练
让我们快速浏览一下以下各节及其功能要求,以构建解决方案:
- 亚马逊云科技 Key Management Service (KMS) 密钥创建 :重点介绍如何创建和使用加密密钥以加密格式存储对象。
- 创建存储桶 :展示我们如何在源和目标 亚马逊云科技 账户上创建存储桶并限制访问权限。
- S3 复制: 详细说明设置从源账户到目标账户的同区域复制的步骤。
- 更新 亚马逊云科技 KMS 和身份和访问管理 (IAM) 权限: 有关如何授予成功设置复制权限的详细信息。
- 自动禁用 S3 复制规则: 提供检测到勒索软件攻击时如何自动禁用复制的步骤。
在这里,我们提供有关如何创建密钥的分步指南,以便在存储桶中创建的对象在默认情况下处于加密状态,并且只有在使用正确的加密密钥并授予对这些密钥的访问权限的情况下,才能从目标(目标)账户中恢复。在此解决方案中,源对象使用源存储桶 S3 存储桶密钥加密,而对象副本使用目标存储桶 S3 存储桶密钥进行加密。
1。亚马逊云科技 密钥管理服务 (KMS) 密钥创建
在本节中,您将在用于加密对象和对象副本的源账户和目标账户中创建 亚马逊云科技 KMS 密钥。
- 在源账户中,在计划创建源存储桶的同一区域创建一个新的客户管理的 亚马逊云科技 KMS 密钥*(
对称 )。 - 在目标账户中,在计划创建目标存储桶的同一区域中创建新的客户管理的 亚马逊云科技 KMS 密钥 (Symmetric)。
- 允许源账户 亚马逊云科技 KMS 使用您的目标存储桶 亚马逊云科技 KMS 密钥
在目标账户 亚马逊云科技 KMS 控制台中,在步骤 2 中创建的 亚马逊云科技 KM S 密钥的 其他 亚马逊云科技 账户 部分添加源 亚马逊云科技 账户号码。
*默认情况下,当您创建 亚马逊云科技 KMS 密钥时,您将获得用于对称加密的 KMS 密钥。这是 KMS 密钥的基本和最常用类型。在 亚马逊云科技 KMS 中,对称加密 KMS 密钥代表 256 位加密密钥,它永远不会让 亚马逊云科技 KMS 处于未加密状态。
2。创建存储桶
在本节中,您将使用 亚马逊云科技 KMS 密钥 (SSE-KMS) 和 S3 存储桶密钥为存储在 Amazon S3 中的对象创建具有服务器端加密的源和目标存储桶。
1。在源账户中,创建一个新的 S3 存储桶。这是您的主要存储桶,用于存储您想要防范勒索软件事件的数据。
a. 为 “ 对象所有权 ” 选择 “ 禁用 (推荐) ACL ”。有关禁用 ACL 的详细信息可以在
b. 选择 “ 阻止所有公共访问 ” 。
c. 为 存储桶版本控制 选择 “ 启用 ”。
d. 启用 对象锁定 。
e. 为 默认加密 选择 “ 启用 ” 。
i. 选择 亚马逊云科技 密钥管理服务密钥 (SSE-KMS) 作为 加密密钥类型 。
二。对于 亚马逊云科技 KMS 密钥 , 选择从您的 亚马逊云科技 KMS 密钥 中选择, 然后选择您之前创建的 KMS 密钥。
iii。 为 存储桶密钥 选择 启用 。
2。在目标账户中,创建另一个 S3 存储桶。这是您的存储桶,它将存储来自源账户的对象的不可变副本。
a. 为 “ 对象所有权 ” 选择 “ 禁用 (推荐) ACL ”。
b. 选择 “ 阻止所有公共访问 ” 。
c. 为 存储桶版本控制选择 “ 启用 ”。
d. 启用 对象锁定 。
e. 为 默认加密 选择 “ 启用 ” 。
i. 选择 亚马逊云科技 密钥管理服务密钥 (SSE-KMS) 作为 加密密钥类型 。
二。对于 亚马逊云科技 KMS 密钥 , 选择从您的 亚马逊云科技 KMS 密钥 中选择, 然后选择您之前创建的 KMS 密钥。
iii。 为 存储桶密钥 选择 启用 。
3。目标存储桶创建完成后,转到目标存储分区的 “ 属性 ”,然后在 “ 对象锁定 ” 下启用 “ 默认保留期”。 使用以下设置配置 对象锁 定的 默认保留模式 和默认保留期 :
a. 默认保留 = 启用
b. 默认保留模式 = 治理
-
- 我们在此示例中使用治理模式,因此您可以在需要时移除锁。对于生产存储桶,我们建议使用 合规 模式进行勒索软件防护。
c. 默认保留期 = 7 天
-
- 建议使用 7/15/30 天,但这里我们使用 7 天进行演示,以防止文件长时间锁定并产生额外的存储费用
3。S3 复制
在本节中,配置 S3 同区域复制以将对象从源账户复制到目标账户。
- 在源账户 S3 控制台中,选择您之前创建的主存储桶,然后选择 管理 在 复制规则 部分中,选择 创建复制规则 。
- 输入 复制规则名称 和以下选项:
a. 状态 = 已启用
b. 在 “ 源存储桶 ” 部分中,选择 “ 应用于存储桶中的所有对象 ” 。
-
- 在生产环境中,我们建议设置过滤器以限制复制范围内的内容。
c. 对于 目标 ,选择 在另一个账户中 指定存储桶 , 然后输入目标账号和受保护的存储桶名称。
d. 启用 “ 将对象所有权更改为目标存储桶所有者 ” 。
e. 对于
f. 在 加密 中 ,选中 “ 复制使用 亚马逊云科技 KMS 加密的对象 ” 复选框 。
g. 选择 输入 亚马逊云科技 KMS 密钥 ARN , 然后输入您之前创建的 KMS 密钥的目标账户 KMS 亚马逊资源名称 (ARN)。
h. 选择 “ 更改复制对象的存储类别”, 然后为 目标选择 S3 智能分层 。有关存储类别的更多详细信息,请参阅
3。在 其他复制选项中, 启用 复制指标和通知 , 以监控您使用 Amazon CloudWatch 进行的复制。(S3 复制指标的计费率与
a. 此处还有其他选项: 复制时间控制 (RTC) 、 删除标记 复制 和副本修改同步 。当我们为勒索软件防护实施复制时,您不希望启用 删除标记复制 , 因为这可能会从源存储桶中复制不需要的删除内容并在目标存储桶中创建删除标记。这将使删除标记成为副本中的当前版本,使对象看起来像已被删除,可能需要移除复制的删除标记才能简化恢复。 副本修改同步 将对副本副本所做的元数据更改复制回源对象,从而实现双向复制。由于目标包含黄金副本,因此不应对这些对象进行任何更改以将其复制回源文件。 复制时间控制 (RTC) 可在几秒钟内 复制您上传到 Amazon S3 的大多数对象,并设计为在 15 分钟内复制 99.99% 的对象。RTC 可帮助您满足数据复制的合规性或业务要求,默认情况下包括 S3 复制指标和 S3 事件通知。使用 S3 RTC 复制的数据每 GB 会产生额外费用。
4。选择 “ 保存 ” 。系统可能会提示您选择 “ 复制现有对象?” 如果您有现有对象,则可以选择此选项通过 S3 批量复制进行复制。在此示例中,选择 “ 否”,不 复制现有对象, 然后选择 “ 提交”。 您的复制规则应与以下屏幕截图类似。
4。更新 亚马逊云科技 KMS 和身份和访问管理 (IAM) 权限
在本节中,您将更新成功完成复制所需的权限。同时使用 S3 复制、亚马逊云科技 KMS 和 S3 存储桶密钥时,您需要更新 亚马逊云科技 KMS、IAM 和亚马逊 S3 中的权限。
- 在源账户中,打开 亚马逊云科技 KMS 控制台并找到您之前创建的密钥。将复制规则创建的新 s3crr * 角色添加为密钥用户。 新创建的角色应命名为 s3crr _role_for _。
* s3crr_role_for 前缀已附加到复制角色 。
- 打开身份和访问管理 (IAM) 控制台,找到复制规则创建的角色。 新创建的角色应命名为 s3crr _role_for _。
- 您将需要更新 IAM 策略以包括 亚马逊云科技 KMS 密钥权限,并更新用于 S3 存储桶密钥的资源。您可以复制以下示例,并根据您的存储桶和 亚马逊云科技 KMS 密钥名称和 ARN 对其进行相应更新。
a. 由于我们在本示例中使用了 亚马逊云科技 KMS 的存储桶密钥,因此以下 IAM 策略中的 kms: encryptionContext: aws: s3: arn 必须使用存储桶 ARN 而不是对象 ARN (/*)。
b. 粗 体项目 需要使用您的值进行更改
{ "Version":"2012-10-17", "Statement":[ { "Action":[ "s3:ListBucket", "s3:GetReplicationConfiguration", "s3:GetObjectVersionForReplication", "s3:GetObjectVersionAcl", "s3:GetObjectVersionTagging", "s3:GetObjectRetention", "s3:GetObjectLegalHold" ], "Effect":"Allow", "Resource":[ "arn:aws:s3:::<source bucket>", "arn:aws:s3:::<source bucket>/*", "arn:aws:s3:::<destination bucket>", "arn:aws:s3:::<destination bucket>/*" ] }, { "Action":[ "s3:ReplicateObject", "s3:ReplicateDelete", "s3:ReplicateTags", "s3:GetObjectVersionTagging", "s3:ObjectOwnerOverrideToBucketOwner" ], "Effect":"Allow", "Condition":{ "StringLikeIfExists":{ "s3:x-amz-server-side-encryption":[ "aws:kms", "AES256" ] } }, "Resource":[ " arn:aws:s3:::<destination bucket>/*" ] }, { "Action":[ "kms:Decrypt" ], "Effect":"Allow", "Condition":{ "StringLike":{ "kms:ViaService":"s3.<source bucket region>.amazonaws.com", "kms:EncryptionContext:aws:s3:arn":[ "arn:aws:s3:::<source bucket>" ] } }, "Resource":[ "<source bucket KMS Key ARN>" ] }, { "Action":[ "kms:Encrypt" ], "Effect":"Allow", "Condition":{ "StringLike":{ "kms:ViaService":[ "s3.<destination bucket region>.amazonaws.com" ], "kms:EncryptionContext:aws:s3:arn":[ "arn:aws:s3:::<destination bucket>" ] } }, "Resource":[ "<destination bucket KMS key ARN>" ] } ] }
- 在目标账户中,创建存储桶策略以允许从源账户存储桶进行复制。 需要根据您的值更改 粗体 项目
{ "Version":"2012-10-17", "Id":"", "Statement":[ { "Sid":"Set permissions for objects", "Effect":"Allow", "Principal":{ "亚马逊云科技":"arn:aws:iam::<亚马逊云科技 Account>:role/service-role/s3crr_role_for_<source bucket name>" }, "Action":[ "s3:ReplicateObject", "s3:ReplicateDelete" ], "Resource":"arn:aws:s3:::<destination bucket>/*" }, { "Sid":"Set permissions on bucket", "Effect":"Allow", "Principal":{ "亚马逊云科技":"arn:aws:iam::<亚马逊云科技 Account>:role/service-role/s3crr_role_for_<source bucket name>" }, "Action":[ "s3:List*", "s3:GetBucketVersioning", "s3:PutBucketVersioning" ], "Resource":"arn:aws:s3:::<destination bucket>" }, { "Sid":"Set owner on objects in bucket", "Effect":"Allow", "Principal":{ "亚马逊云科技":"arn:aws:iam::<亚马逊云科技 Account>:role/service-role/s3crr_role_for_<source bucket name>" }, "Action":"s3:ObjectOwnerOverrideToBucketOwner", "Resource":"arn:aws:s3:::<destination bucket>/*" } ] }
- 通过将对象上传到源存储桶进行测试,验证该对象是否成功复制到受保护存储桶、属于配置的存储类别以及该对象是否已使用 S3 对象锁定锁定。
5。自动禁用 S3 复制规则
本部分介绍如何创建 CloudWatch 警报以监控源存储桶中的 PUT 事件。PUT 请求速率提高可能指向安全事件,例如您的环境中存在潜在的勒索软件活动(在本博客中,我们使用每分钟 10 个 PUT 请求的值作为示例)。如果超过警报阈值,Lambda 函数将停止您的 S3 复制规则。您也可以创建类似的函数来禁用删除操作的复制。考虑到您的 PUT 请求的平均数量,请记住使用阈值。这种自动化可以防止在安全事件发生期间将不需要的数据复制到您的目标存储桶。
说明禁用复制的架构图
- 在 CloudWatch 控制台中,为 S3 PUT(PutRequest)指标在 1 分钟 P 周期内 超过 10 个创建新的警报 ,统计数据为 SUM。
a. PutRequest 指标值的 提高可能表示存在指向活跃攻击的异常。
- 设置亚马逊 SNS 电子邮件通知。
- 创建新的 亚马逊云科技 Lambda 函数,将复制规则更新为禁用状态。使用 Amazon S3 的复制规则,该 API 只能放置新的复制规则。以下函数删除现有规则,并将其替换为禁用的新规则集。
import json import boto3 print('Loading function') s3 = boto3.client('s3') def lambda_handler(event, context): try: print('event: ' + json.dumps(event)) bucket = '<source bucket name>' # if the lambda is triggered by alarm, the source bucket name will be a part of the event object payload config = s3.get_bucket_replication(Bucket=bucket) print('Bucket {} CRR config: {}'.format(bucket, json.dumps(config['ReplicationConfiguration']))) new_config = config['ReplicationConfiguration'] new_config['Rules'][0]['Status'] = 'Disabled' s3.put_bucket_replication( Bucket=bucket, ReplicationConfiguration=new_config, ) print('Disabled CRR for bucket {}, config : {}'.format(bucket, json.dumps(new_config))) return new_config except Exception as e: print(e) print('Failed disabling CRR for bucket {}, error {}'.format(bucket, e)) raise e
- 创建新的亚马逊 EventBridge 规则,在亚马逊 CloudWatch 警报超过阈值时调用 亚马逊云科技 Lambda 函数。
正在清理
如果您继续操作并希望避免产生意外费用,请记住删除源存储桶和目标存储桶,并禁用源存储桶的版本控制。还要删除 亚马逊云科技 Lambda 函数、IAM 角色和 亚马逊云科技 KMS 密钥。
摘要
在这篇博客文章中,我们演示了一种保护您的业务关键资产的解决方案,该解决方案使用 Amazon S3 复制和 S3 对象锁来创建不可变的数据副本,以便安全地保存在具有受限访问权限的 亚马逊云科技 账户中。我们还介绍了 Amazon S3 智能分层如何允许您根据访问模式将隔离的、不可变的副本转换为更便宜的存储类别。
演示的解决方案可以使您扩大威胁缓解策略并保护关键业务数据,因为它可以在主要用途账户之外保留关键数据的隔离冗余副本。Amazon S3 Intelligent-Tiering 使您能够设置此解决方案,同时根据访问模式自动节省成本,从而节省威胁缓解策略。
在本系列 的
有关确保源 Amazon S3 存储桶中存储的数据安全的其他建议,可在