自动扫描公共 Amazon S3 存储桶并阻止公有访问

Olawale Olaleye
难度
300 - 高级
时间
20 分钟
前提条件

海外区域: 注册 / 登录 亚马逊云科技

上次更新时间
2024 年 8 月 23 日

数据是组织的宝贵资产,为此用户一直在寻找可以保护数据免受未经授权访问的简易工具。尽管某些用例在部分情况下需要允许对数据的公有访问,但对于大部分企业用例和数据隐私而言,设置严格管理的权限并阻止公有访问仍十分必要。

Amazon S3 对象存储广泛适用于多种企业用例,例如云应用程序、动态网站、内容分发、移动应用程序和游戏应用程序等。随着 Amazon S3 逐渐成为组织多元化和中心化的数据存储方式,保持数据的私密性至关重要,除非组织需要允许公有访问。默认情况下,新的 Amazon S3 存储桶会在存储桶级别启用 Amazon S3 阻止公有访问禁用访问控制列表 (ACL),并加密所有新对象。此外,为了确保阻止对您的 Amazon S3 存储桶和对象的公有访问,您还可以在账户级别启用 Amazon S3 阻止公有访问功能。尽管这些功能能够建立强大的安全态势,但无意或错误的操作、具有过度访问权限的用户、甚至是恶意活动仍会导致所创建的 Amazon S3 存储桶的 Amazon S3 阻止公有访问功能被禁用,或在需要启用该功能的情况下使现有存储桶的 Amazon S3 阻止公有访问功能被禁用。

本文将向您介绍一种主动的事件驱动型解决方案,利用 AWS Security Hub 检测公共 Amazon S3 存储桶并在存储桶级别自动启用 Amazon S3 阻止公有访问功能。如果您在某些情况下需要允许对 Amazon S3 存储桶的公有访问,那么您可以对这些 Amazon S3 存储桶进行标记(例如,tag_key = “bucket.status” & tag_value = “public.bucket”)。该解决方案基于成本效益高且易于部署的事件驱动型架构构建,可确保具有私密性需求的存储桶保持私密,从而帮助您提升组织的整体安全态势和运营可靠性。

解决方案概述

下图展示了该事件驱动型架构的组成部分。

总体而言,本解决方案包含以下流程:

1. AWS Security Hub 检查 Amazon S3 存储桶的合规性和安全性。

2. 将调查结果发送至 Amazon EventBridge

3. Amazon EventBridge 调用以下两个目标:

a. AWS Lambda 函数,其中包含根据特定资源标签阻止对 Amazon S3 存储桶的公有访问的逻辑。

b. Amazon CloudWatch 日志组,该日志组会触发 Amazon CloudWatch 警报,接着该警报会向 Amazon SNS 主题发送通知。

4. 随后,Amazon SNS 主题生成电子邮件通知,告知检测到公共 Amazon S3 存储桶。

本解决方案使用的是 “GetBucketTagging” 应用程序接口 (API) 操作,该操作会返回与 Amazon S3 存储桶相关的标签。本文中分享的 AWS Lambda 函数会遍历标签键值对,并检查是否存在特定的标签键值对(例如,tag_key = “bucket.status” & tag_value = “public.bucket”)。如果存在特定的标签键值对,则本解决方案不会对这些存储桶启用 Amazon S3 阻止公有访问功能;反之,则会对这些存储桶启用 Amazon S3 阻止公有访问功能。除非您希望允许对 Amazon S3 存储桶的公有访问,否则您必须启用 Amazon S3 阻止公有访问功能。

先决条件

正式进入本次演示前,您需要准备以下内容:

具备更新 Amazon S3 阻止公有访问设置的 AWS Lambda 函数访问权限的 Amazon S3 存储桶策略

演示

以下各节将逐步引导您实现本解决方案:

  1. 配置 AWS Security Hub
  2. 设置 AWS Lambda 函数
  3. 配置 Amazon EventBridge 规则和目标
  4. 设置 Amazon CloudWatch 指标和警报

1) 配置 AWS Security Hub

在此前发布的《在您的亚马逊云科技账户中查找公共 Amazon S3 存储桶》中,我们向您介绍了多种亚马逊云科技服务以检测您组织中位于不同亚马逊云科技区域的公共 Amazon S3 存储桶。其中便包含 AWS Security Hub,这是一项云安全态势管理 (CSPM) 服务,可用于执行安全最佳实践检查、汇总警报和启用自动修复。

