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

此恶意软件扫描解决方案假定本地服务器已通过 AWS DRS 进行复制,并且已启用 Amazon GuardDuty 和 AWS Security Hub。本仓库中的 cdk 堆栈仅部署架构图中标记为“DRS Malware Scan”的组件。
一个 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
注意
该解决方案由两个堆栈组成:
cdk deploy DrsMalwareScanStackcdk deploy ScanReportStack如果您想部署两个堆栈,可以运行 cdk deploy --all。
确保 DRS 源服务器持续复制并且处于健康复制状态。这是必需的,因为 GuardDuty API 存在限制:撰写本文时,没有公开的 AWS API 来扫描 DRS 快照。对 DRS 源服务器数据进行恶意软件扫描的唯一方法是扫描由 AWS DRS 管理的复制服务器(Amazon EC2 实例)。如果复制未以健康状态运行,您的 DRS 恶意软件扫描可能无法成功完成。您必须确认 ReadyforRecovery=Ready。
识别要扫描的源服务器。从所有通过 AWS DRS 复制的服务器中,您需要确定要扫描的候选服务器列表。从 AWS DRS 控制台,复制您希望解决方案扫描的源服务器名称,并将其粘贴到文本编辑器中。这将在下一步中使用。





可选:检查 S3 上的恶意软件扫描报告文件。如果您已部署 ScanReportStack 堆栈,则可以根据需要按计划运行报告。该报告将提取 DRSVolumeAnnotationsDDBTable DynamoDB 表的内容,并将其写入堆栈创建的 Amazon S3 存储桶(前缀为 scanreportstack-scanreportbucket)。每次触发规则时,此报告都会被覆盖(并且是累积的)。


可选:多账户配置。如果您有一个指定的安全账户作为多账户策略的一部分来集中所有安全发现,此解决方案也将适用。安全团队可以在安全账户上执行相同的分析,关联账户中报告的 Security Hub 和 GuardDuty 发现会自动复制到集中式安全账户。
所有 lambda 函数都会将日志路由到 Amazon CloudWatch。您可以通过检查每个函数的相应 CloudWatch 日志组来验证每个函数的执行情况,查找 /aws/lambda/DrsMalwareScanStack-* 模式。
恶意软件扫描操作的持续时间取决于要扫描的服务器/卷的数量(及其大小)。当 Amazon GuardDuty 发现恶意软件时,它会生成一个 SecurityHub 发现:该解决方案拦截此事件,并运行 $StackName-SecurityHubAnnotations lambda 来增强 SecurityHub 发现,添加一条包含检测到恶意软件的 DRS 源服务器名称的注释。
可以使用 AWS SQS 控制台中的 Messages available 和 Message in flight 指标来监控 SQS FIFO 队列。
DRS Volume Annotations DynamoDB 表会跟踪每次恶意软件扫描操作的状态。
Amazon GuardDuty 有记录跳过扫描操作的原因。有关更多信息,请查看 恶意软件扫描期间跳过资源的原因
要分析 Amazon GuardDuty 恶意软件扫描操作的日志,您可以检查 /aws/guardduty/malware-scan-events Amazon CloudWatch 日志组。此日志组的默认日志保留期为 90 天,之后日志事件将被自动删除。
在您的终端中运行以下命令:
cdk destroy --all
(可选)删除与 Lambda 函数关联的 CloudWatch 日志组。
为了进行此分析,我们假设了一个虚构场景作为示例。以下成本估算基于位于北弗吉尼亚(us-east-1)区域的服务。
| 每月成本 | 12 个月总成本 |
|---|---|
| 171.22 美元 | 2,054.74 美元 |
注意 这里显示的数字是基于上述假设的估算值,源自 AWS 定价计算器。有关更多详细信息,请查看此 定价计算器 作为参考。您可以在引用的计算器中调整服务配置以进行自己的估算。此估算不包括可能适用的税款或额外费用。请务必记住,实际费用可能因使用情况和本分析未涵盖的任何额外服务而有所不同。对于关键环境,建议包含 商业支持计划(估算中未考虑)。
有关更多信息,请参见 CONTRIBUTING。
此示例代码根据 MIT-0 许可证授权。请参阅 LICENSE 文件。
| 服务名称 | 描述 | 每月成本(美元) |
|---|
| AWS Elastic Disaster Recovery | 2 个源服务器 / 1 个复制服务器 / 4 个磁盘 / 100GB / 30 天 EBS 快照保留期 | 71.41 |
| Amazon GuardDuty | 每月扫描 3 TB 恶意软件 | 94.56 |
| Amazon DynamoDB | 100MB 1 读取/秒 1 写入/秒 | 3.65 |
| AWS Security Hub | 1 个账户 / 100 次安全检查 / 1000 条摄入发现 | 0.10 |
| AWS EventBridge | 100 万个自定义事件 | 1.00 |
| Amazon CloudWatch | 每月摄入 1GB | 0.50 |
| AWS Lambda | 5 个 ARM Lambda 函数 - 128MB / 10 秒 | 0.00 |
| Amazon SQS | 2 个 SQS FIFO | 0.00 |
| 总计 | 171.22 |