hetsonii/aegis-siem
GitHub: hetsonii/aegis-siem
Aegis 是一个基于 AWS 构建的云原生 SIEM 系统,通过蜜罐传感器采集安全遥测数据并运行双层检测引擎,配合 SOC 控制台实现从威胁检测到事件分诊与响应的完整流程。
Stars: 0 | Forks: 0
# Aegis — 构建于 AWS 的云原生轻量级 SIEM
Aegis 从一个实时的、刻意暴露攻击面的 Web 应用程序
(**CloudJuice**)中采集安全遥测数据,以近实时的方式在其上运行双层
检测引擎,并在 SOC 控制台中展示调查结果以进行分诊。所有内容均
通过 Terraform 进行配置——无需手动创建任何资源。
## 功能
- **CloudJuice**(ECS Fargate + ALB)是一个真实的 Web 应用程序,它会*识别并
记录*攻击行为,但绝不执行攻击者的输入——它是一个传感器,而
不是受害者。一个外部攻击脚本会驱动真实的流量访问它。
- 安全事件通过四个真实的通道传输:应用程序事件
(CloudWatch Logs)、ALB 访问日志、VPC Flow Logs 和 CloudTrail(全部发送至 S3)。
- 一个**订阅过滤器**将应用程序安全事件推送到**摄取
Lambda**,后者会将其标准化,将原始副本归档到 **S3 数据湖**中,并将它们排入 **SQS** 队列(带有 DLQ)。
- **检测 Lambda** 运行一个**声明式规则目录**(检测即代码:
涵盖 SQLi、XSS、命令注入、SSTI、Log4Shell、NoSQLi、XXE、
SSRF、LFI/RFI、路径遍历、IDOR、扫描器、敏感文件探测等 20 多种规则)
**以及一个实时的统计层**(速率、暴力破解、凭证填充、熵、
首次发现的来源),使用 **DynamoDB** 中基于来源的窗口计数器——无需训练
模型。每条规则都映射到一种 **MITRE ATT&CK** 技术,调查结果通过
**缓存的 GeoIP** 威胁情报进行丰富,并且每一项都以 **OCSF** 检测
结果 schema 发出。调查结果发送到 DynamoDB,证据包发送到 S3,任何
`HIGH` 及以上的严重级别都会通过 **SNS** 扇出(发送到一个对其进行标记的 Lambda,并可选择发送至电子邮件)。
- **EventBridge** 运行一个计划内的关联扫描,用于检测缓慢的模式。
- **SOC 控制台**(S3 静态站点 → API Gateway → 仪表板 Lambda)是一个
多页面的、Kibana 风格的分析师工作区:
- **Overview**(概览)—— KPI(调查结果、未解决事件、高危+严重、已封锁来源、
MTTA/MTTR)、随时间变化的调查结果图表、严重程度细分和主要来源。
- **Discover**(发现)—— 一个 KQL 风格的搜索栏、全局时间选择器、交互式
直方图、带有最高值的字段侧边栏、过滤器标签,以及可展开的行,
显示完整的调查结果 + OCSF 证据。
- **Incidents**(事件)—— 根据来源分组的调查结果,形成可分诊的案件。
- **Detections**(检测)—— 规则目录和一个实时的 **MITRE ATT&CK 覆盖矩阵**。
- **Threat Map**(威胁地图)—— 基于 GeoIP 丰富信息的攻击来源 Leaflet 地图。
- **Response**(响应)—— 黑名单:封锁来源(蜜罐会轮询该列表并
开始返回 `403`,并记录为调查结果)以及**解除封锁**以恢复其访问。
## 仓库结构
```
app/ CloudJuice honeypot (dependency-free Node.js) + public/ storefront + Dockerfile
lambdas/ ingestion, detection (+detector.py catalog), alert, dashboard_api
spa/ SOC console (index.html, styles.css, app.js, catalog.js, api.js, config template)
attack/ external red-team script (stdlib only)
tests/ unit tests for the detection logic
infra/ Terraform for the entire stack
.github/ CI/CD workflow
```
## 前置条件
- AWS Academy Learner Lab 会话(区域为 `us-east-1`)、Terraform ≥ 1.5、
Docker、Python 3.12 以及 AWS CLI。
- 通过本地 `.env` 文件提供您的 Learner Lab 凭证(它们在每次
会话时都会轮换)。复制模板并填写:
```
cp .env.example .env
# 然后用你当前的 Learner Lab session 值编辑 .env
```
`.env` 已被 gitignore 忽略;`.env.example` 是可共享的模板。(CI 改为使用 GitHub
Actions secrets,并单独配置。)
## 部署
部署分为两个阶段的 apply:创建 ECR 仓库,构建并推送
CloudJuice 镜像,然后配置其他所有内容。之所以分为两个阶段,是因为
ECS 任务引用了一个镜像,该镜像必须在服务启动之前被推送。
执行镜像步骤时必须运行 Docker Desktop。
### Windows (PowerShell)
从仓库根目录运行:
```
# 1. 从 .env 加载 credentials 到此 shell session
Get-Content .env | Where-Object { $_ -and $_ -notmatch '^\s*#' } | ForEach-Object {
$k, $v = $_ -split '=', 2
Set-Item "Env:$($k.Trim())" $v.Trim()
}
# 2. (可选)运行检测测试
python -m unittest discover -s tests
# 3. Terraform 位于 infra/ 中
cd infra
terraform init # already done if re-running
# 阶段 1:创建 ECR repository
terraform apply -auto-approve -target="aws_ecr_repository.cloudjuice"
# 构建并推送 image
$REPO = terraform output -raw ecr_repository_url
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin ($REPO -split '/')[0]
docker build -t "${REPO}:latest" ..\app
docker push "${REPO}:latest"
# 阶段 2:配置所有其他内容
terraform apply -auto-approve
# 显示 URL
terraform output
```
### macOS / Linux / Git Bash
从仓库根目录运行:
```
set -a; . ./.env; set +a # load credentials
python3 -m unittest discover -s tests # optional tests
cd infra
terraform init
terraform apply -auto-approve -target="aws_ecr_repository.cloudjuice"
REPO=$(terraform output -raw ecr_repository_url)
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin "${REPO%/*}"
docker build -t "$REPO:latest" ../app
docker push "$REPO:latest"
terraform apply -auto-approve
terraform output
```
## 演示
在 `infra/` 目录下,对已部署的目标发起攻击(这是原生遥测数据,不会
向 pipeline 中注入任何内容)。**campaign** 场景会重放来自
十几个伪造来源国家的攻击,从而填充事件列表和威胁地图:
```
# PowerShell
python ..\attack\attack.py --target (terraform output -raw cloudjuice_url) --scenario campaign
```
```
# bash
python3 ../attack/attack.py --target "$(terraform output -raw cloudjuice_url)" --scenario campaign
```
其他场景:`all`,或单一类型 —— `sqli`、`xss`、`cmd`、`ssti`、
`log4shell`、`ssrf`、`nosqli`、`xxe`、`lfi`、`traversal`、`idor`、`scanner`、
`sensitive`、`recon`、`brute`、`credstuff`、`benign`。添加 `--source-ip ` 以
将流量归因于特定的来源。
然后打开 `terraform output` 中的 **console URL**,并浏览各个页面:
**Overview** 查看整体情况,**Discover** 搜索/过滤事件,**Incidents**
按来源进行分诊,**Detections** 查看 ATT&CK 矩阵,**Threat Map** 查看
来源,以及 **Response** 封锁嘈杂的来源并观察其收到 `403` 响应 —— 然后
再解除封锁。
## 更改后重新部署
应用程序/容器更改(重新构建镜像并让 ECS 拉取它),在 `infra/` 目录下:
```
docker build -t "${REPO}:latest" ..\app # $REPO from terraform output -raw ecr_repository_url
docker push "${REPO}:latest"
aws ecs update-service --cluster aegis-cluster --service aegis-cloudjuice --force-new-deployment
```
基础设施更改:只需重新运行 `terraform apply -auto-approve`。
## 销毁
在 `infra/` 目录下:
```
terraform destroy -auto-approve
```
Buckets 使用 `force_destroy`,ECR 使用 `force_delete`,因此销毁是干净彻底的。
## 测试
```
python -m unittest discover -s tests # stdlib, no install (python3 on macOS/Linux)
pytest -q # same tests under pytest (used in CI)
```
## Learner Lab 说明(已记录,非隐藏)
- **单一共享角色。** 不允许创建角色,因此每个资源都
附加到预先存在的 `LabRole` 上。在生产环境中,每个函数都将拥有
其自身的最小权限角色;预期的按函数策略在
设计文档中有所描述,并被标记为受环境限制的偏差。
- **CloudTrail → 仅限 S3。** 实验室不允许在 trail 上启用 CloudWatch Logs
交付,因此 trail 将数据交付到 S3。
- **电子邮件警报是可选的。** 默认情况下,警报使用 SNS → Lambda(无需
点击确认)。设置 `alert_email`(参见 `.env.example`)将添加一个
SNS → 电子邮件订阅;AWS 会发送一封确认电子邮件,您只需点击一次即可
激活。使用 `terraform apply -var "alert_email=$ALERT_EMAIL"` 进行应用。
- **轮换凭证。** 在每次实验室会话开始
pipeline 运行之前,刷新三个 GitHub Actions secrets
(`AWS_ACCESS_KEY_ID`、`AWS_SECRET_ACCESS_KEY`、`AWS_SESSION_TOKEN`)。
- **公网 IP 任务。** Fargate 任务在具有锁定安全
组(ALB 是唯一的入口)的公有子网中运行,以避免使用 NAT gateway;在生产环境中,会将
它们放置在 NAT 或 VPC endpoint 后的私有子网中。
- **控制台托管。** 控制台作为公共 S3 静态站点提供服务。如果
账户强制执行 S3 Block Public Access,公共站点将被阻止 —— 在这种
情况下,在将 `spa/config.js` 中的 `API_BASE` 设置为
`api_base` 输出后,在本地打开 `spa/index.html`;API 的 CORS 允许这样做。
标签:AWS, CISA项目, DPI, MITM代理, 安全日志分析, 安全运营, 扫描框架, 漏洞利用检测, 漏洞探索, 自动化响应, 请求拦截, 逆向工具