AlonsoMarcosM/DAMN-TEAMSSN
GitHub: AlonsoMarcosM/DAMN-TEAMSSN
基于 Terraform 在 AWS 上一键部署 Cowrie SSH 蜜罐,并结合 S3、Lambda 与 SNS 实现日志分析与告警的开源安全监控项目。
Stars: 0 | Forks: 0
# DAMN-TEAMSSN - AWS 上的 Honeypot(完整文档)
在 AWS 上可复现的基础设施,包含基于 Cowrie 的 Honeypot、S3 日志存储、Lambda 分析、SNS 告警以及 CloudWatch 报警。本 README 汇总了项目的所有文档。
## 1) 目标和范围
- 在 EC2 上部署 SSH Honeypot (Cowrie)。
- 将证据保存到 S3 中。
- 使用 Lambda 分析日志并通过 SNS 发送告警。
- 使用 CloudWatch 监控实例的基本状态。
- 提供基于 Terraform 的可复现 IaC 以及 PowerShell 脚本。
## 2) 架构
```
flowchart LR
Internet((Internet)) -->|SSH 22| EC2[EC2 Cowrie]
EC2 -->|logs| S3[(S3 Logs)]
S3 -->|ObjectCreated: cowrie/| Lambda[Lambda Analyzer]
Lambda -->|alerts| SNS[SNS Email]
Lambda --> CWLogs[CloudWatch Logs]
EC2 --> CW[CloudWatch Metrics]
CW -->|alarms| SNS
```
## 3) 技术决策
- 暴露 SSH 22 端口用于 Honeypot。
- 为简单起见禁用 Telnet。
- 通过 SSM 进行实际管理 (`enable_ssm=true`);如果禁用,则使用受限 CIDR 通过 22222 端口进行 SSH。
- 通过 EIP 保持稳定的公网 IP。
- 通过 cron 每 5 分钟将日志同步到 S3。
- S3 Bucket 启用 SSE-S3 加密并阻止公开访问。
- 在实验室环境中对 Bucket 设置 `force_destroy=true`。
## 4) 团队工作流
- 每人一个分支(例如:`feature/alonso-hito1`)。
- 必须向 `main` 提交 PR,并由另一名成员审查。
- 每人使用唯一的后缀:`amm`、`nlr`、`mpg`、`dtm`。
- 资源前缀:`proy-damn-teamssn`。
- 标签:`Project=DAMN-TEAMSSN`、`Owner=`、`Env=dev`。
## 5) 仓库结构
- `infra/`:Terraform 主模块和子模块。
- `src/lambda/analyzer/`:Lambda 代码。
- `scripts/`:PowerShell 自动化脚本。
- `envs/`:tfvars 和模板。
- `docs/`:附加文档。
## 6) 前置要求
- Terraform >= 1.5
- AWS CLI
- PowerShell (Windows)
- AWS 实验室账户(区域 us-east-1)
## 7) AWS 凭证(不纳入版本控制)
模板:`envs/aws_credentials.example`。
存放位置:
- Windows:`C:\Users\\.aws\credentials`
- Linux/Mac:`~/.aws/credentials`
创建 profile:
```
aws configure --profile
aws sts get-caller-identity --profile
```
如果你不想在每个命令中输入 `--profile`:
```
$env:AWS_PROFILE=""
```
## 8) 个人配置 (tfvars)
1. 复制示例:
```
Copy-Item .\envs\alonso.tfvars.example .\envs\alonso.tfvars
```
2. 编辑 `envs/alonso.tfvars`:
- `resource_suffix`(唯一)。
- `admin_email` (SNS)。
- `aws_profile`, `aws_region`。
- `allowed_admin_cidr`(仅在禁用 SSM 时使用)。
- 如果你没有 IAM 权限,请配置 `existing_instance_profile_name` / `existing_lambda_role_arn`。
## 9) 部署和销毁
```
.\scripts\up.ps1 -Env alonso
```
```
.\scripts\down.ps1 -Env alonso
```
## 10) 输出
```
.\scripts\show_outputs.ps1 -Env alonso
```
保存 `public_ip`、`instance_id`、`s3_bucket`、`sns_topic_arn`、`lambda_name`。
注意:由于使用了 EIP,`public_ip` 将保持不变,但如果你替换了 EC2,`instance_id` 会发生改变。
## 11) 技术验证(Cowrie 和 SSM)
```
aws ssm describe-instance-information --filters Key=InstanceIds,Values= --profile
```
```
aws ssm send-command --instance-ids --document-name "AWS-RunShellScript" --parameters file://scripts/ssm_cowrie_check_ascii.json --profile
```
预期输出:
- `systemctl is-active cowrie` = `active`
- `twistd` 正在监听 `:22`
## 12) 最终测试(完整 pipeline)
1. 在 `admin_email` 的邮箱中确认 SNS 订阅。
2. 受控的 SSH 尝试:
```
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o BatchMode=yes -o ConnectTimeout=5 -p 22 fakeuser@
```
3. 强制同步到 S3:
```
aws ssm send-command --instance-ids --document-name "AWS-RunShellScript" --parameters file://scripts/ssm_cowrie_sync.json --profile
```
4. 查看 S3 中的对象:
```
aws s3 ls s3:///cowrie//
```
5. 查看 Lambda 日志:
```
aws logs tail /aws/lambda/proy-damn-teamssn-analyzer- --since 10m --profile
```
6. 检查电子邮件:
- 来自 Honeypot 的 SNS 告警。
- CloudWatch 的 OK/ALARM(如果状态发生变化)。
如果没有收到告警,请增加事件直至超过阈值并再次同步:
```
1..10 | ForEach-Object { ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o BatchMode=yes -o ConnectTimeout=3 -p 22 fakeuser@ }
aws ssm send-command --instance-ids --document-name "AWS-RunShellScript" --parameters file://scripts/ssm_cowrie_sync.json --profile
aws logs tail /aws/lambda/proy-damn-teamssn-analyzer- --since 10m --profile
```
## 13) 快速操作手册(按顺序执行的命令)
参数化形式:
```
scripts\up.ps1 -Env
scripts\show_outputs.ps1 -Env
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o BatchMode=yes -o ConnectTimeout=5 -p 22 fakeuser@
aws ssm send-command --instance-ids --document-name "AWS-RunShellScript" --parameters file://scripts/ssm_cowrie_sync.json --profile
aws s3 ls s3:///cowrie//
aws logs tail /aws/lambda/proy-damn-teamssn-analyzer- --since 10m --profile
scripts\down.ps1 -Env
```
实际示例:
```
scripts\up.ps1 -Env alonso
scripts\show_outputs.ps1 -Env alonso
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o BatchMode=yes -o ConnectTimeout=5 -p 22 fakeuser@54.236.128.229
aws ssm send-command --instance-ids i-04b9ab0c57e0a2446 --document-name "AWS-RunShellScript" --parameters file://scripts/ssm_cowrie_sync.json --profile alonso
aws s3 ls s3://proy-damn-teamssn-logs-amm2-851725275441/cowrie/amm2/
aws logs tail /aws/lambda/proy-damn-teamssn-analyzer-amm2 --since 10m --profile alonso
scripts\down.ps1 -Env alonso
```
## 14) 仅替换 EC2(新的 user_data)
```
terraform -chdir=infra apply -var-file=.\envs\alonso.tfvars -replace=module.honeypot_ec2.aws_instance.honeypot -auto-approve
```
## 15) 快速故障排除
- BucketAlreadyExists:
- 更改 `resource_suffix`。
- 未收到 SNS:
- 使用 `aws sns list-subscriptions-by-topic` 检查 `PendingConfirmation`。
- 接受邮件确认。
- Lambda 没有 log group:
- 尚未被调用;需先将日志上传至 S3。
- SSH "connection refused":
- Cowrie 未处于活跃状态;使用 SSM 进行检查。
- Python 版本不兼容错误:
- 在 Amazon Linux 2023 上,Cowrie 需要 Python 3.11。
- 重复的 `listen_endpoints`:
- 如果有过手动修改,请检查 `cowrie.cfg`。
## 16) 实用脚本
- `scripts\up.ps1` / `scripts\down.ps1`
- `scripts\show_outputs.ps1`
- `scripts\ssm_cowrie_check_ascii.json`
- `scripts\ssm_cowrie_sync.json`
标签:AI合规, AWS, DPI, ECS, PB级数据处理, Terraform, 威胁监控, 安全运维, 无服务器, 蜜罐, 证书利用