您可以使用亚马逊云科技基础安全最佳实践 (FSBP) 标准的控制来通过 AWS Security Hub 监控公共 Amazon S3 存储桶。其中,AWS Security Hub 会使用与服务连接的 AWS Config 规则对大部分控制进行安全检查。开始操作时,请遵循以下步骤:

  1. 启用各亚马逊云科技区域中所有账户的 AWS Config。
  2. 通过集成 AWS Organizations 或手动启用 AWS Security Hub。
  3. 启用 AWS Security Hub 中的亚马逊云科技基础安全最佳实践标准

本文使用的 FSBP 安全控制为 [S3.8] Amazon S3 通用存储桶应阻止公有访问。该控制会检查 Amazon S3 通用存储桶是否在存储桶级别阻止了公有访问。下图为 AWS Security Hub 对公共 Amazon S3 存储桶的调查结果

AWS Security Hub 会将新的调查结果以及对现有调查结果的更新内容作为 AWS Security Hub 调查结果—导入事件自动发送至 Amazon EventBridge。也就是说,AWS Security Hub 在持续监控期间只要检测到公共 Amazon S3 存储桶,就会向 Amazon EventBridge 发送事件。

2) 设置 AWS Lambda 函数

AWS Lambda 函数是一项无服务器计算服务,可以在未配置服务器的情况下运行代码。在本解决方案中,Amazon EventBridge 事件会调用“BlockPublicS3Bucket”AWS Lambda 函数来阻止对 Amazon S3 存储桶的公有访问。该函数的具体操作如下:

1. 使用 JSONPath 表达式识别 Amazon S3 存储桶的名称。

2. 遍历 Amazon S3 存储桶标签并检查是否存在特定的标签键值对。本文中使用的标签键值对示例如下:

bucket_tag_key = "bucket.status"
bucket_tag_value = "public.bucket"

3. 如果未找到该标签,则该函数会继续使用 put_public_access_block API 调用来为存储桶设置阻止公有访问配置。

4. 如果找到该标签,则该函数会跳过公有访问阻止并记录消息。

通过这种方式,该函数仅会在 Amazon S3 存储桶不存在特定标签时阻止公有访问。该 AWS Lambda 函数的使用前提如下:

  • 有权访问亚马逊云科技服务和资源的 AWS Lambda 执行 IAM 角色
  • 具备更新 Amazon S3 阻止公有访问设置的 AWS Lambda 函数访问权限的 Amazon S3 存储桶策略。下方为具体示例。
{
    "Version": "2012-10-17",
    "Id": "BlockPublicAccess",
    "Statement": [
        {
            "Sid": "LambdaAccess",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:role/service-role/BlockPublicS3Bucket-role-123"
            },
            "Action": [
                "s3:GetBucketTagging", 
                "s3:PutBucketPublicAccessBlock"
            ],
            "Resource": "arn:aws:s3:::my-bucket"
        }
    ]
}

您可以在此亚马逊云科技示例中找到该 AWS Lambda 函数。

3) 配置 Amazon EventBridge 规则和目标

Amazon EventBridge 是一项无服务器服务,可用于构建可扩展的事件驱动型应用程序。借助 Amazon EventBridge,您可以监控和审计亚马逊云科技环境,并近乎实时地响应应用程序中的操作变更,从而避免基础设施漏洞。Amazon EventBridge 规则可用于监控特定类型的事件。当出现匹配事件时,该事件会被路由至与规则关联的目标。Amazon EventBridge 规则会使用事件模式来选择事件并将其发送至目标,并且一个规则可与一个或多个目标关联。本节将介绍如何创建 Amazon EventBridge 规则以及与之关联的两个目标。

1. 创建 Amazon EventBridge 规则来监控 AWS Security Hub 生成的 Amazon S3 存储桶事件。请参阅创建可响应事件的规则的文档。您可以在此链接中找到 AWS Security Hub 事件示例。

2. 选择 Rule with an event pattern。使用以下事件模式来匹配 AWS Security Hub 生成的公共 Amazon S3 存储桶事件。

{
  "source": ["aws.securityhub"],
  "detail-type": ["Security Hub Findings - Imported"],
  "detail": {
    "findings": {
      "Compliance": {
        "Status": ["FAILED"],
        "SecurityControlId": ["S3.8"]
      },
      "RecordState": ["ACTIVE"],
      "Workflow": {
        "Status": ["NEW"]
      }
    }
  }
}

3. 添加本解决方案中的 AWS Lambda 函数,并添加 Amazon CloudWatch 日志组作为目标(如代码块下方的截图所示):

