亚马逊 S3 上的现代数据保护架构:第 1 部分

在意外泄露、人为错误和黑客攻击等不可预见的情况下,保持数据的安全性和可用性对于业务连续性和成功至关重要。为了有效减轻这些事件对关键业务资产的影响,推荐的策略之一是为这些资产创建不可更改、不可更改的副本,并将它们存储在访问受限的隔离辅助账户中。

在这个由两部分组成的博客系列中,我们首先介绍如何创建数据的不可变副本,并将这些不可变副本从一个 Amazon S3 存储桶复制到另一个存储桶。 第 2 部分 中 ,我们将介绍在主数据源遭到破坏的情况下如何有选择地检索副本。

在第一篇文章中,我们将介绍如何使用Amazon S3 复制 和S3对象锁定在单独的亚马逊云科技账户中创建不可变的数据副本, 从而保护存储在 A mazon S 3中的关键业务资产。这有助于您仅使用 S3 的原生功能在主账户之外获得关键数据的隔离冗余副本。除了使解决方案更易于实施外,还可以通过使用诸如 S3 Intelligent-Tiering 存储类之类的功能来优化成本,因为它可以为未知或不断变化的数据访问模式自动节省存储成本,而不会影响性能或运营开销,也没有检索费用(档案访问层加急请求除外)。客户将看到,这种隔离主账户和辅助帐户的方法有助于限制数据泄露和数据损坏的影响,同时保持检索机制的简化。

解决方案概述

在这个由两部分组成的系列中,我们的目标是提出一种架构解决方案,使用原生 Amazon S3 功能(如 Amazon S3 同区域复制 (SRR) 和 Amazon S3 对象锁)安全地存储和检索不可变的数据副本。通过使用这些 S3 功能,我们可以为关键业务资产提供额外的保护层。

除了 Amazon S3 的原生功能外,该解决方案还利用某些关键附加服务来实现数据安全和事件警报。

使用亚马逊 S3 同区域复制

在此解决方案中,我们使用 S3 SRR 在另一个账户中创建对象副本。如果您当前在 S3 存储桶中存储了数据,并且必须复制现有对象,则可以使用 S3 批量复制 。我们建议您考虑哪些特定数据需要这种保护级别,因为您现在将存储重复副本,从而增加总体存储成本。许多组织会选择只复制其最关键业务的数据。

使用亚马逊 S3 对象锁

对于不可变的数据存储,我们使用 Amazon S3 对象锁 S3 对象锁使用一次写入多次读取 (WORM) 模型将对象存储在 S3 中。启用后,它可以帮助防止对象被删除或覆盖。使用对象锁定时,需要考虑两种模式进行数据保护。治理模式允许您在获得特殊权限时更改锁定设置或删除对象。另一方面,合规模式会锁定对象,任何人,包括您的 亚马逊云科技 账户的根用户,都无法更改锁定或保留期。

请注意,更改启用 S3 对象锁定的对象的保留期限或对现有对象启用 S3 对象锁定将产生 PUT API 操作和 相关成本

此外,删除未指定版本 ID 的对象会将该对象的删除标记保留为当前版本,而不是完全删除该对象。但是,S3 GET API 在尝试访问当前版本时将返回 404 错误,指出找不到该对象。要进一步了解如何在存储分区级别与对象级别使用带对象锁定的 S3 SRR,请参阅 S3 对象锁定管理文档

您可以在创建存储桶时启用 S3 对象锁定,如果在现有存储桶上启用对象锁定,也可以联系 亚马逊云科技 Support。另请注意,复制的对象 (在合规模式下) 将在目标存储桶中保留无法删除的数据。这将产生额外的存储成本,因此您应该选择存储类别和保留期,以平衡对额外数据副本的需求与保留它们的成本。

How versioning and delete markers work in Amazon S3. How you can identify the delete marker and check the version ID.

版本控制和删除标记的工作原理

使用 亚马逊云科技 密钥管理服务

除了启用 S3 对象锁定外,我们还需要考虑保护这些静态对象。为了保护静态数据,我们使用 亚马逊 S3 服务器端加密 (SSE) 亚马逊云科技 密钥管理服务 (KMS) — (SSE-KMS) 和 亚马逊 S3 存储桶 密钥。 通过 减少从 S3 到 KMS 的请求流量,S3 存储桶密钥可以将 SSE-KMS 的请求成本降低多达 99%

我们之所以推荐 SSE-KMS 而不是 SSE-S3,是因为对 KMS 密钥本身的权限提供了额外的安全级别,只有经过授权的用户和应用程序才能解密。

您的源存储桶可能包含使用 SSE-KMS 使用服务器端加密创建的对象。默认情况下,Amazon S3 不会复制这些对象。您可以选择通过指定用于加密对象副本的 亚马逊云科技 KMS 密钥(用于目标存储桶的 亚马逊云科技 区域)来指示 Amazon S3 复制这些对象。有关更多详细信息,请参阅 亚马逊云科技 文档

使用亚马逊 EventBridge

