在本文中,我们将探讨如何使用 Amazon GuardDuty 的新功能来保护 Amazon S3,该功能提供了通过多个扫描引擎自动扫描上传至 S3 的文档,检测潜在的恶意内容。这种方法减少了客户在管理隔离数据管道和计算基础设施上的负担,并保持了 S3 的可扩展性和可靠性。
Amazon Simple Storage ServiceAmazon S3是广泛使用的物件存储服务,以其可扩展性、可用性、耐用性、安全性和性能闻名。在组织间共享数据时,客户需将进来的数据视为不受信任,并在进行后续处理之前先评估是否存在恶意文件。传统上,这需要设置安全的暂存桶、部署第三方防病毒和防恶意软件扫描软件,并管理复杂的数据流程和处理架构。
为了满足 Amazon S3 中的病毒防护需求,Amazon Web ServicesAWS 推出了 Amazon GuardDuty 病毒防护功能。这一新功能为上传至 S3 桶的物件提供了恶意物件扫描,使用多个 AWS 开发和业界领先的第三方病毒扫描引擎。这样,不需要客户管理自己的隔离数据管道、计算基础设施和防病毒软件,从而实现无须妥协 S3 使用的规模、延迟和韧性即可获得恶意软件检测。
在这篇博客中,我们将分享一个解决方案,该方案利用 Amazon EventBridge、 AWS Lambda 和 Amazon S3 将扫描后的 S3 物件复制到目的 S3 桶。EventBridge 是一个无伺服器的事件总线,可用于构建事件驱动的架构和自动化业务工作流程。在该解决方案中,我们允许从放置在 S3 桶中的对象触发事件。这些事件可以由 Lambda 的无伺服器函数进行处理,以启动恶意扫描。我们还将展示如何扩展此解决方案以满足组织的其他特定用例。
GuardDuty 的 S3 病毒防护针对上传至 S3 桶的新物件提供了病毒和防病毒检测服务。可从 GuardDuty 的 AWS 管理控制台启用 S3 的病毒防护,并且不需要启用 GuardDuty 的威胁检测。如果启用了 GuardDuty 威胁检测,则检测到的恶意软件的安全发现也会发送到 GuardDuty。这使客户的开发或应用团队与安全团队能够协同工作,监视组织中 S3 桶的病毒防护。
当您的 AWS 帐户在某个 AWS 区域启用了 GuardDuty 时,该帐户将与一个称为 探测器 ID 的唯一区域实体相关联。GuardDuty 生成的所有发现和执行的 API 操作均与该探测器 ID 相关联。如果您不希望使用 GuardDuty,S3 的病毒防护可作为独立功能使用。独立使用时,S3 的病毒防护将不会创建相关联的探测器 ID。
当病毒扫描识别出可能的恶意对象时,如果您没有探测器 ID,则不会在您的 AWS 帐户中生成 GuardDuty 发现。GuardDuty 将发布病毒扫描结果到您默认的 EventBridge 事件总线,并将指标发送到 Amazon CloudWatch 命名空间,供您用于自动化进一步任务。
GuardDuty 管理错误处理和事件创建及发布的重新处理,以确保每个对象在被下游资源访问之前得到正确评估。GuardDuty 支持配置在整个过程中执行 Amazon S3 物件标签设置操作。
飞兔机场图 1 显示了 S3 物件扫描过程的高级概述。
启用和使用 GuardDuty 对 S3 的病毒防护需要您添加 AWS 身份与访问管理IAM 角色权限和特定的信任策略,以允许 GuardDuty 代表您执行病毒扫描。GuardDuty 提供了灵活性,可以启用该功能以适用于整个桶,或限制病毒扫描范围至特定物件前缀,GuardDuty 将扫描以最多五个选定前缀开头的每个上传对象。
要允许 GuardDuty 对 S3 的病毒防护扫描和添加标签到您的 S3 物件,您需要一个 IAM 角色,该角色包括执行以下任务的权限:
允许病毒防护假设 IAM 角色的信任策略。允许 EventBridge 操作以创建和管理 EventBridge 管理的规则,以允许 S3 的病毒防护监听您的 S3 物件通知。允许 Amazon S3 和 EventBridge 操作向 EventBridge 发送 S3 桶中的事件通知。允许 Amazon S3 操作访问上传的 S3 物件并将预定义标签 GuardDutyMalwareScanStatus 添加到扫描后的 S3 物件。如果您使用 AWS 密钥管理系统AWS KMS密钥加密 S3 桶,则必须允许 AWS KMS 密钥操作在扫描之前访问该对象。此 IAM 策略在每次您为帐户中的新桶启用 S3 的病毒防护时都是必需的。或者,在每次您启用病毒防护时,更新现有的 IAM PassRole 策略以包括另一个 S3 桶资源的详细信息。请参见 AWS 文档中需要的范例策略和权限。
当您启用 S3 物件标签时,GuardDuty 将添加一个预定义标签,键为 GuardDutyMalwareScanStatus,并且扫描的 S3 物件的潜在扫描结果值。这些标签使得能够实施 基于标签的访问控制TBAC 策略,使得在病毒扫描完成之前暂停对 S3 物件的访问。
AWS GuardDuty 使用者指南中的示例 S3 桶策略阻止除了 GuardDuty 病毒扫描服务主体以外的任何人从未标记为 GuardDutyMalwareScanStatus 并且当前值为 NOTHREATSFOUND 的特定 S3 桶中读取对象。该策略还帮助防止除了 GuardDuty 以外的其他角色或使用者添加 GuardDutyMalwareScanStatus 标签。
配置其他 IAM 角色的可选访问权限,以允许在对象标签后覆盖 GuardDutyMalwareScanStatus 标签。请通过在以下示例 S3 桶策略中替换 ltIAM角色名称gt 来实现此目的。
json{ Sid OnlyGuardDutyCanTag Effect Deny NotPrincipal { AWS [ arnawsiam555555555555root arnawsiam555555555555role/ltIAM角色名称gt arnawsiam555555555555assumedrole/ltIAM角色名称gt/GuardDutyMalwareProtection ] }}
如果您需要允许某些主体或角色读取失败或略过的对象,则可以更改策略。如果需要,您可以允许专用角色根据现有事件响应流程读取恶意对象。为此,请在 S3 桶策略中添加额外的声明,并在以下示例中替换 ltIAM角色名称gt 的值。
json{ Sid AllowSecurityTeamReadMalicious Effect Deny NotPrincipal { AWS [ arnawsiam555555555555role/ltIAM角色名称gt ] } Action [ s3GetObject s3GetObjectVersion ] Resource [ arnawss3DOC示例BUCKET arnawss3DOC示例BUCKET/ ] Condition { StringNotEquals { s3ExistingObjectTag/GuardDutyMalwareScanStatus THREATSFOUND } }}
此解决方案旨在简化 GuardDuty 对 S3 的病毒防护部署,帮助您维护安全可靠的 S3 存储环境,同时尽量减少病毒感染及其潜在后果的风险。解决方案提供多种配置选项,允许您创建新 S3 桶或使用现有的 S3 桶,启用与新或现有 AWS KMS 密钥的加密,并可以选择配置一个将标记定义的对象复制到目的 S3 桶的函数。复制功能提供了额外的保护层,将潜在的恶意文件与干净的文件分开,使您能够维护安全数据的单独存储库,以便持续的业务运营或进一步分析。
图 2 显示了解决方案架构。
在此解决方案中,您将使用以下 AWS 服务和功能:
事件追踪:此解决方案使用 EventBridge 规则监听已启用病毒扫描的特定 S3 桶的已完成病毒扫描结果事件。当 EventBridge 规则发现匹配的事件时,该规则传递所需的参数并触发将所需 S3 对象从来源桶复制到目的桶的 Lambda 函数。该事件模式使用以下格式:
json{ source [awsguardduty] detailtype [GuardDuty Malware Protection Object Scan Result] detail { scanStatus [COMPLETED] resourceType [S3OBJECT] s3ObjectDetails { bucketName [ltDOC示例BUCKET111122223333gt] } scanResultDetails { scanResultStatus [NOTHREATSFOUND] } }}
注意:将 bucketName 属性的值更改为您帐户中的桶。
任务协调:Lambda 函数处理从源桶到目标桶的 S3 对象复制逻辑,该目标桶刚刚被 GuardDuty 扫描。如果该对象是在新 S3 前缀内创建的,则将复制该前缀和对象。如果该对象被 GuardDuty 标记,则将复制该对象标签。该解决方案的 CloudFormation 模板为您提供多种部署场景,因此您可以选择最适合用例的场景。
接下来,请确保在您要测试此解决方案的 AWS 帐户和区域中部署 提供的 CloudFormation 模板。
部署 CloudFormation 模板的步骤:
点击 Launch Stack 按钮,在您的帐户中启动 CloudFormation 堆栈。请注意,该堆栈将在美国东部N Virginiauseast1