使用 AWS 服务对本地服务器进行恶意软件扫描分析
本地服务器恶意软件检测面临的挑战
受预算和资源限制,安全团队难以持续监控所有本地服务器。仅靠基于特征的防病毒软件是不够的,因为现代恶意软件使用了各种混淆技术。服务器管理员过去可能无法全面了解所有服务器上的安全事件。在事件响应期间,如果没有集中监控和告警,确定受损系统和可安全恢复的备份就变得极具挑战性。服务器管理员为高级威胁检测而设置和维护额外的安全工具也是一项繁重的工作。快速的平均检测和修复感染时间至关重要,但如果没有合适的自动化解决方案,就难以实现。
在事件响应期间,如果没有全面的威胁情报,确定哪个备份镜像是安全的也是一个难题。即使有备份可用,如果不知道系统是何时被入侵的,盲目从备份恢复也存在风险。这会增加恢复恶意软件并在事件响应中丢失更多宝贵数据和系统的可能性。因此需要一种自动化解决方案,能够精确定位入侵时间线并推荐安全的恢复备份。
如何使用 AWS 服务应对这些挑战
该解决方案利用 AWS Elastic Disaster Recovery (AWS DRS)、Amazon GuardDuty 和 AWS Security Hub 来解决本地服务器的恶意软件检测难题。
这套服务组合提供了一种经济高效的方式,在不影响性能的情况下持续监控本地服务器上的恶意软件。它还通过集中式威胁分析来确定入侵时间线,帮助确定安全的恢复时间点备份。
- AWS Elastic Disaster Recovery (AWS DRS) 使用经济实惠的存储、最少计算资源以及时间点恢复,通过快速可靠的本地和云端应用程序恢复,最大限度地减少停机时间和数据丢失。
- Amazon GuardDuty 是一项威胁检测服务,可持续监控您的 AWS 账户和工作负载中的恶意活动,并提供详细的安全发现用于可视化和修复。
- AWS Security Hub 是一项云安全态势管理 (CSPM) 服务,可执行安全最佳实践检查、聚合告警并启用自动修复。
架构

