Ganesh-403/honeycloud
GitHub: Ganesh-403/honeycloud
一个集成了实时可视化仪表盘与机器学习分析的可扩展蜜罐平台,用于捕获、分析 SSH/FTP/HTTP 攻击流量并对攻击者进行画像。
Stars: 1 | Forks: 0
# 🍯 Honey Cloud
## 目录
1. [架构](#architecture)
2. [项目结构](#project-structure)
3. [快速开始 (5 分钟)](#quick-start)
4. [演示脚本](#demo-script)
5. [配置](#configuration)
6. [API 参考](#api-reference)
7. [攻击者画像](#attacker-profiling)
8. [分析引擎](#analytics-engine)
9. [ML 引擎](#ml-engine)
10. [WebSocket 订阅流](#websocket-feed)
11. [仪表盘](#dashboard)
12. [蜜罐模块](#honeypot-modules)
13. [测试](#testing)
14. [部署](#deployment)
15. [安全说明](#security-notes)
## 架构
```
┌──────────────────────────────────────────────────────────────────────┐
│ Honey Cloud │
│ │
│ Browser FastAPI Backend Database │
│ ┌────────┐ HTTPS/WS ┌──────────────────────┐ ┌──────────────┐ │
│ │Dashboard│◄──────────►│ API Layer (v1) │ │SQLite / │ │
│ │(nginx) │ │ auth · events │ │Postgres │ │
│ └────────┘ │ analytics · profiles │◄─│ │ │
│ │ ml · reports │ └──────────────┘ │
│ Honeypots └──────┬───────────────┘ │
│ ┌───────┐ POST /ingest │ Services layer │
│ │SSH │──────────────► EventService │
│ │FTP │ ProfilerService │
│ │HTTP │ AlertService (Telegram) │
│ └───────┘ ReportService (CSV/XLSX) │
│ │ │
│ Attackers │ ML Engine │
│ (Internet) ──TCP──► Honeypots │ IsolationForest │
│ │ 10 semantic features │
│ Telegram ◄─── Alerts ─────────┘ │
└──────────────────────────────────────────────────────────────────────┘
```
**每次攻击事件的采集流水线:**
```
TCP → Honeypot → POST /ingest (201 ~50ms)
│
┌──────┴──────────────────────────────────┐
│ sync │ background
│ resolve IP │ update AttackerProfile
│ geo-enrich │ pattern detection
│ ML classify │ Telegram alert
│ DB persist │ WebSocket broadcast
└─────────────────────────────────────────┘
```
## 项目结构
```
honeycloud/
├── Makefile ← developer command centre
├── simulate_attacks.py ← demo / smoke-test script
├── docker-compose.yml ← production stack
├── docker-compose.dev.yml ← dev hot-reload overrides
├── .env.example ← copy → .env
├── .gitignore
├── README.md
│
├── backend/
│ ├── Dockerfile ← multi-stage (builder + runtime)
│ ├── requirements.txt
│ ├── pytest.ini
│ ├── tests/
│ │ ├── conftest.py ← fixtures, in-memory DB
│ │ ├── test_auth.py
│ │ ├── test_events.py
│ │ ├── test_analytics.py
│ │ ├── test_profiles.py
│ │ ├── test_ml.py
│ │ └── test_security.py
│ └── app/
│ ├── main.py ← factory, lifespan, middleware
│ ├── core/
│ │ ├── config.py ← pydantic-settings
│ │ ├── security.py ← JWT + bcrypt
│ │ ├── rate_limit.py ← slowapi limiter singleton
│ │ ├── logging.py ← structured logging
│ │ ├── exceptions.py ← hierarchy + handlers
│ │ └── websocket_manager.py ← WS connection registry
│ ├── api/deps.py ← DI providers
│ ├── api/v1/
│ │ ├── router.py ← aggregates all sub-routers
│ │ ├── auth.py ← login (rate-limited)
│ │ ├── events.py ← ingest · list · SSE · WebSocket
│ │ ├── analytics.py ← 7 analytics endpoints
│ │ ├── profiles.py ← attacker profiles + block/unblock
│ │ ├── ml.py ← train · status · predict
│ │ ├── stats.py
│ │ ├── reports.py
│ │ └── simulate.py
│ ├── schemas/ ← Pydantic models
│ ├── models/
│ │ ├── attack_event.py ← ORM: events table
│ │ └── attacker_profile.py ← ORM: per-IP profiles table
│ ├── db/session.py
│ ├── repositories/
│ │ ├── event_repository.py
│ │ ├── profile_repository.py
│ │ └── analytics_repository.py
│ ├── services/
│ │ ├── event_service.py ← ingest pipeline + BackgroundTasks
│ │ ├── profiler_service.py ← pattern detection engine
│ │ ├── alert_service.py
│ │ ├── geo_service.py
│ │ └── report_service.py
│ ├── honeypots/
│ │ ├── base.py ← BaseHoneypot ABC
│ │ ├── ssh_honeypot.py
│ │ ├── ftp_honeypot.py
│ │ └── http_honeypot.py
│ └── ml/
│ ├── detector.py ← IsolationForest wrapper
│ └── features.py ← 10-feature extraction pipeline
│
└── frontend/
├── Dockerfile
├── nginx.conf
├── index.html ← auth redirect
├── login.html ← login page
└── dashboard.html ← full analytics dashboard
```
## 快速开始
### 前置条件
- Docker ≥ 24 + Docker Compose v2(推荐)
- 或用于本地开发的 Python 3.11+
### 1. 克隆并配置
```
git clone https://github.com/your-org/honeycloud.git
cd honeycloud
cp .env.example .env
make gen-key # updates .env SECRET_KEY with a strong secret
# 查看 .env 以设置 DATABASE_URL、TELEGRAM_*、速率限制和 honeypot 端口。
```
### 2. 启动技术栈
```
make prod # production (background)
# 或
make dev # development (hot-reload, foreground)
```
| URL | 描述 |
|-----|-------------|
| http://localhost | 仪表盘 (登录: admin / admin123) |
| http://localhost:8000/docs | API 文档 (仅限 DEBUG 模式) |
| ws://localhost:8000/api/v1/events/ws?token=JWT | WebSocket 订阅流 |
### 3. 生成演示数据
```
make seed # 30 simulated attacks via the API
# 或
python simulate_attacks.py --count 50 --report
```
### 4. 训练 ML 模型
```
make train-ml # trains IsolationForest on stored events
```
### 默认凭据
| 用户名 | 密码 | 角色 |
|----------|----------|------|
| `admin` | `admin123` | 管理员 (完全访问) |
| `analyst` | `analyst123` | 分析员 (只读) |
## 快速 API 工作流 (curl 示例)
1. 登录并获取 token:
```
curl -s -X POST http://localhost:8000/api/v1/auth/login \
-d "username=admin" -d "password=admin123" \
-H "Content-Type: application/x-www-form-urlencoded" \
| jq -r '.access_token'
```
2. 模拟演示事件:
```
TOKEN="$(...login command...)"
curl -X POST "http://localhost:8000/api/v1/simulate?count=30" \
-H "Authorization: Bearer $TOKEN"
```
3. 训练 ML 模型:
```
curl -X POST http://localhost:8000/api/v1/ml/train \
-H "Authorization: Bearer $TOKEN"
```
4. 检查仪表盘统计:
```
curl -X GET http://localhost:8000/api/v1/stats/ \
-H "Authorization: Bearer $TOKEN"
```
### 故障排除
- `/api/v1/events/ws` 出现 `401 Unauthorized`:JWT 缺失、过期或查询参数格式错误。
- `/api/v1/ml/train` 出现 `422 Unprocessable Entity`:首先需要至少 50 个事件(可使用 `/api/v1/simulate`)。
- `/api/v1/reports/generate` 出现 `500`:确保 `REPORTS_DIR` 存在,并且在 `send_telegram=true` 时 `TELEGRAM_*` 配置正确。
## 演示脚本
`simulate_attacks.py` 是一个包含 7 个阶段的端到端演示:
```
Phase 1 – Direct Attack Injection (15 distinct attack templates × 5 IPs)
Phase 2 – Bulk Simulation (/simulate endpoint, N events)
Phase 3 – ML Training (IsolationForest on all stored events)
Phase 4 – Results Summary (totals, service breakdown)
Phase 5 – Attacker Profiles (top IPs, risk tiers, pattern flags)
Phase 6 – Credential Intelligence (top usernames & passwords)
Phase 7 – XLSX Report (optional) (--report flag)
```
```
# 包含报告的完整演示
python simulate_attacks.py --count 100 --report
# 自定义主机/端口
python simulate_attacks.py --host 192.168.1.10 --port 8000
```
## 配置
来自 `.env` 的所有设置(切勿将 `.env` 提交到 git):
| 变量 | 默认值 | 必需 | 描述 |
|----------|---------|----------|-------------|
| `SECRET_KEY` | — | ✅ | JWT 签名密钥 (≥32 字符) |
| `DATABASE_URL` | `sqlite:///./data/honeycloud.db` | 否 | SQLAlchemy URL |
| `ENVIRONMENT` | `production` | 否 | `development`/`staging`/`production` |
| `DEBUG` | `false` | 否 | 显示 /docs,详细日志 |
| `ALLOWED_ORIGINS` | `["http://localhost:5173"]` | 否 | CORS 列表 |
| `RATE_LIMIT_PER_MINUTE` | `60` | 否 | 全局 API 速率限制 |
| `TELEGRAM_ALERTS_ENABLED` | `false` | 否 | Telegram 告警开关 |
| `TELEGRAM_BOT_TOKEN` | — | 否 | 来自 @BotFather |
| `TELEGRAM_CHAT_ID` | — | 否 | 目标聊天/频道 |
| `SSH_HONEYPOT_PORT` | `2222` | 否 | |
| `FTP_HONEYPOT_PORT` | `2121` | 否 | |
| `HTTP_HONEYPOT_PORT` | `8080` | 否 | |
## API 参考
所有受保护的路由都需要 `Authorization: Bearer `,除非另有说明。
### 认证
| 方法 | 路径 | 认证 | 描述 |
|--------|------|------|-------------|
| POST | `/api/v1/auth/login` | 无 | 返回 JWT (限速 10/分钟) |
| GET | `/api/v1/auth/me` | 必需 | 当前用户信息 |
| POST | `/api/v1/auth/logout` | 必需 | 撤销当前 token (通过 jti 加入黑名单) |
### 事件
| 方法 | 路径 | 认证 | 描述 |
|--------|------|------|-------------|
| POST | `/api/v1/events/ingest` | 无 | 采集事件 (蜜罐代理, 公开, 限速) |
| GET | `/api/v1/events/` | 必需 | 列表 (支持 limit, service, severity, time range 筛选) |
| GET | `/api/v1/events/stream` | 必需 | SSE 实时订阅流 (旧版) |
| WS | `/api/v1/events/ws?token=` | JWT 参数 | WebSocket 实时订阅流 (推荐) |
### 分析
| 方法 | 路径 | 认证 | 描述 |
|--------|------|------|-------------|
| GET | `/api/v1/analytics/summary` | 必需 | 概览数据 |
| GET | `/api/v1/analytics/timeline?mode=hourly\|daily` | 必需 | 时间序列 |
| GET | `/api/v1/analytics/geo` | 必需 | 按国家统计事件 |
| GET | `/api/v1/analytics/heatmap` | 必需 | 24×7 小时/天矩阵 |
| GET | `/api/v1/analytics/credentials` | 必需 | 热门用户名、密码、命令 |
| GET | `/api/v1/analytics/service-trend` | 必需 | SSH/FTP/HTTP 每日分布 |
### 攻击者画像
| 方法 | 路径 | 描述 |
|--------|------|-------------|
| GET | `/api/v1/analytics/summary` | 概览数据 |
| GET | `/api/v1/analytics/timeline?mode=hourly\|daily` | 时间序列 |
| GET | `/api/v1/analytics/geo` | 按国家统计事件 |
| GET | `/api/v1/analytics/heatmap` | 24×7 小时/天矩阵 |
| GET | `/api/v1/analytics/credentials` | 热门用户名、密码、命令 |
| GET | `/api/v1/analytics/service-trend` | SSH/FTP/HTTP 每日分布 |
### 攻击者画像
| 方法 | 路径 | 认证 | 描述 |
|--------|------|------|-------------|
| GET | `/api/v1/profiles/` | 必需 | 列出画像 (支持筛选) |
| GET | `/api/v1/profiles/summary` | 必需 | 风险层级计数 + 热门攻击者 |
| GET | `/api/v1/profiles/{ip}` | 必需 | 单个 IP 的完整画像 |
| POST | `/api/v1/profiles/{ip}/block` | 管理员 | 封禁 IP |
| POST | `/api/v1/profiles/{ip}/unblock` | 管理员 | 解除封禁 |
### ML 引擎
| 方法 | 路径 | 认证 | 描述 |
|--------|------|------|-------------|
| GET | `/api/v1/ml/status` | 必需 | 模型状态 + 特征 |
| POST | `/api/v1/ml/train` | 管理员 | 基于存储的事件进行训练 |
| POST | `/api/v1/ml/predict` | 必需 | 单次事件预测 (调试) |
### 报告与统计
| 方法 | 路径 | 认证 | 描述 |
|--------|------|------|-------------|
| GET | `/api/v1/stats/` | 必需 | 按 severity/service/AI 标签聚合计数 |
| POST | `/api/v1/reports/generate?fmt=csv\|xlsx\|txt&send_telegram=true|false` | 管理员 | 生成报告,可选通过 Telegram 发送 |
| GET | `/api/v1/reports/download?file=name` | 无 | 安全文件下载 (安全路径验证) |
| POST | `/api/v1/simulate/?count=N` | 必需 | 生成 N 个演示事件 (已认证用户) |
## 攻击者画像
HoneyCloud 会自动为每个唯一的攻击 IP 构建持久的 `AttackerProfile`。每次采集事件后,画像会在后台更新。
### 风险层级
| 层级 | 加权得分 | 描述 |
|------|---------------|-------------|
| UNKNOWN | 0–2 | 新近 / 最小活动 |
| LOW | 2–8 | 轻度探测 |
| MEDIUM | 8–20 | 主动扫描 |
| HIGH | 20–50 | 持续攻击 |
| CRITICAL | 50+ | 严重 / 持续威胁 |
| BLOCKED | — | 管理员封禁 |
得分公式:
```
score = (critical_events × 4) + (high_events × 2)
+ brute_force_bonus(15) + credential_stuffing_bonus(10)
+ scanner_bonus(8)
```
### 模式检测
| 模式 | 检测规则 |
|---------|----------------|
| 暴力破解 | 同一 IP 在 60 秒内 ≥ 10 个事件 |
| 凭据填充 | 同一 IP 在 5 分钟内 ≥ 5 个不同密码 |
| 端口扫描 | 同一 IP 在 5 分钟内 ≥ 3 个不同服务 |
## 分析引擎
7 个由优化的原生 SQL 查询支持的分析端点:
- **Timeline (时间线)**:按小时 (24h) 或按天 (30 天) 统计事件
- **Geo distribution (地理分布)**:按事件数和唯一 IP 统计的前 50 个国家
- **Heatmap (热力图)**:24×7 矩阵,显示攻击在*何时*达到高峰(非常适合调度)
- **Credential intelligence (凭据情报)**:最常尝试的用户名、密码和命令
- **Service trend (服务趋势)**:SSH/FTP/HTTP 每日分布,用于趋势分析
## ML 引擎
### 特征 (10 维)
```
service_port – protocol port (SSH=22, FTP=21, HTTP=80)
username_len – character length of attempted username
password_len – character length of attempted password
command_len – character length of command / path
source_port – originating port
hour_of_day – hour (0–23) from event timestamp
dangerous_pattern_count – count of matched dangerous regex patterns
is_root_user – 1 if username in {root, admin, administrator}
is_anonymous_user – 1 if username in {anonymous, guest, visitor}
has_command – 1 if command/path is non-empty
```
### 标签
| 标签 | 条件 |
|-------|-----------|
| `benign` | IsolationForest 内点 |
| `anomaly` | 离群点, 威胁得分 < 0.6 |
| `malicious` | 离群点, 威胁得分 ≥ 0.6 |
| `unknown` | 模型尚未训练 |
### 训练 / 重训练周期
```
# 在积累 ≥ 50 个事件后:
make train-ml
# 或通过 API:
curl -X POST http://localhost:8000/api/v1/ml/train \
-H "Authorization: Bearer $TOKEN"
```
模型持久化到 `data/ml_model.pkl` 并在重启时重新加载。
## WebSocket 订阅流
实时推送式事件流 —— 零轮询开销。
```
// Connect
const ws = new WebSocket(`ws://localhost:8000/api/v1/events/ws?token=${jwt}`);
// Receive events
ws.onmessage = ({ data }) => {
const msg = JSON.parse(data);
if (msg.type === 'new_attack') {
console.log(msg.data); // full event object
}
};
// Ping / connection count
ws.send(JSON.stringify({ type: 'ping' }));
// → { "type": "pong", "connections": 3 }
```
服务器每 30 秒发送一次 `{ "type": "heartbeat" }`。断开连接的客户端会自动重新连接(仪表盘每 4 秒重试一次)。
## 仪表盘
位于 `/dashboard.html` 的单文件 SPA —— 无需构建步骤。
| 页面 | 内容 |
|------|----------|
| **Overview (概览)** | 6 个统计卡片 + 4 个 Chart.js 图表 (时间线, 严重程度, 服务, AI);自动刷新 15 秒 |
| **Live Feed (实时订阅)** | WebSocket 驱动的事件表;按服务/严重程度筛选;最多 200 行 |
| **Analytics (分析)** | 30 天时间线、服务趋势、地理前 12 柱状图 |
| **Profiles (画像)** | IP 风险表;封禁/解封操作;点击 IP 查看完整详情面板 |
| **Heatmap (热力图)** | 24×7 颜色渐变攻击时间矩阵 |
| **Credentials (凭据)** | 前 15 个用户名、密码和命令,带动画柱状图 |
## 蜜罐模块
均继承自 `BaseHoneypot`:
```
class BaseHoneypot(ABC):
protocol: str # "SSH" | "FTP" | "HTTP"
async def start(port: int): ...
async def stop(): ...
# Helpers available to all subclasses:
_build_event(source_ip, source_port, **kwargs) → dict
_post_event(event: dict) # fire-and-forget POST to /ingest
_classify_command(cmd) → str # "LOW" | "MEDIUM" | "HIGH" | "CRITICAL"
```
**添加新的蜜罐:**
1. 创建 `app/honeypots/myproto_honeypot.py` 继承 `BaseHoneypot`
2. 设置 `protocol = "MYPROTO"` 并实现 `start()` / `stop()`
3. 使用 `_build_event()` + `_post_event()` —— 无需其他更改
4. 在 `main.py` 生命周期块中注册
## 测试
```
# 安装测试依赖
cd backend && pip install pytest httpx pytest-asyncio
# 运行所有测试
make test
# 带覆盖率
make test-cov
# 快速(跳过 ML 测试)
make test-fast
```
测试套件覆盖:
| 模块 | 测试 | 范围 |
|--------|-------|-------| `test_auth.py` | 6 | 登录, JWT, 角色 |
| `test_events.py` | 10 | 采集, 筛选, schema, 边界情况 |
| `test_analytics.py` | 10 | 所有 7 个分析端点 |
| `test_profiles.py` | 9 | CRUD, 封禁/解封, RBAC |
| `test_ml.py` | 8 | 特征提取, 训练, 保存/加载 |
| `test_security.py` | 10 | 被篡改的 token, 路径遍历, 超大负载 |
## 部署
### 生产清单
- [ ] `SECRET_KEY` 为随机的 64 字符十六进制 (`make gen-key`)
- [ ] `ENVIRONMENT=production`, `DEBUG=false`
- [ ] `ALLOWED_ORIGINS` 锁定到您的实际域名
- [ ] Telegram token 已配置 (或 `TELEGRAM_ALERTS_ENABLED=false`)
- [ ] 蜜罐端口 (2222, 2121, 8080) 已暴露;API 端口 (8000) 仅限内部
- [ ] Nginx 终止 TLS;后端位于反向代理之后
- [ ] `data/` 和 `reports/` 卷已备份
- [ ] 积累真实流量后运行 `make train-ml`
### 切换到 PostgreSQL
```
# .env
DATABASE_URL=postgresql+psycopg2://honeycloud:password@db:5432/honeycloud
# requirements.txt – 添加:
# psycopg2-binary==2.9.9
# Analytics 查询使用 strftime() – 对 Postgres 更新为 date_trunc():
# strftime('%Y-%m-%dT%H:00:00', timestamp) → to_char(date_trunc('hour', timestamp), 'YYYY-MM-DD"T"HH24:00:00')
```
## 安全说明
| 领域 | 实现 |
|------|---------------|
| Secrets | `pydantic-settings` + `.env`;源代码中无密钥 |
| 密码 | 通过 `passlib` 使用 bcrypt |
| JWT | HS256, 可配置过期时间, 每次请求验证 |
| Rate limiting | `slowapi` – 登录 10/分钟, 全局 60/分钟 |
| CORS | 显式 `ALLOWED_ORIGINS` (无通配符) |
| 输入验证 | 所有路由上的 Pydantic v2 字段验证器 |
| 路径遍历 | `ReportService.safe_path()` 使用 `Path.resolve()` 父级检查 |
| WebSocket 认证 | 连接升级前验证 JWT;`4001 Unauthorized` |
| 容器 | Dockerfile 中的 `USER appuser` (UID 1001) |
| RBAC | `analyst` → 只读;`admin` → 完全权限,包括 封禁/训练/报告 |
*基于 FastAPI · SQLAlchemy · scikit-learn · asyncio · WebSockets · Chart.js · Docker 构建*
标签:AMSI绕过, Apex, AV绕过, BOF, CISA项目, Dashboard, FastAPI, FTP监控, Honeypot, HTTP/HTTPS抓包, HTTP协议, ML, PE 加载器, PostgreSQL, Python, SOC工具, SQLite, SSH安全, WebSocket, 事件流, 仪表盘, 依赖分析, 入侵分析, 凭据窃取, 威胁情报, 威胁检测, 安全运营, 开发者工具, 异常流量, 态势感知, 扫描框架, 攻击分析, 攻击者画像, 无后门, 机器学习, 欺骗防御, 测试用例, 漏洞发现, 漏洞捕获, 网络安全, 蜜罐系统, 计算机取证, 请求拦截, 逆向工具, 隐私保护