在使用推荐的方法保护存储桶之后,我们现在需要设置警报通知以捕获实时事件警报。这将使我们能够启动补救措施以在需要时停止复制。为了设置 S3 API 操作的通知,我们使用了 Amazon Ev ent Bridge ,这是一种无服务器事件总线,可以更轻松地使用您的应用程序、集成软件即服务 (SaaS) 应用程序和 亚马逊云科技 服务生成的事件大规模构建事件驱动型应用程序。如果发生事件,我们希望设置自动响应来停止复制。我们有 CloudWatch 警报器来监控 PutRequest API 指标异常升高。触发警报后,Amazon EventBridge 规则会捕获警报并触发 亚马逊云科技 Lambda 函数以终止复制。

在此解决方案中,我们建议使用EventBridge而不是其他选项,因为EventBridge可以提供基于内容的过滤和输入转换功能,同时可以与该解决方案中使用的其他服务无缝集成。

因此,如果发生安全事件,例如源头上的勒索软件攻击,我们可以尽早停止将受感染的文件复制到目标存储桶。我们将在本博客标题为 “自动禁用 S3 复制规则” 的部分中详细介绍这方面的详细信息。

The architectural layout shows how you can replicating the assets into an isolated destination account through the process and services mentioned in this blog.

将资产复制到隔离目标账户的架构布局

解决方案演练

让我们快速浏览一下以下各节及其功能要求,以构建解决方案:

  1. 亚马逊云科技 Key Management Service (KMS) 密钥创建 :重点介绍如何创建和使用加密密钥以加密格式存储对象。
  2. 创建存储桶 :展示我们如何在源和目标 亚马逊云科技 账户上创建存储桶并限制访问权限。
  3. S3 复制: 详细说明设置从源账户到目标账户的同区域复制的步骤。
  4. 更新 亚马逊云科技 KMS 和身份和访问管理 (IAM) 权限: 有关如何授予成功设置复制权限的详细信息。
  5. 自动禁用 S3 复制规则: 提供检测到勒索软件攻击时如何自动禁用复制的步骤。

在这里,我们提供有关如何创建密钥的分步指南,以便在存储桶中创建的对象在默认情况下处于加密状态,并且只有在使用正确的加密密钥并授予对这些密钥的访问权限的情况下,才能从目标(目标)账户中恢复。在此解决方案中,源对象使用源存储桶 S3 存储桶密钥加密,而对象副本使用目标存储桶 S3 存储桶密钥进行加密。

1。亚马逊云科技 密钥管理服务 (KMS) 密钥创建

在本节中,您将在用于加密对象和对象副本的源账户和目标账户中创建 亚马逊云科技 KMS 密钥。

  1. 在源账户中,在计划创建源存储桶的同一区域创建一个新的客户管理的 亚马逊云科技 KMS 密钥*( 对称 )。
  2. 在目标账户中,在计划创建目标存储桶的同一区域中创建新的客户管理的 亚马逊云科技 KMS 密钥 (Symmetric)。
  3. 允许源账户 亚马逊云科技 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 的详细信息可以在 Amazon S3 用户指南 中找到。
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 同区域复制以将对象从源账户复制到目标账户。

  1. 在源账户 S3 控制台中,选择您之前创建的主存储桶,然后选择 管理 复制规则 部分中,选择 创建复制规则
  2. 输入 复制规则名称 和以下选项:

a. 状态 = 已启用
b. 在 “ 源存储桶 ” 部分中,选择 “ 应用于存储桶中的所有对象 ” 。

    • 在生产环境中,我们建议设置过滤器以限制复制范围内的内容。

c. 对于 目标 ,选择 在另一个账户中 指定存储桶 , 然后输入目标账号和受保护的存储桶名称。
d. 启用 “ 将对象所有权更改为目标存储桶所有者 ” 。
e. 对于 IAM 角色 选择从现有 IAM 角色 中选择, 然后选择 创建新角色
f. 在 加密 中 ,选中 “ 复制使用 亚马逊云科技 KMS 加密的对象 ” 复选框 。
g. 选择 输入 亚马逊云科技 KMS 密钥 ARN , 然后输入您之前创建的 KMS 密钥的目标账户 KMS 亚马逊资源名称 (ARN)。
h. 选择 “ 更改复制对象的存储类别”, 然后为 目标选择 S3 智能分层 。有关存储类别的更多详细信息,请参阅 Amazon S3 文档

3。在 其他复制选项中, 启用 复制指标和通知 以监控您使用 Amazon CloudWatch 进行的复制。(S3 复制指标的计费率与 亚马逊 CloudWatch 自定义 指标的计费率相同。)复制指标包括 “ 等待复制的 字节数 ” 、“ 复制延迟 ” 和 “ 等待复制的 操作 ” 。通过启用这些指标,您可以监控每分钟的复制进度,并使用它们来帮助进行故障排除。

