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)** 提供支持。 ![架构图](https://raw.githubusercontent.com/engrbayo/Cloudtrail-threat-hunting/main/architecture_1.png) ## 目录 - [概述](#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, 自然语言查询, 访问控制, 请求拦截, 逆向工具