iamemirozturk/aws-vpc-flowlogs-anomaly-detection

GitHub: iamemirozturk/aws-vpc-flowlogs-anomaly-detection

该项目提供了一个基于 Terraform 的可部署方案,通过 Athena 查询多账户 VPC Flow Logs 实现集中式的异常出站流量检测与告警。

Stars: 0 | Forks: 0

# AWS VPC Flow Logs 集中式异常检测 ![架构](https://static.pigsec.cn/wp-content/uploads/repos/cas/bf/bf43a493d00f27bb8b891effbbf04e2c20d1b62bf205ce9610f6c37173857a5a.svg) [![质量与安全](https://static.pigsec.cn/wp-content/uploads/repos/cas/71/71324faad2a409435dd9c2cdf8cb58407e158b8b7a16ed40b547cd2026f0d2f7.svg)](https://github.com/iamemirozturk/aws-vpc-flowlogs-anomaly-detection/actions/workflows/terraform-ci.yml) [![Terraform](https://img.shields.io/badge/Terraform-1.7%2B-7B42BC?logo=terraform)](https://developer.hashicorp.com/terraform) [![Python](https://img.shields.io/badge/Python-3.12-3776AB?logo=python)](https://www.python.org/) [![许可证:MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE) 本仓库是一个可部署的参考实现,用于集中化处理来自多个 AWS 账户的 VPC Flow Logs,通过 Amazon Athena 查询丰富后的 Parquet 记录,并对异常庞大的接受出站流量(accepted egress)发出警报。它展示了 安全架构和工程实践;它不是一个托管检测 服务,也不能替代针对特定威胁的调优。 ## 已实现的功能 - 跨账户直接将 Flow Logs 传输到中心 S3。S3 传输不 使用 IAM 传输角色。 - 一个中心 Terraform state 以及每个分支 账户/Region 一个独立的 state,并带有 account-ID provider 安全防护。 - 丰富后的 Parquet 日志、按小时的 Hive 前缀,以及带有 Athena 分区投影(partition projection)的 Glue 表。无需 crawler 或分区注册任务。 - 延迟的精确滚动窗口查询,检查接受的出站流量,在可用时使用数据包 地址,处理 IPv4/IPv6 排除,并在应用阈值前 汇总每个源的所有外部目标。 - 每次运行提供一个有界的 SNS 通知,DynamoDB 窗口幂等性,预留的 Lambda 并发,EventBridge 重试,加密的 SQS 死信队列, 以及 CloudWatch 警报。 - 客户管理的 KMS 密钥,S3 Block Public Access,仅限 TLS 的策略, 版本控制,生命周期控制,访问日志记录,限定范围的检测器权限, 以及 Athena 扫描限制。 - Terraform 验证,TFLint,Flake8,单元测试,tfsec,Checkov,Dependabot, 以及 pre-commit hooks。 ## 检测边界 检测器会在配置的窗口内,识别超过静态阈值的基于流量的外部出站流量,针对每个 `(account, instance, source IP)` 进行检测。它是一个 透明的第一阶段分析,不能证明存在恶意意图。NAT gateway、 代理、共享接口、批准的批量导出,以及延迟或 `SKIPDATA` 记录会影响归因和完整性。 有关假设和残余风险,请参阅[威胁模型](docs/threat-model.md)。 ## 仓库布局 ``` . ├── athena/queries/ # Parameterized investigation queries ├── deployments/spoke/ # Separate spoke account/Region root ├── docs/ # Architecture, threat model, runbook, demo ├── examples/ │ ├── central/ # Central root variables │ └── spoke/ # One spoke deployment variables ├── lambda/ │ ├── detector.py │ └── tests/ ├── modules/ │ ├── central-logging/ # S3, KMS, Glue table, Athena, Lambda IAM │ ├── detection-engine/ # Lambda, SNS, state, DLQ, alarms │ └── spoke-account/ # VPC Flow Logs only ├── main.tf # Central account root └── versions.tf ``` ## 前置条件 - Terraform `>= 1.7, < 2.0` - AWS CLI v2 以及临时凭证 - 用于本地测试的 Python 3.12 - 唯一的中心日志桶名称 - 允许管理项目资源的中心主体 - 每个分支账户中一个可担(assumable)的部署角色,具有 描述 VPC 以及创建、更新、标记和删除 VPC Flow Logs 的权限 - 独立于本项目配置的远程 state 桶 本仓库不创建 Terraform backend 或跨账户部署 角色。这些引导资源通常具有不同的所有者和生命周期。 ## 部署 ### 1. 中心账户 ``` cp examples/central/terraform.tfvars.example terraform.tfvars # 编辑 terraform.tfvars。 # 推荐:在私有部署 repo 中复制、编辑并提交 backend.tf。 cp backend.tf.example backend.tf export AWS_PROFILE=security-logging terraform init terraform plan -out=central.tfplan terraform apply central.tfplan terraform output -raw central_log_bucket_arn ``` `log_sources` 既是允许列表也是 schema 输入。在创建其 Flow Logs 之前,请包含每个分支 账户/Region。更改会更新 S3 传输和 投影的分区值。 默认情况下 Object Lock 处于禁用状态。启用它是一个不可逆的桶 属性;COMPLIANCE 保留甚至可以阻止账户所有者删除 对象。请先测试治理、恢复和成本影响。 如果设置了 `alert_email`,请在测试前确认 SNS 订阅电子邮件。 ### 2. 某个分支账户和 Region ``` cd deployments/spoke cp ../../examples/spoke/terraform.tfvars.example terraform.tfvars # 编辑 account、Region、role ARN、VPC ID 和 central bucket ARN。 # 为此 account 和 Region 使用唯一的 backend key。 cp backend.tf.example backend.tf export AWS_PROFILE=organization-deployer terraform init terraform plan -out=spoke.tfplan terraform apply spoke.tfplan ``` 对每个账户/Region 使用不同的 backend 密钥重复此操作。不要使用 CLI 工作区或 `-target` 来模拟账户边界。Provider 会担任 `deployment_role_arn` 并拒绝在其他账户中操作。 向 S3 传输 Flow Logs 是尽力而为的,通常会延迟几分钟。 默认的 15 分钟查询延迟可避免扫描最新的不完整周期。 ## 本地验证 ``` terraform fmt -check -recursive terraform init -backend=false terraform validate terraform test terraform -chdir=deployments/spoke init -backend=false terraform -chdir=deployments/spoke validate terraform -chdir=deployments/spoke test tflint --init tflint --recursive python3 -m venv .venv .venv/bin/python -m pip install -r requirements-dev.txt .venv/bin/python -m pytest .venv/bin/python -m flake8 lambda ``` CI 会运行这些检查以及 tfsec 和 Checkov,且无需 AWS 凭证。两个根目录的 Provider 锁文件均已提交。 ## 检测器行为 对于时间 `T` 的 EventBridge 事件: ``` window_end = T - data_delay_minutes window_start = window_end - detection_window_minutes ``` SQL 枚举了触及的每个小时分区,并过滤记录的 `"start"`/`"end"` 时间戳。它会保留 `ACCEPT`、`egress`、`OK` 记录;首选 数据包地址;移除私有、环回、链路本地、运营商级 NAT 和 多播目标以及操作员排除项;并在 汇总每个源的所有目标后应用阈值。 EventBridge 重试会保留事件时间戳。只有在查询和警报成功后,窗口的哈希值才会 存储在 DynamoDB 中,因此会跳过已完成的重试。如果在 SNS 接受消息后但在写入 DynamoDB 之前发生崩溃,仍可能 导致警报重复;消费者应根据窗口进行去重。 ## 运维与调查 - [架构](docs/architecture.md) - [安全控制](docs/security-controls.md) - [威胁模型](docs/threat-model.md) - [运维手册](docs/runbook.md) - [演示与证据指南](docs/demo.md) - [成本模型](docs/cost-model.md) - [升级说明](docs/migration-v2.md) - [GitHub 仓库设置](docs/repository-settings.md) - [Athena 查询模板](athena/queries/) 检测器从不会更改网络策略或隔离工作负载。 ## 成本与保留 最大的成本驱动因素通常是已发布日志的传输、保留的 S3 数据、 Athena 扫描的字节数和 KMS 请求。流量和 Region 的影响通常大于 资源数量。请将[成本模型](docs/cost-model.md)与当前的 [VPC Flow Logs 定价](https://aws.amazon.com/cloudwatch/pricing/)、 [S3 定价](https://aws.amazon.com/s3/pricing/) 和 [Athena 定价](https://aws.amazon.com/athena/pricing/) 结合使用; 不要依赖静态的每月估算。 在销毁中心存储之前,请先销毁分支 Flow Logs。中心桶使用 `force_destroy = false`。在保留期允许之前,无法移除 Object-locked 对象。 ## 项目状态 此参考实现实现了确定性阈值检测。组织 事件驱动的接入、行为基线、SIEM 订阅者和受控的 集成测试属于未来的扩展,而非当前的功能。 请参阅 [CONTRIBUTING.md](CONTRIBUTING.md)、[SECURITY.md](SECURITY.md) 和 [MIT 许可证](LICENSE)。维护者: [Emir Ozturk](https://github.com/iamemirozturk)。
标签:AWS, C语言, DPI, ECS, Terraform, VPC流日志, 异常检测, 网络安全, 逆向工具, 隐私保护