a. 添加上一节中的“BlockPublicS3Bucket”AWS Lambda 函数。

b. 添加 Amazon CloudWatch 日志组作为目标。借助 Amazon CloudWatch,您可以监控整个堆栈,利用日志、指标和警报采取自动操作,以及缩短平均问题解决时间。为了将事件数据发送至目标日志组, Amazon EventBridge 需要获取访问目标日志组的权限。下方示例策略文档列举了您需要在日志组基于资源的策略中定义的权限。有关更多说明,请参阅 Amazon CloudWatch 日志权限

{
  "Version": "2012-10-17",
  "Id": "CloudWatchLogforEventBridge 
  "Statement": [
    {
      "Action": [
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "events.amazonaws.com",
          "delivery.logs.amazonaws.com"
        ]
      },
      "Resource": "arn:aws:logs:<region>:<123456789012>:log-group:/aws/events/*:*",
      "Sid": "TrustEventsToStoreLogEvent"
    }
  ]
}

4. 配置标签并审查规则后,选择 Create rule

4) 设置 Amazon CloudWatch 指标和警报

将事件发送至 Amazon CloudWatch 日志组后,您需要配置 Amazon CloudWatch 指标和警报。

1. 创建 Amazon CloudWatch 指标筛选器来捕获 [S3.8] Amazon S3 通用存储桶应阻止公有访问事件,并将其转换为 Amazon CloudWatch 数值指标。您可以借助指标筛选器将日志数据转换为可操作的指标。筛选器模式仅会返回包含您所定义的术语的日志事件。通过这种方式来创建警报或将日志事件路由至其他亚马逊云科技服务十分具备成本效益。如要创建指标筛选器,请参阅为日志组创建指标筛选器的文档。

2. 使用自定义指标创建 Amazon CloudWatch 警报。相关说明,请参阅为 AWS CloudTrail 事件创建 Amazon CloudWatch 警报的文档(包含示例)。在 Configure actions 页面,选择 Notification,接着选择 In alarmIn alarm 选项表示超出阈值时会采取向 Amazon SNS 主题发送通知的操作。当您所创建的 Amazon CloudWatch 警报的状态发生变化时,Amazon SNS 会向订阅终端或客户端发送电子邮件通知。如要创建 Amazon SNS 主题,请遵循创建 Amazon SNS 主题的文档中的步骤。

清理

为避免在亚马逊云科技账户中产生持续费用,请确保清除此前为本文所创建的所有资源。请务必删除 AWS Lambda 函数、 Amazon S3 存储桶、 Amazon CloudWatch 警报、 Amazon SNS 主题及其他已配置的亚马逊云科技服务,以避免产生不必要的费用。

总结

本文向您介绍了一种利用 AWS Security Hub 检测公共 Amazon S3 存储桶并在存储桶级别自动启用 Amazon S3 阻止公有访问功能的主动事件驱动型解决方案。首先,我们使用 AWS Security Hub 检查 Amazon S3 存储桶的合规性和安全性,并将调查结果发送至 Amazon EventBridge;接着,使用 Amazon EventBridge 调用 AWS Lambda 函数和 Amazon CloudWatch 日志组,其中 AWS Lambda 函数会根据特定的资源标签阻止对 Amazon S3 存储桶的公有访问,而 Amazon CloudWatch 日志组会触发警报通知,告知检测到公共 Amazon S3 存储桶。

请务必仔细设计和实现自动修复工作流程,并对其进行全面测试,以避免对您的应用程序造成意外后果或中断。除非您希望允许对 Amazon S3 存储桶的公有访问,否则您必须在存储桶级别和账户级别启用 Amazon S3 阻止公有访问功能。保护数据免受意外访问非常重要,利用本文中介绍的解决方案,您可以确保避免意外泄露或公开共享数据。正式开始操作前,请务必查看本文所涉及的各项服务的定价页面。

更多教程

快速搭建容量高达 35GB 的免费个人网盘

本教程将介绍如何搭建一个没有使用限制的免费私人网盘。

构建企业专属智能客服机器人

本文将演示如何结合多种服务,打造企业专属的智能客服。

使用生成式 AI 构建多语言问答知识库

使用多种服务,构建可汇总搜索结果的多语言知识库。

查看全部教程 >>

免费套餐

AWS 海外区域

拓展海外业务或个人体验
免费使用 100 余种云产品或服务, 长达 12 个月

AWS 中国区域

发展中国业务
免费使用 40 余种核心云服务产品,长达 12 个月