解决方案描述
此恶意软件扫描解决方案假定本地服务器已通过 AWS DRS 进行复制,并且已启用 Amazon GuardDuty 和 AWS Security Hub。本仓库中的 cdk 堆栈仅部署架构图中标记为“DRS Malware Scan”的组件。
- AWS DRS 将源服务器从本地环境复制到 AWS(或任何其他云提供商)。有关设置 AWS DRS 的更多详细信息,请遵循 快速入门指南。
- Amazon GuardDuty 已启用。
- AWS Security Hub 已启用。
- 恶意软件扫描解决方案由 Amazon EventBridge 中的计划规则(前缀为 DrsMalwareScanStack-ScheduleScanRule)触发。您可以根据需要调整扫描频率(例如每天一次、每周一次等)。
- Amazon EventBridge 中的计划规则触发 Submit Orders lambda 函数(前缀为 DrsMalwareScanStack-SubmitOrders),该函数从 Source Servers DynamoDB 表中收集要扫描的源服务器。
- 订单被放置到名为 Scan Orders 的 SQS FIFO 队列(前缀为 DrsMalwareScanStack-ScanOrdersfifo)中。该队列用于序列化映射到同一 DRS 实例的扫描请求,防止竞争条件。
- Process Order lambda 函数从队列中取出一个恶意软件扫描订单并对其进行丰富,为即将进行的恶意软件扫描操作做准备。例如,它插入与订单中提供的 DRS 源服务器相关联的复制 DRS 实例的 ID。Process Order 的输出是包含调用 GuardDuty 恶意软件扫描所需全部信息的恶意软件扫描命令。
- 恶意软件扫描操作在卷级别使用 DRSVolumeAnnotationsDDBTable 进行跟踪,提供报告能力。
- 恶意软件扫描命令被插入到 Scan Commands SQS FIFO 队列(前缀为 DrsMalwareScanStack-ScanCommandsfifo)中,以增强弹性。
- Process Commands 函数以每秒最多 1 个命令的速率提交排队的扫描命令,以避免 API 限流。它会触发 Amazon GuardDuty 提供的 按需恶意软件扫描功能。
- 可在 Amazon GuardDuty 服务中监视按需 Amazon GuardDuty 恶意软件作业的执行情况。
- 恶意软件扫描作业的结果被路由到 Amazon CloudWatch Logs。
- Subscription Filter lambda 函数接收扫描结果,并使用 DynamoDB 跟踪结果(步骤 #14)。
- DRS Instance Annotations DynamoDB 表在实例级别跟踪恶意软件扫描作业的状态。
- 名为 ScanReportStack 的 CDK 堆栈部署了 Scan Report lambda 函数(前缀为 ScanReportStack-ScanReport),用于填充前缀为 scanreportstack-scanreportbucket 的 Amazon S3 存储桶。
- AWS Security Hub 聚合并关联来自 Amazon GuardDuty 的发现。
- Security Hub 发现事件被 EventBridge 规则(前缀为 DrsMalwareScanStack-SecurityHubAnnotationsRule)捕获。
- Security Hub Annotations lambda 函数(前缀为 DrsMalwareScanStack-SecurityHubAnnotation)会向该发现生成附加说明(注释),其中包含有关受影响源服务器的上下文信息。这些额外信息可以在 Security Hub 发现中的“Notes”部分看到。
- 后续操作将取决于所采用的应急响应流程。例如,根据感染日期,可以使用 AWS DRS 通过感染日期之前的快照执行时间点恢复。
- 在多账户场景中,此解决方案可以直接部署在托管 AWS DRS 解决方案的 AWS 账户上。Amazon GuardDuty 发现将自动发送到集中式安全账户。
使用方法
前提条件
-
一个 AWS 账户。
-
已配置 Amazon Elastic Disaster Recovery (DRS),且至少有一个源服务器处于同步状态。如果没有,请查看此 文档。复制配置必须考虑使用 AWS Key Management Service (AWS KMS) 中的客户管理密钥 (CMK) 进行 EBS 加密。Amazon GuardDuty Malware Protection 不支持 EBS 的默认 AWS 托管密钥。
-
用于部署此解决方案组件的 IAM 权限。
-
已启用 Amazon GuardDuty。如果没有,请查看此 文档。
-
已启用 Amazon Security Hub。如果没有,请查看此 文档
警告
目前,Amazon GuardDuty 恶意软件扫描不支持使用 EBS 托管密钥加密的 EBS 卷。如果您希望使用此解决方案扫描通过 DRS 复制的本地(或其他云)服务器,您需要使用自己的 KMS 加密密钥设置 DRS 复制。如果您目前对复制的服务器使用 EBS 托管密钥,您可以在 DRS 控制台中更改加密设置以使用您自己的 KMS 密钥。
部署
-
创建一个 Cloud9 环境,使用 Ubuntu 镜像(至少 t3.small 以获得更好的性能),位于您的 AWS 账户中。打开您的 Cloud9 环境并克隆本仓库中的代码。注意:Amazon Linux 2 带有 node v16,自 2023-09-11 起不再受支持。
git clone https://github.com/aws-samples/drs-malware-scan
cd drs-malware-scan
sh check_loggroup.sh
-
部署 CDK 堆栈,在 Cloud9 终端中运行以下命令并确认部署。
npm install
cdk bootstrap
cdk deploy --all
注意
该解决方案由两个堆栈组成:
- DrsMalwareScanStack:部署恶意软件扫描功能所需的所有资源。此堆栈是必需的。如果您只想部署此堆栈,可以运行
cdk deploy DrsMalwareScanStack
- ScanReportStack:部署报告所需的资源(Amazon Lambda 和 Amazon S3)。此堆栈是可选的。如果您只想部署此堆栈,可以运行
cdk deploy ScanReportStack
如果您想部署两个堆栈,可以运行 cdk deploy --all。
配置
-
确保 DRS 源服务器持续复制并且处于健康复制状态。这是必需的,因为 GuardDuty API 存在限制:撰写本文时,没有公开的 AWS API 来扫描 DRS 快照。对 DRS 源服务器数据进行恶意软件扫描的唯一方法是扫描由 AWS DRS 管理的复制服务器(Amazon EC2 实例)。如果复制未以健康状态运行,您的 DRS 恶意软件扫描可能无法成功完成。您必须确认 ReadyforRecovery=Ready。
-
识别要扫描的源服务器。从所有通过 AWS DRS 复制的服务器中,您需要确定要扫描的候选服务器列表。从 AWS DRS 控制台,复制您希望解决方案扫描的源服务器名称,并将其粘贴到文本编辑器中。这将在下一步中使用。

- 更新 DynamoDB 表。要扫描的服务器列表存储在 CDK 堆栈创建的 DynamoDB 表中(前缀为 DrsMalwareScanStack-SourceServersDDBTable)。您需要为每个由 AWS DRS 复制的源服务器创建 DynamoDB 项。为此,请转到 Amazon DynamoDB 服务并按照以下步骤操作:

- 安排恶意软件扫描作业。您可以转到 Amazon EventBridge 服务并修改由堆栈创建的现有规则。编辑前缀为 DrsMalwareScanStack-ScheduleScanRule 的规则,设置恶意软件扫描分析的扫描频率。此外,此规则默认是禁用的,请启用它。

- 检查 Amazon GuardDuty 是否触发了恶意软件扫描操作。为了确认解决方案按预期工作,您可以检查 Amazon GuardDuty -> Malware scans 控制台。在计划时间过后几秒钟,您应该会看到一个 ScanStatus = Running 的作业。如果没有,请查看下面的故障排除部分。

- 检查 AWS SecurityHub 是否存在本地服务器上的潜在恶意软件发现。Amazon GuardDuty 与 Security Hub 的集成使您能够将 GuardDuty 的发现发送到 Security Hub。
- Security Hub 只显示发现,因此那些 ScanResult=Clean 的恶意软件扫描作业不会显示在 Security Hub 控制台中(只有那些 ScanResult=Infected 的会显示)。
- 在 AWS Security Hub 控制台中,您可以转到“发现”并应用过滤器 ProductName=GuardDuty(如下面的动画所示)。
- 该解决方案会在发现的“Notes”部分添加注释,突出显示被感染的本地服务器的名称。
- Security Hub 与 Amazon EventBridge 集成,可以轻松自动化响应和修复活动,例如向 SOC 发送电子邮件、在 Slack 频道中报告事件等。您可以查看此 链接 获取更多详细信息。

-
可选:检查 S3 上的恶意软件扫描报告文件。如果您已部署 ScanReportStack 堆栈,则可以根据需要按计划运行报告。该报告将提取 DRSVolumeAnnotationsDDBTable DynamoDB 表的内容,并将其写入堆栈创建的 Amazon S3 存储桶(前缀为 scanreportstack-scanreportbucket)。每次触发规则时,此报告都会被覆盖(并且是累积的)。
- 启用 Amazon EventBridge 规则并设置计划以运行报告:编辑前缀为 ScanReportStack-ScanReportRule 的规则,设置恶意软件扫描分析的扫描频率和要分析的 DRS 源服务器列表。此外,此规则默认是禁用的,请启用它。

- 要检查报告,您可以查询 Amazon S3 存储桶(前缀为 scanreportstack-scanreportbucket)上的 csv 文件。

-
可选:多账户配置。如果您有一个指定的安全账户作为多账户策略的一部分来集中所有安全发现,此解决方案也将适用。安全团队可以在安全账户上执行相同的分析,关联账户中报告的 Security Hub 和 GuardDuty 发现会自动复制到集中式安全账户。
故障排除