a. 此处还有其他选项: 复制时间控制 (RTC) 删除标记 复制 和副本修改同步 。当我们为勒索软件防护实施复制时,您不希望启用 删除标记复制 , 因为这可能会从源存储桶中复制不需要的删除内容并在目标存储桶中创建删除标记。这将使删除标记成为副本中的当前版本,使对象看起来像已被删除,可能需要移除复制的删除标记才能简化恢复。 副本修改同步 将对副本副本所做的元数据更改复制回源对象,从而实现双向复制。由于目标包含黄金副本,因此不应对这些对象进行任何更改以将其复制回源文件。 复制时间控制 (RTC) 可在几秒钟内 复制您上传到 Amazon S3 的大多数对象,并设计为在 15 分钟内复制 99.99% 的对象。RTC 可帮助您满足数据复制的合规性或业务要求,默认情况下包括 S3 复制指标和 S3 事件通知。使用 S3 RTC 复制的数据每 GB 会产生额外费用。

4。选择 “ 保存 ” 。系统可能会提示您选择 “ 复制现有对象?” 如果您有现有对象,则可以选择此选项通过 S3 批量复制进行复制。在此示例中,选择 “ 否”,不 复制现有对象, 然后选择 “ 提交”。 您的复制规则应与以下屏幕截图类似。

How do you showcase the replication rule and see the scope of replication in your source and destination buckets along with the storage class. This is the Image -1 of a 2 part images.

How do you showcase the encryption settings with the additional replication options. This is the Image-2 of a 2 part images.

4。更新 亚马逊云科技 KMS 和身份和访问管理 (IAM) 权限

在本节中,您将更新成功完成复制所需的权限。同时使用 S3 复制、亚马逊云科技 KMS 和 S3 存储桶密钥时,您需要更新 亚马逊云科技 KMS、IAM 和亚马逊 S3 中的权限。

  1. 在源账户中,打开 亚马逊云科技 KMS 控制台并找到您之前创建的密钥。将复制规则创建的新 s3crr * 角色添加为密钥用户。 新创建的角色应命名为 s3crr _role_for _。

* s3crr_role_for 前缀已附加到复制角色

  1. 打开身份和访问管理 (IAM) 控制台,找到复制规则创建的角色。 新创建的角色应命名为 s3crr _role_for _。
  2. 您将需要更新 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>"
         ]
      }
   ]
}
  1. 在目标账户中,创建存储桶策略以允许从源账户存储桶进行复制。 需要根据您的值更改 粗体 项目
{
   "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>/*"
      }
   ]
}
  1. 通过将对象上传到源存储桶进行测试,验证该对象是否成功复制到受保护存储桶、属于配置的存储类别以及该对象是否已使用 S3 对象锁定锁定。

5。自动禁用 S3 复制规则

本部分介绍如何创建 CloudWatch 警报以监控源存储桶中的 PUT 事件。PUT 请求速率提高可能指向安全事件,例如您的环境中存在潜在的勒索软件活动(在本博客中,我们使用每分钟 10 个 PUT 请求的值作为示例)。如果超过警报阈值,Lambda 函数将停止您的 S3 复制规则。您也可以创建类似的函数来禁用删除操作的复制。考虑到您的 PUT 请求的平均数量,请记住使用阈值。这种自动化可以防止在安全事件发生期间将不需要的数据复制到您的目标存储桶。

The architecture layout illustrating the disabling of replication in between the source and the target accounts. This showcases the scenario when a threat has been detected and the replication has been stopped automatically as a response to the threat.

说明禁用复制的架构图

  1. 在 CloudWatch 控制台中,为 S3 PUT(PutRequest)指标在 1 分钟 P 周期内 超过 10 个创建新的警报 ,统计数据为 SUM。

a. PutRequest 指标值的 提高可能表示存在指向活跃攻击的异常。

This image shows how you can configure your CloudWatch metrics to create a custom alarm to identify a ransomware attack scenario and the parameters that quantify the logic for alarm triggering.

  1. 设置亚马逊 SNS 电子邮件通知。
  2. 创建新的 亚马逊云科技 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
  1. 创建新的亚马逊 EventBridge 规则,在亚马逊 CloudWatch 警报超过阈值时调用 亚马逊云科技 Lambda 函数。

正在清理

如果您继续操作并希望避免产生意外费用,请记住删除源存储桶和目标存储桶,并禁用源存储桶的版本控制。还要删除 亚马逊云科技 Lambda 函数、IAM 角色和 亚马逊云科技 KMS 密钥。

摘要

在这篇博客文章中,我们演示了一种保护您的业务关键资产的解决方案,该解决方案使用 Amazon S3 复制和 S3 对象锁来创建不可变的数据副本,以便安全地保存在具有受限访问权限的 亚马逊云科技 账户中。我们还介绍了 Amazon S3 智能分层如何允许您根据访问模式将隔离的、不可变的副本转换为更便宜的存储类别。

演示的解决方案可以使您扩大威胁缓解策略并保护关键业务数据,因为它可以在主要用途账户之外保留关键数据的隔离冗余副本。Amazon S3 Intelligent-Tiering 使您能够设置此解决方案,同时根据访问模式自动节省成本,从而节省威胁缓解策略。

在本系列 的 第 2 部分 中,我们将讨论使用第 1 部分中概述的过程恢复和恢复最初复制的对象。

有关确保源 Amazon S3 存储桶中存储的数据安全的其他建议,可在 勒索软件缓解策略白皮书 中找到。如果您有任何意见或问题,请随时将其留在评论部分。