aws-samples/sample-inventory-monitor-fim

GitHub: aws-samples/sample-inventory-monitor-fim

基于 AWS Systems Manager Inventory 构建的文件完整性监控方案,通过 Lambda 比对文件元数据快照来检测变更,并将发现结果推送至 Security Hub 和 Security Lake 实现集中告警与分析。

Stars: 1 | Forks: 0

# sample-inventory-monitor-fim ## 概述 此示例演示了如何使用 **AWS Systems Manager (SSM) Inventory** 监控 Amazon EC2 实例上的文件更改,将发现结果转发到 **AWS Security Hub**,并将其存储在 **Amazon Security Lake** 中以进行集中分析和可视化。 该示例侧重于 **文件完整性监控 (FIM)**,但相同的方法可以扩展以监控: - 已安装的应用程序 - 网络配置 - 操作系统补丁和更新 - 自定义清单项目 ### 了解更多 有关此解决方案及其安全影响的详细说明,请查看 [关于使用 AWS Systems Manager 和 Amazon Security Lake 进行文件完整性监控的 AWS 博客](https://aws.amazon.com/blogs/security/file-integrity-monitoring-with-aws-systems-manager-and-amazon-security-lake/)。这篇 AWS 安全博客文章涵盖了架构和部署步骤,可帮助您实施类似的解决方案。 ## 架构 ![架构图](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/c50191cad7112810.png) 此示例解决方案使用以下 AWS 服务: - [AWS Systems Manager](https://aws.amazon.com/systems-manager/) Inventory 从受管的 [Amazon EC2](https://aws.amazon.com/ec2/) 实例收集文件元数据 - [Amazon S3](https://aws.amazon.com/s3/) 通过启用版本控制的 SSM Resource Data Sync 存储清单快照 - [Amazon S3 Event Notifications](https://docs.aws.amazon.com/AmazonS3/latest/userguide/NotificationHowTo.html) 在新清单数据到达时触发 [AWS Lambda](https://aws.amazon.com/lambda/) 函数 - [AWS Lambda](https://aws.amazon.com/lambda/) 函数比较清单快照以检测文件更改(创建、修改、删除)。Lambda Layer 提供可重用的辅助函数 - [AWS Security Hub](https://aws.amazon.com/security-hub/) 接收 AWS Security Finding Format (ASFF) 格式的发现结果 - [Amazon Security Lake](https://aws.amazon.com/security-lake/) 摄取 OCSF 格式的发现结果以进行集中分析 - [Amazon Athena](https://aws.amazon.com/athena/) 支持对 Security Lake 数据进行 SQL 查询 - [Amazon QuickSight](https://aws.amazon.com/quicksight/) 和 [Amazon OpenSearch Service](https://aws.amazon.com/opensearch-service/) 提供可视化和仪表板功能 ## 部署 ### 前置条件 - 目标区域必须启用 [AWS Security Hub](https://aws.amazon.com/security-hub/) - 配置了适当凭证和有效区域的 AWS CLI - 已安装 Python 3.9+ 和 pip - 用于 Lambda 部署包的 S3 存储桶 - 遵循最小权限原则:使用具有创建 CloudFormation stacks、Lambda、IAM、S3 和 SSM 资源权限的专用部署角色 **自动部署的内容:** - ✅ **S3 Logging Bucket** - 启用版本控制、Object Lock 和显式私有 ACL 的存储桶,用于不可变访问日志 - ✅ **S3 Inventory Bucket** - 启用版本控制、加密、访问日志记录和私有访问控制的存储桶 - ✅ **S3 Bucket Policy** - 强制仅限 HTTPS 访问并授予 SSM 权限 - ✅ **SSM Resource Data Sync** - 将清单数据导出到 S3 - ✅ **SSM Inventory Association** - 安排从 EC2 实例收集文件元数据 - ✅ **Lambda Function & Layer** - 具有预留并发 (10) 的 Serverless 函数,用于检测文件更改 - ✅ **Dead Letter Queue (SQS)** - 捕获失败的 Lambda 调用,保留 14 天 - ✅ **IAM Resources** - 具有客户托管策略的 Lambda 执行角色 - ✅ **S3 Event Notification** - 在新清单数据到达时触发 Lambda(筛选为 `AWS%3AFile/` 前缀,仅针对文件清单对象) ### 部署区域 部署使用您的 AWS CLI 默认区域,或者您可以使用 `AWS_REGION` 环境变量覆盖它: ``` AWS_REGION=us-west-2 ./deploy.sh my-fim-deployment-bucket ``` ### 部署步骤 1. **克隆此存储库:** git clone https://github.com/aws-samples/sample-inventory-monitor-fim.git cd sample-inventory-monitor-fim 2. **为 Lambda 部署包创建一个 S3 存储桶:** aws s3 mb s3://my-fim-deployment-bucket 将 `my-fim-deployment-bucket` 替换为您想要的存储桶名称。此存储桶与 CloudFormation 创建的日志和清单存储桶是分开的,并且未启用 Object Lock。 3. **运行部署脚本:** chmod +x deploy.sh ./deploy.sh my-fim-deployment-bucket 将 `my-fim-deployment-bucket` 替换为您在第 2 步中创建的存储桶名称。该脚本打包 Lambda 代码,将其上传到 S3,并调用 CloudFormation 以部署所有资源,包括 Lambda、S3 存储桶和 SSM 配置。 **用法:** ./deploy.sh [stack-name] [options] `stack-name` 参数是可选的,默认为 `SSMInventoryFIM`。 **配置选项:** 所有选项都是可选的,允许您自定义 Lambda 函数行为: | 选项 | 描述 | 默认值 | |--------|-------------|---------------| | `--monitored-path` | 要监控更改的文件系统路径 | `/etc/paymentapp/` | | `--file-patterns` | 用于识别触发警报的关键文件的正则表达式模式 | `^/etc/paymentapp/config.*$` | | `--severity` | Security Hub 发现结果的严重性级别 (INFORMATIONAL, LOW, MEDIUM, HIGH, CRITICAL) | `MEDIUM` | | `--schedule` | 从 EC2 实例收集文件元数据的频率 | `rate(30 minutes)` | | `--tag-key` | 用于识别实例进行清单收集的 EC2 标签键 | `FIM-Enabled` | | `--tag-value` | 用于识别实例进行清单收集的 EC2 标签值 | `true` | **示例:** 使用默认设置进行基本部署: ./deploy.sh my-fim-deployment-bucket 使用选项进行自定义配置: ./deploy.sh my-fim-deployment-bucket MyFimStack \ --monitored-path /etc/ \ --severity HIGH \ --schedule "rate(15 minutes)" ### 验证部署 部署后,验证堆栈输出: ``` aws cloudformation describe-stacks --stack-name SSMInventoryFIM --query 'Stacks[0].Outputs' ``` 您应该看到所有已部署的资源,包括 S3 存储桶、SSM 配置、带有 layer 和 DLQ 的 Lambda 函数。 ## 测试解决方案 ### 步骤 1:启动 EC2 实例 1. **为 EC2 创建 IAM 角色:** - 转到 IAM → Roles → Create role - 选择 AWS Service → EC2 - 附加 `AmazonSSMManagedInstanceCore` 策略 - 将其命名为 `SSMAccessRole` 2. **启动 EC2 实例:** - 使用 Amazon Linux 2 AMI(测试用 t3.micro) - 在 Advanced details → IAM instance profile 下,选择 `SSMAccessRole` - **重要:** 添加一个在部署期间配置的键和值的标签(默认:`FIM-Enabled=true`)。只有具有此标签的 EC2 实例才会被 SSM Inventory Association 定为目标进行文件监控。 - 添加 User data 部分(创建一个测试文件): #!/bin/bash mkdir -p /etc/paymentapp echo "db_password=initial123" > /etc/paymentapp/config.yaml - 启动实例 ### 步骤 2:等待清单收集 SSM Inventory Association 按照您配置的计划运行(默认:每 30 分钟)。 **手动触发清单收集:** 1. 转到 Systems Manager → State Manager 2. 选择您的关联(名称:`-file-inventory`) 3. 点击 Apply association now 4. 等待状态显示 Success ### 步骤 3:模拟文件更改 1. 通过 Systems Manager Session Manager 连接到 EC2 实例 2. 修改测试文件: echo "db_password=hacked456" | sudo tee /etc/paymentapp/config.yaml 3. 再次触发清单收集(或等待下一次计划运行) ### 步骤 4:验证发现结果 **检查 Security Hub:** - 转到 [Security Hub CSPM](https://aws.amazon.com/security-hub/cspm/) → Findings - 查找标题为:"File changes detected via SSM Inventory" 的发现结果 **注意:** Security Hub 发现结果可能需要在 Lambda 函数运行几分钟后才会出现。 ## Amazon Security Lake 集成(可选) Amazon Security Lake 自动从 AWS Security Hub 收集发现结果并将其规范化为 OCSF 格式。一旦启用并选择 Security Hub 作为数据源,所有 FIM 发现结果将被摄取,无需更改代码。使用 Amazon Athena 查询数据,并使用 Amazon QuickSight 或 Amazon OpenSearch Service 进行可视化。 **注意:** Security Lake 会在发现结果显示在 Athena 中之前对其进行处理,因此预计在摄取和数据可用性之间会有短暂延迟。 ## 项目结构 ``` . ├── lambda_function.py # Main Lambda handler ├── layer/ │ ├── helpers.py # Helper functions for FIM logic │ └── requirements.txt # Python dependencies (python-dateutil) ├── deploy.sh # Automated deployment script ├── template.yaml # CloudFormation template ├── res/ │ └── architecture.png # Architecture diagram └── README.md # This file ``` ## 清理 要删除所有资源并避免持续成本: 1. **终止 EC2 测试实例** 2. **清空/删除清单 S3 存储桶** 3. **删除 CloudFormation 堆栈:** aws cloudformation delete-stack --stack-name SSMInventoryFIM 4. **清理本地文件:** rm -rf build/ *.zip 堆栈删除会自动移除所有已部署的资源。 ## 安全增强功能 此 CloudFormation 模板包含安全和可靠性功能: - **[Reserved Concurrency](https://docs.aws.amazon.com/lambda/latest/dg/configuration-concurrency.html)** - Lambda 函数限制为 10 个并发执行,以防止成本失控 - **[Dead Letter Queue (DLQ)](https://docs.aws.amazon.com/lambda/latest/dg/invocation-async.html#invocation-dlq)** - 失败的调用发送到具有 14 天保留期的 SQS 以进行故障排除 - **[S3 Explicit Private ACL](https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html)** - 日志记录存储桶具有显式 `AccessControl: Private` 和 `BucketOwnerPreferred` 所有权 - **[S3 Access Logging](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ServerLogs.html)** - 清单存储桶记录所有访问请求 - **[S3 HTTPS-Only Access](https://docs.aws.amazon.com/AmazonS3/latest/userguide/security-best-practices.html#transit)** - 存储桶策略使用 `aws:SecureTransport` 条件强制执行 TLS/HTTPS - **[S3 Private Access](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-control-block-public-access.html)** - 所有存储桶都启用了 `PublicAccessBlockConfiguration` - **[Customer-Managed IAM Policies](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html)** - 专用托管策略,便于重用和集中更新 - **[S3 Versioning](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Versioning.html)** - 所有存储桶都启用了版本控制以保留历史版本 - **[S3 Object Lock](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lock.html)** - 日志记录存储桶使用 GOVERNANCE 模式(90 天保留期)以实现不可变的审计日志 ### 其他安全选项 * **[VPC Deployment](https://docs.aws.amazon.com/lambda/latest/dg/configuration-vpc.html)** - 为了增强网络隔离,请在私有子网中部署 Lambda,并为 S3、Security Hub 和 SQS 使用 VPC endpoints。这会增加运营复杂性,但提供额外的网络级安全控制。 * **[Encrypt Lambda environment variables with a customer-managed KMS key](https://docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html#configuration-envvars-encryption)** - 使用您自己的 KMS 密钥,以完全控制密钥轮换和访问 * **[Enable S3 Replication for compliance or disaster recovery](https://docs.aws.amazon.com/AmazonS3/latest/userguide/replication.html)** - 将清单数据复制到另一个区域或账户以实现冗余 * **[Enable AWS CloudTrail Data Events for S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/cloudtrail-logging-s3-info.html)** - 记录带有用户身份详细信息的对象级操作以用于审计 * **[Enable Lambda Code Signing](https://docs.aws.amazon.com/lambda/latest/dg/configuration-codesigning.html)** - 确保只有受信任的、数字签名的代码才能部署到 Lambda 函数,以防止未经授权的修改 ## 许可证 此示例根据 **MIT-0 License** 授权。有关详细信息,请参阅 [LICENSE](./LICENSE)。
标签:Amazon Athena, Amazon EC2, Amazon S3, Amazon Security Lake, ASFF, AWS, AWS Lambda, AWS Security Hub, AWS Systems Manager, C语言, DevSecOps, DPI, EC2, IaC, OCSF, Sample, SSM Inventory, x64dbg, 上游代理, 动态调试, 变更检测, 安全合规, 开源, 网络代理, 逆向工具