SeanCrimi-007/honeypot-dashboard
GitHub: SeanCrimi-007/honeypot-dashboard
基于 Cowrie 蜜罐的实时 Web 可视化仪表盘,通过 FastAPI 后端与 Chart.js 前端将 SSH 攻击日志转化为地理分布、凭据分析与会话下钻等 SOC 风格的威胁情报视图。
Stars: 0 | Forks: 0
# Cowrie 蜜罐仪表盘
一个实时 Web 仪表盘,用于可视化由 [Cowrie](https://github.com/cowrie/cowrie) 捕获的 SSH 蜜罐攻击数据。该项目作为网络安全作品集构建——部署蜜罐,将其日志导入 SQLite,并以暗色主题的 SOC 风格仪表盘呈现攻击数据。
## 你将看到的内容
- **攻击地图** —— 根据攻击量调整标记大小,展示源 IP 的世界地图
- **时间轴图表** —— 可选时间窗口(7 天 / 30 天 / 全部时间)内的每日攻击次数
- **Top 源 IP** —— 包含国旗、组织/ASN 以及攻击次数
- **会话下钻** —— 点击任意攻击者 IP 查看其会话,他们尝试的每一个
凭据,以及登录后运行的每一条命令
- **凭据分析** —— 尝试次数最多的用户名、密码以及用户名:密码组合
- **攻击者命令** —— 成功获取 shell 的攻击者输入的 shell 命令
- **统计卡片** —— 总攻击数、独立 IP 数、会话数、主要攻击国家
- **样本数据徽章** —— 当
数据库由演示生成器填充时,标题胶囊会如实显示 *Sample Data*,否则显示 *Live*
## 架构
```
┌──────────────────┐ ┌────────────────┐ ┌──────────┐ ┌───────────┐ ┌─────────────────┐
│ Cowrie SSH │────▶│ ingest.py │────▶│ SQLite │────▶│ app.py │────▶│ Dashboard │
│ Honeypot │ │ JSON parser │ │ 4 tables│ │ FastAPI │ │ Chart.js │
│ port 2222 │ │ + ip-api.com │ │ │ │ JSON API │ │ Leaflet │
└──────────────────┘ └────────────────┘ └──────────┘ └───────────┘ └─────────────────┘
cowrie.json geo cache
```
**技术栈:** Python 3 · FastAPI · SQLite · 原生 HTML/CSS/JS · Chart.js · Leaflet
没有构建步骤,没有 Node.js,没有 React。每个文件都具备极高的可读性。
## 为什么做这个项目
我构建这个项目是为了展示端到端的 SOC 分析师技能:
- **威胁情报收集** —— 运营生产级蜜罐并捕获真实攻击数据
- **日志摄取 pipeline** —— 解析结构化日志,使用地理/ASN 数据进行丰富,实现幂等处理
- **数据分析** —— 揭示撞库活动、攻击者工具和地理来源中的规律
- **安全的 Web 应用** —— 参数化 SQL、防 XSS 渲染、仅限 localhost 绑定
它产生的数据集正是分析师在早期分流中会看到的内容:谁在尝试连接、他们在试探什么,以及他们进入后会做什么。
## 前置条件
- Ubuntu / Debian Linux
- Python 3.10+
- `python3-venv`、`libssl-dev`、`libffi-dev`(使用 `sudo apt-get install -y python3-venv libssl-dev libffi-dev` 一次性安装)
- Cowrie(参见下方的[部署 Cowrie](#deploy-cowrie))**或者**使用带有合成数据的 `--demo` 模式
## 快速开始(演示模式)
演示模式会加载合成数据,让你无需部署蜜罐即可立即查看仪表盘。
```
git clone
cd honeypot-dashboard
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
./run.sh --demo
# 打开 http://127.0.0.1:8000
```
## 部署 Cowrie
```
# 系统 deps
sudo apt-get install -y git python3-venv libssl-dev libffi-dev
# 克隆并安装
git clone https://github.com/cowrie/cowrie ~/cowrie
cd ~/cowrie
python3 -m venv cowrie-env
source cowrie-env/bin/activate
pip install -r requirements.txt
pip install -e .
# Config(默认监听 2222 端口并写入 JSON 日志)
cp src/cowrie/data/etc/cowrie.cfg.dist etc/cowrie.cfg
# 启动
cowrie start
cowrie status
# Log: ~/cowrie/var/log/cowrie/cowrie.json
```
重定向真实端口 22 的流量(在 VPS 上,而不是你的主力机器上):
```
sudo iptables -t nat -A PREROUTING -p tcp --dport 22 -j REDIRECT --to-port 2222
```
## 运行仪表盘
```
cd honeypot-dashboard
source .venv/bin/activate
# One-shot:导入新日志行后退出
python ingest.py
# Live mode:跟随 Cowrie 日志 + 提供 dashboard
./run.sh
# 自定义日志路径
./run.sh /path/to/cowrie.json
```
仪表盘默认绑定到 `127.0.0.1:8000`。在添加身份验证之前,**切勿将其暴露到互联网**——它会显示真实的攻击者 IP 数据。
## 摄取详情
`ingest.py` 是幂等、可恢复且防崩溃的:
- 在数据库中跟踪每个日志文件的字节偏移量——重复运行始终安全
- 检测日志轮转(文件缩小)并从开头重新开始处理
- 格式错误的行和无法处理的事件(例如轮转后
孤立的会话引用)会被计数并跳过——它们绝不会导致 pipeline 崩溃
- 新 IP 会通过 [ip-api.com](https://ip-api.com) 进行地理丰富(免费,无需密钥,限制 45 次请求/分钟)并缓存——每个 IP 仅查询一次,因此仪表盘本身可以完全离线工作
- 将 `ingest.py` 中的 `GEO_LOOKUP` 替换为使用 MaxMind GeoLite2 或其他提供商
## 项目结构
```
honeypot-dashboard/
├── app.py # FastAPI backend (10 JSON endpoints)
├── ingest.py # Log ingestion pipeline
├── schema.sql # SQLite schema (4 data tables + state/meta tables)
├── run.sh # Start ingestion + API together
├── requirements.txt
├── requirements-dev.txt# + pytest, httpx (for the test suite)
├── .gitignore # Excludes honeypot.db and cowrie.json (real attack data)
├── static/
│ └── index.html # Single-page dashboard (Chart.js + Leaflet)
├── sample_data/
│ └── generate.py # Synthetic data generator for demos
└── tests/
├── conftest.py # Seeded temp-DB fixtures (never touches real data or network)
├── test_ingest.py # Parsing robustness, idempotency, rotation, geo cache
└── test_api.py # Every API endpoint, exact-count assertions
```
## 运行测试
```
source .venv/bin/activate
pip install -r requirements-dev.txt
pytest
```
该测试套件(33 个测试)涵盖了日志解析的鲁棒性(格式错误的行、日志轮转后
孤立的事件)、摄取幂等性,以及针对固定合成数据集且带有精确计数断言的每个 API endpoint。测试使用了
临时数据库和存根地理位置查询——它们绝不会触碰真实数据或
网络。
## 截图



## 我学到了什么
- **蜜罐数据无比真实。** 在暴露 Cowrie 的几小时内,
撞库机器人就开始疯狂使用 `root`/`123456` 轰炸它,并投放
挖矿程序安装脚本。阅读真实的攻击者命令序列让我对
漏洞利用后的行为有了比任何分析文章都更深刻的了解。
- **将攻击者输入视为具有放射性的危险品,进行端到端处理。** 这个系统中的每一串
数据——用户名、密码、shell 命令——都受攻击者控制。这
影响了具体的决策:到处使用参数化 SQL,在前端使用 `textContent` 而不是
`innerHTML`,并且绝不执行捕获的数据或将其传递给 shell。
- **摄取 pipeline 的失败往往平淡无奇。** 我遇到的 bug 并不罕见:
日志轮转导致字节偏移量失效、孤立的事件引用了被
轮转删除的文件中的会话、格式错误的 JSON 行。让 pipeline 具备幂等性
和防崩溃能力比任何功能都更重要。
- **测试是我能够重构的基础。** 有了针对
固定合成数据集的精确计数断言,我就可以修复 SQL 中的时间窗口 bug,并且
立刻确信没有破坏其他任何东西。
## 安全提示
- **切勿执行攻击者命令。** `commands` 表包含攻击者输入的字面 shell 内容。其存储目的仅用于分析。
- **XSS 预防。** 所有受攻击者控制的字符串(用户名、密码、命令)都通过 `textContent` 渲染,绝不使用 `innerHTML`。
- **仅使用参数化 SQL。** 任何地方都没有使用字符串拼接的查询。
- **Localhost 绑定。** 仪表盘默认绑定到 `127.0.0.1`。在远程暴露之前,请添加带有身份验证(nginx + 基本身份验证,或 Caddy)的反向代理。
- **Gitignore 的数据。** `honeypot.db` 和 `cowrie.json` 被排除在版本控制之外——它们包含真实的攻击者 IP 和捕获的凭据。
## 后续工作
- **MITRE ATT&CK 映射** —— 将捕获的命令分类到技术 ID,并显示频率热图
- **AbuseIPDB 丰富** —— 获取攻击者 IP 的信誉评分
- **峰值告警** —— 检测异常攻击量并发出通知
- **PDF/CSV 威胁报告** —— 针对给定时间窗口的可导出摘要
## 许可证
MIT。本项目仅用于防御性研究和教育目的。
标签:AV绕过, FastAPI, SQLite, 威胁情报, 安全运营, 开发者工具, 扫描框架, 蜜罐技术