如何使用 Amazon Transfer Family 和 GuardDuty 保护恶意软件

作者: James Abbott, Suhas Pasricha, Santhosh Srinivasan |

组织通常需要通过互联网安全地与外部各方共享文件。允许公众访问文件传输服务器会使组织面临潜在威胁,例如威胁行为者上传的受恶意软件感染的文件或真实用户无意中上传的受恶意软件感染的文件。为了降低这种风险,公司可以采取措施帮助确保在处理之前对通过公共渠道收到的文件进行恶意软件扫描。

这篇文章演示了如何使用 Amazon Transfer Family 和 Amazon GuardDuty 扫描通过安全 FTP(SFTP)服务器上传的文件中是否存在恶意软件,这是整个传输流程的一部分。对于可能已经阅读过之前有关该主题的博客文章的读者来说,关键区别在于该解决方案是完全托管的,不需要部署计算资源。GuardDuty 每 15 分钟自动更新恶意软件签名,而不是使用容器映像进行扫描,从而无需手动修补以保持签名最新状态。

先决条件

要部署这篇文章中的解决方案,你需要:

  • 亚马逊云科技账户:您需要访问亚马逊云科技才能部署此解决方案。如果您没有可以使用的账户,请参阅立即开始在亚马逊云科技上构建。
  • 亚马逊云科技 CLI:安装和配置亚马逊云科技命令行接口 (亚马逊云科技 CLI),以便对您的亚马逊云科技账户进行身份验证。使用环境的访问令牌和私有访问密钥为您的亚马逊云科技账户设置环境变量。
  • Git:您将使用 Git 从 GitHub 中提取示例代码。
  • Terraform:你将使用 Terraform 来运行自动化。按照 Terraform 安装说明下载和设置 Terraform。

解决方案概述

该解决方案使用 Transfer Family 和 GuardDuty。Transfer Family 提供安全的文件传输服务,可用于设置 SFTP 服务器,而 GuardDuty 是一项智能威胁检测服务。GuardDuty 监控恶意活动和异常行为,以保护亚马逊云科技账户、工作负载和数据。总体而言,该解决方案使用以下步骤:

  • 用户通过 Transfer Family SFTP 服务器上传文件。
  • Transfer Family 托管的工作流程调用 Amazon Lambda 来执行 Amazon Step Functions 工作流程。
    • 只有在成功上传文件后,工作流程才会开始。
    • 部分上传到 SFTP 服务器将调用错误处理 Lambda 函数来报告部分上传错误。
  • 步进函数状态机调用 Lambda 函数将上传的文件移至 Amazon Simple Storage Service (Amazon S3) 存储桶进行处理,然后使用 GuardDuty 开始扫描。
  • GuardDuty 扫描结果作为回调发送到步进函数。
  • 受感染文件被移动或清除。
  • 该工作流程通过 Amazon Simple Notification Service (Amazon SNS) 主题向用户发送结果。这可以是扫描期间出现错误或恶意上传的通知,也可以是成功上传的通知和用于进一步处理的干净扫描。

解决方案架构和演练

该解决方案使用适用于 S3 的 GuardDuty 恶意软件保护来扫描新上传到 S3 存储桶的对象。您可以使用 GuardDuty 的此功能在存储桶级别为 S3 存储桶设置恶意软件保护计划,或监视特定的对象前缀。

图 1:解决方案架构

图 1:解决方案架构

