engrbayo/Cloudtrail-threat-hunting
GitHub: engrbayo/Cloudtrail-threat-hunting
一款基于 Amazon Bedrock 和 Claude 3.5 Haiku 的 AI 驱动 CloudTrail 威胁狩猎工具,支持自然语言查询、Athena SQL 自动生成及 MITRE ATT&CK 框架映射。
Stars: 0 | Forks: 0
# CloudTrail 威胁狩猎 Copilot
一款由 AI 驱动的安全运营工具,允许 SOC 工程师和威胁猎手使用**纯英语**查询 AWS CloudTrail 日志。该 Copilot 将自然语言问题转换为 Athena SQL,针对您的 CloudTrail 数据湖执行查询,并返回映射到 **MITRE ATT&CK** 框架的结构化威胁情报——所有这些都由 **Amazon Bedrock (通过跨区域推理配置文件使用 Claude 3.5 Haiku)** 提供支持。

## 目录
- [概述](#overview)
- [架构](#architecture)
- [使用的 AWS 服务](#aws-services-used)
- [项目结构](#project-structure)
- [前提条件](#prerequisites)
- [配置](#configuration)
- [部署](#deployment)
- [部署后步骤](#post-deployment-steps)
- [使用 Copilot](#using-the-copilot)
- [计划威胁搜寻](#scheduled-threat-hunts)
- [安全控制](#security-controls)
- [可观测性](#observability)
- [成本考量](#cost-considerations)
- [故障排除](#troubleshooting)
- [清理](#cleanup)
## 概述
该 Copilot 作为一个 **3 阶段 AI 管道** 运行:
| 阶段 | 发生的操作 |
|-------|-------------|
| **阶段 1** | 用户输入英语问题 → Bedrock (Claude 3.5 Haiku) 将其转换为有效的 Athena SQL 查询,并注入完整的 24 列 CloudTrail schema |
| **阶段 2** | 生成的 SQL 通过 Amazon Athena 在您的 CloudTrail 日志上执行(每个查询限制 10 GB,结果写入 S3) |
| **阶段 3** | Athena 结果反馈给 Bedrock 进行威胁分析:MITRE ATT&CK 映射、风险评分(0–100)、可疑模式检测及建议操作 |
聊天界面作为 **Streamlit** 应用程序运行在 **ECS Fargate** 上,由 AWS WAF v2 和启用 TLS 1.3 的 Application Load Balancer 保护。所有 AWS API 流量均通过 **VPC Interface Endpoints (PrivateLink)** 路由——Bedrock、Athena、S3、SNS 和 CloudWatch Logs 调用从不经过公共互联网。
## 架构
```
Security Analyst (Browser)
│ HTTPS
▼
┌─────────────────────────────────────────┐
│ Public Layer │
│ AWS WAF v2 → Internet GW → App LB │
└────────────────────┬────────────────────┘
│ HTTPS :443
┌─────────────────── ▼ ───────────────────┐
│ Amazon ECS Fargate (Private Subnet) │
│ Streamlit Chat UI ←── Amazon ECR │
└────────────────────┬────────────────────┘
│ POST /query
▼
Amazon API Gateway REST
│ Lambda proxy
┌──────────────────── ▼ ──────────────────────────┐
│ VPC 10.10.0.0/16 — Private Subnets │
│ ┌──────────────────────────────────────────┐ │
│ │ Lambda Functions (Python 3.12) │ │
│ │ Copilot Lambda ← Scheduled Hunt Lambda │ │
│ └──────────────────────────────────────────┘ │
│ 🔐 All AWS calls via PrivateLink endpoints │
└───────────────────────────────────────────────── ┘
│ │
▼ ▼
┌──────────────┐ ┌────────────────────────────┐
│ Amazon │ │ Data Pipeline │
│ Bedrock │ │ CloudTrail → S3 → Glue │
│ Claude (×2) │ │ → Athena │
└──────────────┘ └────────────────────────────┘
┌──────────────┐ ┌────────────────────────────┐
│ Scheduling │ │ Observability │
│ EventBridge │ │ CloudWatch Dashboard │
│ Amazon SNS │ │ Alarms · Logs · SSM │
└──────────────┘ └────────────────────────────┘
```
## 使用的 AWS 服务
| 服务 | 用途 |
|---------|---------|
| **Amazon Bedrock** (Claude 3.5 Haiku) | 阶段 1 NL→SQL 生成 · 阶段 3 威胁分析与 MITRE ATT&CK 映射 —— 使用跨区域推理配置文件(`us.` 前缀)以实现按需吞吐量 |
| **Amazon Athena** | 针对 CloudTrail 日志的无服务器 SQL 执行 · 每次查询 10 GB 成本上限 · 8 个预构建的命名搜寻查询 |
| **AWS CloudTrail** | 捕获所有管理事件和 S3 数据事件的多区域 Trail |
| **Amazon S3** | CloudTrail 日志存储 (KMS-SSE, 版本控制, 生命周期转入 Glacier) · Athena 结果与 AI 分析 |
| **AWS Glue** | 具有完整 24 列 CloudTrail schema 的数据目录 · 每日爬虫用于分区自动发现 |
| **AWS Lambda** (Python 3.12) | Copilot 编排器 (NL→SQL→Execute→Analyse) · 计划搜寻运行器 |
| **Amazon API Gateway** | REST API (`POST /query`, `GET /health`) · 使用计划 1 000 请求/天 · 20 rps 节流 · X-Ray |
| **Amazon ECS Fargate** | 私有子网中的 Streamlit 聊天 UI · CPU 自动伸缩(最大 4 个任务) |
| **Amazon ECR** | Streamlit 镜像的容器注册表 · KMS 加密 · 推送时扫描 |
| **Application Load Balancer** | HTTPS :443 TLS 1.3 · ACM 证书 · 附加 WAF |
| **AWS WAF v2** | OWASP 核心规则集 · IP 白名单 · 速率限制(100 请求/5 分钟)· SQLi 防护 |
| **EventBridge Scheduler** | 每晚 `cron(0 2 * * ? *)` 自动威胁搜寻 |
| **Amazon SNS** | HIGH/CRITICAL 威胁警报 → 邮件通知 |
| **CloudWatch** | 仪表板(8 个小部件)· 4 个警报 · Lambda, API GW, CloudTrail 的日志组 · 指标过滤器 |
| **SSM Parameter Store** | `/security/ai/threat-hunting/*` 下的 8 个 SecureString 参数 |
| **VPC Interface Endpoints** | Bedrock, Athena, S3, SNS, CloudWatch Logs, ECR 的 PrivateLink |
| **AWS KMS** | S3, SNS, Lambda 环境变量的加密 |
| **AWS IAM** | Lambda, Glue Crawler, ECS Task, CloudTrail delivery 的最小权限角色 |
## 项目结构
```
Cloudtrail-threat-hunting-copilot/
│
├── main.tf # Provider config (aws ~> 5.0, archive ~> 2.4)
├── variables.tf # All input variables with defaults
├── locals.tf # Computed locals (name prefix, common tags)
├── outputs.tf # Key outputs (URLs, ARNs, next-step commands)
│
├── networking.tf # VPC, subnets, IGW, NAT GW, route tables, VPC endpoints
├── security_groups.tf # SGs for Lambda, ALB, ECS, VPC endpoints
├── iam.tf # 6 IAM roles (Copilot Lambda, Scheduled Hunt, Glue, ECS, CloudTrail)
│
├── s3.tf # CloudTrail logs bucket + Audit results bucket
├── cloudtrail.tf # Multi-region trail + optional CloudTrail Lake
├── glue.tf # Glue database, 24-col CloudTrail table, daily crawler
├── athena.tf # Workgroup + 8 named threat hunt queries
│
├── lambda.tf # Copilot + Scheduled Hunt Lambda functions, SNS topic
├── api_gateway.tf # REST API, request validator, CORS, usage plan, X-Ray
│
├── ecr.tf # ECR repository (KMS, scan-on-push, lifecycle policy)
├── alb.tf # ALB, target group, HTTPS listener, ACM cert
├── ecs.tf # ECS cluster, task definition, service, auto-scaling
│
├── waf.tf # WAF v2 WebACL (OWASP, IP allowlist, rate limit, SQLi)
├── eventbridge.tf # Nightly hunt scheduler (enable/disable toggle)
├── cloudwatch.tf # Dashboard, 4 alarms, log groups, metric filters
├── ssm.tf # 8 SSM parameters
│
├── lambda/
│ ├── copilot/
│ │ └── handler.py # 3-stage AI pipeline (NL→SQL → Athena → Analyse)
│ └── scheduled_hunt/
│ └── handler.py # 10 predefined nightly hunt queries + SNS alerting
│
├── streamlit/
│ ├── app.py # Streamlit chat UI with MITRE ATT&CK display
│ ├── Dockerfile # python:3.12-slim, health check, headless Streamlit
│ ├── requirements.txt # streamlit==1.40.2, requests==2.32.3
│ └── config.toml # Dark theme, CSRF protection, no CORS
│
└── architecture_1.png # AWS architecture diagram
```
## 前提条件
| 需求 | 版本 / 说明 |
|-------------|-----------------|
| Terraform | `>= 1.5.0` |
| AWS CLI | `>= 2.x`, 并配置凭证 |
| Docker | 构建并推送 Streamlit 镜像所需 |
| Python | `3.12` (用于本地 Lambda 测试) |
| AWS account | Bedrock **Claude 3.5 Haiku** 必须已启用,且在您所在的区域提交了用例表单 |
| 域名 | ALB ACM 证书所需 (`streamlit_domain` 变量) |
## 配置
所有配置均通过 `variables.tf` 控制。创建一个 `terraform.tfvars` 文件:
```
# terraform.tfvars
aws_region = "us-east-1"
project_name = "ct-hunt-copilot"
environment = "prod"
# 网络
vpc_cidr = "10.10.0.0/16"
public_subnet_cidrs = ["10.10.0.0/24", "10.10.1.0/24"]
private_subnet_cidrs = ["10.10.10.0/24", "10.10.11.0/24"]
availability_zones = ["us-east-1a", "us-east-1b"]
# Bedrock — 跨区域推理配置文件(需要 us. 前缀)
bedrock_model_id = "us.anthropic.claude-3-5-haiku-20241022-v1:0"
# Streamlit UI
streamlit_domain = "copilot.yourdomain.com" # your custom domain
# WAF — 在生产环境中限制为您的办公室/VPN IP 范围
allowed_ip_ranges = ["203.0.113.0/24"]
# 通知 — 留空以跳过邮件订阅
alert_email = "soc-team@yourdomain.com"
# 定时狩猎
scheduled_hunt_enabled = true
scheduled_hunt_cron = "cron(0 2 * * ? *)" # 02:00 UTC daily
# 可选:CloudTrail Lake(设置为 false 以使用 S3 + Glue + Athena)
enable_cloudtrail_lake = false
```
### 关键变量
| 变量 | 默认值 | 描述 |
|----------|---------|-------------|
| `aws_region` | `us-east-1` | 部署区域 |
| `bedrock_model_id` | `us.anthropic.claude-3-5-haiku-20241022-v1:0` | 用于两个 AI 阶段的 Bedrock 跨区域推理配置文件 |
| `streamlit_domain` | — | Streamlit UI 的域名 (ALB ACM 证书) |
| `allowed_ip_ranges` | `0.0.0.0/0` | WAF IP 白名单 —— **请在生产环境中严格限制** |
| `alert_email` | `""` | 用于 HIGH/CRITICAL SNS 警报的电子邮件 |
| `scheduled_hunt_enabled` | `true` | 切换每晚的 EventBridge 搜寻 |
| `athena_query_limit` | `500` | 每次 Athena 查询返回的最大行数 |
| `lambda_timeout` | `300` | Lambda 超时时间(秒)(最大 900) |
| `lambda_memory_size` | `512` | Lambda 内存 (MB) |
| `cloudwatch_log_retention_days` | `90` | 日志保留期 |
| `enable_cloudtrail_lake` | `false` | 使用 CloudTrail Lake 代替 S3+Glue |
## 部署
### 1. 克隆并初始化
```
git clone
cd Cloudtrail-threat-hunting-copilot
# 配置您的 AWS 凭证
export AWS_PROFILE=your-profile # or use aws configure
# 初始化 Terraform
terraform init
```
### 2. 审查计划
```
terraform plan -var-file="terraform.tfvars"
```
### 3. 部署
```
terraform apply -var-file="terraform.tfvars"
```
Terraform 将部署大约 **60+ 个 AWS 资源**。apply 通常在 **8–12 分钟**内完成。
## 部署后步骤
Terraform 完成后,请运行以下步骤(这些值会作为 Terraform 输出打印):
### 1. Docker 向 ECR 认证
```
aws ecr get-login-password --region us-east-1 | \
docker login --username AWS --password-stdin \
$(terraform output -raw ecr_repository_url)
```
### 2. 构建并推送 Streamlit 镜像
```
cd streamlit/
# 在 Apple Silicon Macs (M1/M2/M3) 上使用 --platform linux/amd64
# ECS Fargate 在 x86_64 上运行 — 省略此选项会导致健康检查失败
docker build --platform linux/amd64 -t $(terraform output -raw ecr_repository_url):latest .
docker push $(terraform output -raw ecr_repository_url):latest
cd ..
```
### 3. 更新 ECS 以拉取新镜像
```
# 将 和 替换为您的 terraform.tfvars 值
# 默认值:ct-hunt-copilot / prod
aws ecs update-service \
--cluster ct-hunt-copilot-prod-cluster \
--service ct-hunt-copilot-prod-streamlit-svc \
--force-new-deployment
```
### 4. 将您的域名指向 ALB
**选项 A — 子域名** (例如 `copilot.yourdomain.com`)
在您的 DNS 提供商处创建一个 `CNAME` 记录:
```
copilot.yourdomain.com →
```
**选项 B — 根 / 顶点域名** (例如 `yourdomain.com`)
大多数注册商(包括 GoDaddy)**不**允许在区域顶点(`@`)使用 `CNAME`。请改用 **Route 53** 和 `ALIAS` 记录:
1. 为您的域名创建一个 Route 53 托管区域:
aws route53 create-hosted-zone \
--name yourdomain.com \
--caller-reference $(date +%s)
2. 添加一个指向 ALB 的 `ALIAS` A 记录:
ALB_DNS=$(terraform output -raw alb_dns_name)
ALB_ZONE=$(aws elbv2 describe-load-balancers \
--query "LoadBalancers[?DNSName=='${ALB_DNS}'].CanonicalHostedZoneId" \
--output text)
HOSTED_ZONE_ID=
aws route53 change-resource-record-sets \
--hosted-zone-id $HOSTED_ZONE_ID \
--change-batch "{\"Changes\":[{\"Action\":\"UPSERT\",\"ResourceRecordSet\":{ \
\"Name\":\"yourdomain.com\",\"Type\":\"A\", \
\"AliasTarget\":{\"HostedZoneId\":\"$ALB_ZONE\", \
\"DNSName\":\"$ALB_DNS\",\"EvaluateTargetHealth\":true}}}]}"
3. 将您注册商的名称服务器更改为托管区域中显示的 **4 个 Route 53 NS 记录**。
### 5. 验证 ACM 证书
AWS 自动创建 DNS 验证记录。将它们添加到您的 DNS 提供商,然后等待证书状态变为 `ISSUED`。
### 6. 直接测试 API
```
curl -X POST \
"$(terraform output -raw api_gateway_query_endpoint)" \
-H "Content-Type: application/json" \
-d '{"question": "Show all root account logins in the last 7 days"}'
```
### 7. 订阅威胁警报
```
aws sns subscribe \
--topic-arn $(terraform output -raw sns_topic_arn) \
--protocol email \
--notification-endpoint soc-team@yourdomain.com
```
## 使用 Copilot
在浏览器中打开 `https://copilot.yourdomain.com`。Streamlit UI 提供:
- **聊天输入** —— 用纯英语输入任何安全问题
- **侧边栏** —— 点击预构建的示例查询以即时加载
- **结果面板**:
- 检测到威胁的横幅 + 置信度水平(CRITICAL / HIGH / MEDIUM / LOW)+ 风险评分(0–100)
- 执行摘要
- 生成的 Athena SQL(可展开)
- 关键发现和可疑模式
- **MITRE ATT&CK 映射**(技术 ID、名称、战术、相关性)
- 建议的补救措施
- 受影响的资源和账户
- 示例数据行(可展开)
- 后续调查建议(可点击)
### 示例查询
```
Show all root account logins in the last 30 days
Find any IAM role creations with admin policies attached this week
Detect unusual API activity from non-US IP addresses yesterday
Find console logins where MFA was not used in the last 90 days
Identify EC2 instances that assumed roles in more than 3 accounts today
Show all CloudTrail logging changes in the last 7 days
Find new IAM access keys created in the last 24 hours
Show S3 bucket policy changes from the past week
```
## 计划威胁搜寻
**Scheduled Hunt Lambda** 通过 EventBridge Scheduler 在每晚 **02:00 UTC** 自动运行。它执行 10 个涵盖以下内容的预定义威胁搜寻查询:
| 搜寻 | 描述 |
|------|-------------|
| `Root Account Activity` | 过去 24 小时内的任何 root API 调用 |
| `Privilege Escalation` | 授予管理员访问权限的 IAM policy 附加 |
| `Geo Anomaly` | 来自非白名单国家的 API 调用 |
| `MFA Bypass` | 未经 MFA 的控制台登录 |
| `Lateral Movement` | 跨账户角色担任 |
| `CloudTrail Tampering` | 日志停止/删除/更新事件 |
| `S3 Data Exfiltration` | 批量 GetObject 或存储桶策略更改 |
| `New Root Access Keys` | 为 root 账户创建访问密钥 |
| `Security Group Changes` | 开放 0.0.0.0/0 的入站规则 |
| `Sensitive API Calls` | KMS, Secrets Manager, SSM 访问模式 |
每次搜寻都会发布 CloudWatch 指标(`HuntExecuted`, `ThreatDetected`, `RiskScore`, `Confidence`)。如果任何结果被评为 **HIGH** 或 **CRITICAL**,SNS 警报将发送到配置的电子邮件地址。
## 安全控制
| 控制 | 实现 |
|---------|---------------|
| **网络隔离** | Lambda 和 ECS 在没有公共 IP 的私有子网中运行 |
| **PrivateLink** | VPC 内部的 Bedrock, Athena, S3, SNS, CloudWatch Logs 端点 |
| **WAF** | OWASP CRS v3.2, IP 白名单, 100 请求/5 分钟速率限制, SQLi 规则 |
| **TLS 1.3** | ALB 监听器通过安全策略强制执行最低 TLS 1.3 |
| **静态加密** | 所有 S3 存储桶启用 KMS-SSE;SNS 主题 KMS 加密 |
| **传输中加密** | 所有 API 和 S3 流量均已加密;S3 拒绝非 SSL 请求 |
| **最小权限 IAM** | 每个 Lambda 都有一个专用的、范围仅限于其所需资源的角色 |
| **Bedrock 范围** | Lambda IAM policy 将 `bedrock:InvokeModel` 限制为 `arn:aws:bedrock::foundation-model/anthropic.claude-*` —— 通配符区域是必需的,因为跨区域推理配置文件在内部跨区域路由 |
| **Athena 成本守卫** | 在工作组级别强制执行每次查询 10 GB 扫描限制 |
| **S3 公共访问** | 两个存储桶均启用了完整的公共访问阻止 |
| **容器扫描** | 启用 ECR 推送时扫描;生命周期策略仅保留 5 个带标签的镜像 |
| **SSM 密钥** | API Gateway URL, 存储桶名称, 模型 ID 作为 SecureString 参数存储 |
| **X-Ray 追踪** | 在 API Gateway 和 Lambda 上启用,用于完整的请求追踪 |
## 可观测性
### CloudWatch 仪表板
`ct-hunt-copilot-dashboard` 仪表板提供 8 个小部件:
- 每次搜寻运行检测到的威胁
- 总搜寻执行次数
- 风险评分趋势
- Lambda 持续时间 (p95)
- Lambda 错误
- API Gateway 请求量
- API Gateway 延迟
- 每次查询扫描的 Athena 字节数
### 警报
| 警报 | 阈值 | 操作 |
|-------|-----------|--------|
| Lambda errors | > 5 in 5 min | SNS |
| Lambda throttles | > 10 in 5 min | SNS |
| High risk score | Risk ≥ 75 | SNS |
| Athena scan overrun | ≥ 50 GB in a run | SNS |
### 日志组
| 日志组 | 内容 |
|-----------|----------|
| `/aws/lambda/ct-hunt-copilot-copilot` | Copilot Lambda — AI 管道 + Athena 执行日志 |
| `/aws/lambda/ct-hunt-copilot-scheduled-hunt` | Scheduled Hunt Lambda — 每晚运行摘要 |
| `/aws/apigateway/ct-hunt-copilot` | API Gateway 访问日志 |
| `/aws/cloudtrail/ct-hunt-copilot` | CloudTrail 传输到 CloudWatch Logs |
## 成本考量
主要成本驱动因素包括:
| 服务 | 成本驱动因素 |
|---------|------------|
| **Amazon Bedrock** | 按输入/输出 token 计费 —— Claude 3.5 Haiku 为 $0.80/$4 每百万 token(输入/输出)。阶段 3 分析的输出 token 上限为 1 024,以将延迟保持在 API Gateway 29 秒的硬性限制之内 |
| **Amazon Athena** | $5 每扫描 TB —— 强制执行的每次查询 10 GB 上限使成本可预测 |
| **AWS Lambda** | 按调用 + GB-秒计费 —— 在典型的 SOC 查询量下成本最低 |
| **ECS Fargate** | 按 vCPU/内存小时计费 —— 不使用时缩容至 0 个任务以消除成本 |
| **NAT Gateway** | 按小时 + 每 GB 计费 —— 对于纯 AWS 流量,考虑使用 VPC 端点作为替代方案 |
| **ALB** | 按 LCU 小时计费 —— 对于内部 SOC 使用量来说微乎其微 |
## 故障排除
### Bedrock 错误
| 错误 | 原因 | 修复 |
|-------|-------|-----|
| `ValidationException: on-demand throughput isn't supported` | 使用了不带推理配置文件前缀的裸模型 ID | 将 `bedrock_model_id` 更改为使用 `us.` 前缀:`us.anthropic.claude-3-5-haiku-20241022-v1:0` |
| `AccessDeniedException` (跨区域) | IAM policy 锁定到单一区域 ARN | 确保 Bedrock IAM 语句使用 `arn:aws:bedrock:*::foundation-model/anthropic.claude-*`(通配符 `*` 区域) |
| `AccessDeniedException: use case details have not been submitted` | Anthropic 要求为此模型提交用例表单 | 前往 **Bedrock → Model access → Manage model access → Anthropic → Submit use case details** 并填写表单(设置 `intendedUsers` ≥ 1) |
| 响应截断 / API Gateway 504 | 阶段 3 `max_tokens` 过高 —— Bedrock 耗时 >29 s | `handler.py` 中阶段 3 的 `max_tokens` 已被上限为 **1 024**;如果仍然超时,请进一步减少或切换到更快的模型 |
### ECS / Docker
| 症状 | 原因 | 修复 |
|---------|-------|-----|
| ECS 任务卡在 `UNHEALTHY` | `python:3.12-slim` 镜像中没有 `curl` | Dockerfile 通过 `apt-get` 安装 `curl`;重新构建并推送镜像 |
| ECS 任务立即崩溃 | 镜像是在 Apple Silicon 上为 `arm64` 构建的 | 推送前使用 `--platform linux/amd64` 重新构建 |
| ALB 返回 502 / 无健康目标 | ECS 任务尚未启动 | 等待 60 s 的 `startPeriod`,然后检查 `aws ecs describe-tasks` 以获取失败原因 |
### DNS
| 症状 | 原因 | 修复 |
|---------|-------|-----|
| 域名显示 GoDaddy 停放页面 | 浏览器或操作系统 DNS 缓存仍保留旧的 GoDaddy IP | 刷新 Mac DNS:`sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder`,然后刷新 |
| 无法在 GoDaddy 的 `@` 处添加 `CNAME` | 注册商阻止顶点的 CNAME | 使用带有 ALIAS A 记录的 Route 53 托管区域(参见上面的第 4 步) |
| ACM 证书卡在 `PENDING_VALIDATION` | CNAME 验证记录未添加到 DNS | 将 ACM 控制台中的 `_acme-challenge` CNAME 添加到您的 DNS 提供商;证书将在几分钟内签发 |
## 清理
在运行销毁之前,必须手动清空三个资源,否则 Terraform 会在中途报错:
### 1. 清空 S3 存储桶(已版本控制 —— 必须删除所有版本和删除标记)
```
# 从 Terraform outputs 获取存储桶名称
CT_BUCKET=$(terraform output -raw cloudtrail_logs_bucket)
AUDIT_BUCKET=$(terraform output -raw audit_bucket)
# 删除所有当前对象
aws s3 rm s3://$CT_BUCKET --recursive
aws s3 rm s3://$AUDIT_BUCKET --recursive
# 删除所有版本化对象和删除标记
for BUCKET in $CT_BUCKET $AUDIT_BUCKET; do
VERSIONS=$(aws s3api list-object-versions --bucket $BUCKET \
--query 'Versions[].{Key:Key,VersionId:VersionId}' --output json)
MARKERS=$(aws s3api list-object-versions --bucket $BUCKET \
--query 'DeleteMarkers[].{Key:Key,VersionId:VersionId}' --output json)
for LIST in "$VERSIONS" "$MARKERS"; do
COUNT=$(echo "$LIST" | python3 -c "import json,sys; d=json.load(sys.stdin); print(len(d) if d else 0)")
[ "$COUNT" -gt 0 ] && echo "$LIST" | python3 -c "
import json,sys,subprocess
data=json.load(sys.stdin)
for i in range(0,len(data),1000):
subprocess.run(['aws','s3api','delete-objects','--bucket','$BUCKET',
'--delete',json.dumps({'Objects':data[i:i+1000],'Quiet':True})],capture_output=True)
"
done
done
```
### 2. 删除所有 ECR 镜像
```
aws ecr delete-repository \
--repository-name $(terraform output -raw ecr_repository_url | cut -d'/' -f2) \
--force
```
### 3. 删除 Athena 工作组(连同查询历史)
```
aws athena delete-work-group \
--work-group $(terraform output -raw athena_workgroup_name) \
--recursive-delete-option
```
### 4. 运行销毁
```
terraform destroy -var-file="terraform.tfvars"
```
## Terraform 输出参考
| 输出 | 描述 |
|--------|-------------|
| `api_gateway_invoke_url` | REST API 的基础 URL |
| `api_gateway_query_endpoint` | 完整的 `POST /query` 端点 URL |
| `ecr_repository_url` | 推送 Streamlit Docker 镜像的 ECR URL |
| `alb_dns_name` | 用于 DNS CNAME 记录的 ALB DNS 名称 |
| `streamlit_url` | 聊天 UI 的公共 HTTPS URL |
| `cloudtrail_logs_bucket` | 存储原始 CloudTrail 日志的 S3 存储桶 |
| `audit_bucket` | 用于 Athena 结果和分析的 S3 存储桶 |
| `athena_workgroup_name` | Athena 工作组名称 |
| `sns_topic_arn` | 用于威胁搜寻警报的 SNS 主题 ARN |
| `dashboard_url` | CloudWatch 仪表板的直接链接 |
| `next_steps` | 完整的部署后命令指南 |
*使用 Amazon Bedrock · Amazon Athena · AWS CloudTrail · ECS Fargate · Terraform 构建*
标签:Amazon Athena, Amazon Bedrock, AWS CloudTrail, AWS ECS Fargate, Claude 3.5 Haiku, Cloudflare, Gradle集成, Kubernetes, MITRE ATT&CK, SOC 副驾驶, Streamlit, Text-to-SQL, 安全智能体, 安全运营, 扫描框架, 数据湖, 生成式 AI, 自然语言查询, 访问控制, 请求拦截, 逆向工具