以下步骤(如图 1 所示)描述了此解决方案的工作流程,从文件上传开始,直到扫描文件并将其标记为安全或被感染,然后是可以根据您的用例自定义后续步骤。

  1. 使用 SFTP 协议通过 Transfer Family 上传文件。
  2. 如果文件成功上传,Transfer Family 会将文件上传到名为"未扫描"的 S3 存储桶,并触发托管工作流程完成工作流程。这是用于处理成功上传和调用步骤函数调用器 Lambda 函数的工作流程。
  3. 步进函数调用器启动状态机,并通过调用 GuardDuty — Scan Lambda 函数启动该过程的第一步。
  4. GuardDuty — Scan 功能可将文件移至处理存储桶。这是要从中扫描文件的存储桶。
  5. 当检测到对象上传活动时,GuardDuty 会自动扫描该对象。在此实施中,为处理存储桶创建了恶意软件保护计划。
  6. 扫描完成后,GuardDuty 会将扫描结果发布到 Amazon EventBridge。
  7. 已创建一个 EventBridge 规则,用于在扫描事件完成时调用 Lambda 回调函数。EventBridge 将使用包含扫描结果的事件调用该函数。有关示例,请参见使用 Amazon EventBridge 监控 S3 对象扫描。
  8. Lambda 回调函数使用回调任务集成模式通知 GuardDuty — Scan 任务。GuardDuty 扫描的结果将返回到 GuardDuty — Scan 函数,并将这些结果传递给"移动文件"任务。
  9. 如果结果是未检测到威胁的干净扫描,则移动文件任务会将文件放入 Clean S3 存储桶中,这表明文件已成功扫描并且可以安全地进行进一步处理。
  10. 此时,"移动文件"功能会向 Success SNS 主题发布通知,以通知订阅者。
  11. 如果结果表明该文件是恶意的,则移动文件功能将改为将文件移至 Quarantine S3 存储桶以进行进一步调查。该函数还将从 Processing 存储桶中删除该文件,并在 SNS 的错误主题中发布通知,通知用户可能有恶意文件正在上传。
  12. 如果文件上传不成功且文件未完全上传,则 Transfer Family 将触发"部分受管工作流程"工作流程。
  13. Managed Workflow Partial 是一个错误处理工作流,它调用错误发布器函数,该函数用于报告工作流中任何地方发生的错误。
  14. Error Publisher 函数可识别错误的类型(无论是由于部分上传还是工作流程中的其他问题),并相应地设置错误状态。然后,它将向 SNS 中的错误主题发布一条错误消息。
  15. GuardDuty — Scan 任务设置了超时时间,以确保将事件发布到错误主题,从而提示手动干预以进一步调查文件是否未成功扫描。如果 GuardDuty — Scan 任务失败,则会调用错误清理 Lambda 函数。

最后,还有一个 S3 生命周期策略附加到处理存储桶。这是为了确保处理存储桶中剩余的文件不超过一天。

代码存储库

GitHub 亚马逊云科技-Samples 存储库有一个使用基于 Terraform 和基于 Python 的 Lambda 函数开发的示例实现,用于实现该解决方案。同样的解决方案也可以使用 Amazon CloudFormation 来实现。该代码包含部署整个工作流程所需的组件,以演示 Transfer Family 和 GuardDuty 恶意软件保护计划的能力。

安装解决方案

使用以下步骤将此解决方案部署到您的测试环境。

  1. 使用 Git 将存储库克隆到您的工作目录。
  2. 导航到克隆项目目录的根目录。
  3. 使用您选择的 S3 存储桶名称、SFTP 服务器名称和其他变量的值更新 terraform locals.tf 文件。
  4. 运行 terraform plan
  5. 如果一切看起来都不错,请运行 terraform apply 并输入 yes 来创建资源。

清理干净

在测试和探索解决方案之后,清理您创建的资源以避免产生不必要的成本非常重要。要删除此解决方案创建的资源,请导航到克隆项目的根目录并运行以下命令:

terraform destroy

此命令将移除 Terraform 创建的资源,包括 SFTP 服务器、S3 存储桶、Lambda 函数和其他组件。出现提示时输入 yes 以确认删除。

结论

通过使用帖子中概述的方法,您可以确保扫描通过 SFTP 接收并上传到 S3 存储桶的文件是否存在威胁,并且可以安全地进行进一步处理。该解决方案通过确保在将公开上传的文件发送到系统的其他组件之前,在安全的环境中对其进行扫描,从而减少了曝光面。

如果你对这篇文章有反馈,请在下面的评论部分提交评论。

詹姆斯·阿伯特

James Abbott

James 是亚马逊云科技的首席解决方案架构师,在全球金融服务部门工作。不在办公室时,他喜欢在北卡罗来纳州骑山地自行车。

桑托什·斯里尼瓦桑

Santhosh Srinivasan

Santhosh 是亚马逊云科技专业服务团队的高级云应用程序架构师。他专门研究云端大规模企业应用程序的构建和现代化,重点是金融服务行业。

苏哈斯·帕斯里查

Suhas Pasricha

Suhas 是亚马逊云科技专业服务团队的云基础设施架构师。他有 Web 开发和基础设施自动化方面的背景。在亚马逊,他一直在帮助客户设置和运营企业范围的着陆区和云环境。在业余时间,他喜欢阅读和玩电子游戏。


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。