akrontab/honey-net
GitHub: akrontab/honey-net
用于威胁情报和攻击者行为研究的蜜网网络工具。
Stars: 0 | Forks: 0
# honey-net
一个用于威胁情报和攻击者行为研究的概念验证蜜网网络。蜜网服务器将常见服务(SSH、Telnet、MySQL、HTTP、SMB、FTP)暴露给公共互联网,捕获攻击者活动,并通过 Tailscale VPN 将日志发送到私有的 Grafana/Loki 堆栈。
**成本:** 在 Linode Nanodes 上约为 $10-15/月。**CLAUDE.md** 包含每个组件的完整技术细节。
## 快速开始
所需账户:[Linode](https://linode.com)(API 令牌)· [Tailscale](https://tailscale.com)(API 密钥,免费层)
**1. 克隆并设置**
```
git clone https://github.com/akrontab/honey-net
cd honey-net
.\setup.ps1 # macOS/Linux: ./setup.sh
.venv\Scripts\activate
python honey.py check-keys # generates any missing SSH key pairs
```
**2. 部署所有服务器**
```
python honey.py
```
选择 **provision**。预先提示凭据(Linode 令牌、Tailscale API 密钥、Grafana 密码),然后按依赖顺序部署每个服务器——首先部署后端(log-stack → malware-catalog),然后部署蜜网——自动转发 `LOKI_HOST` 和 `CATALOG_URL`。
**3. 验证**
```
python honey.py
```
选择 **logs** 以本地提取日志文件。在 `http://:3000` 打开 Grafana — 原始流出现在 `{job="cowrie"}`、`{job="mysql"}`、`{job="http"}`、`{job="smb"}`、`{job="ftp"}` 下;标准化跨蜜网流是 `{job="events"}`。
## 架构
```
┌──────────────────────────────────────────────────────────────────────────────┐
│ Tailscale VPN │
│ │
│ ┌──────────────────────┐ ┌──────────────────────────────────────────┐ │
│ │ honeypot server │──┐ │ log-stack │ │
│ │ service(s) + Vector │ ├─▶│ Loki · Grafana · Nanode $5/mo │ │
│ │ Nanode $5/mo │ │ └──────────────────────────────────────────┘ │
│ └──────────────────────┘ │ │
│ │ ┌──────────────────────────────────────────┐ │
│ └─▶│ malware-catalog │ │
│ │ ui (nginx) · API · SQLite │ │
│ │ Nanode $5/mo │ │
│ └──────────────────────────────────────────┘ │
│ │
└──────────────────────────────────────────────────────────────────────────────┘
```
- **蜜网服务器**运行一个或多个服务包(Cowrie SSH/Telnet、MySQL、HTTP、SMB、FTP 模拟器)以及一个 Vector 附加组件,该组件通过 Tailscale 将日志发送到 Loki。面向公众。目前有两个服务器:`mysql-ssh`(cowrie、http、mysql)和 `smb-ftp`(smb、ftp)。
- **日志堆栈**运行 Grafana + Loki。接收来自所有蜜网的日志。从不暴露给公共互联网——仅 Tailscale。
- **恶意软件目录**接收运行 `malware-sender` 插件的蜜网中的恶意软件样本。通过 SHA-256 去重。通过 nginx 提供的 Web UI + REST API,API 后端仅限内部使用。
- 每个主机上的真实 SSH 端口为 **65022**,仅 Tailscale。端口 22 转发到蜜网。
## 设计
**比星巴克™ 更便宜** — 整个基础设施在 Linode Nanodes 上运行,每月每个 $5。选择服务是为了低资源开销,因此整个网络的成本低于一次咖啡之旅。
**可替换的组件** — 没有组件是以一种锁定整个系统的方式承载负载的。Vector 是蜜网和日志后端之间的抽象层——蜜网写入文件,Vector 将它们发送出去,只有后端更改时,sink 配置才会更改。
**隔离** — 蜜网是明确的不信任环境。Docker 将每个蜜网进程与主机操作系统隔离。管理服务(Grafana、Loki、恶意软件目录)绑定到私有 Tailscale IP,从不暴露给公共互联网。每个蜜网都在自己的 VM 上运行,因此攻击被限制在容器内。在部署时统一应用主机加固(UFW、SSH 密钥认证、fail2ban)。
**自描述的包** — 添加新的蜜网或插件不需要更改任何 root 脚本。控制平面需要的每个行为(日志路径、构建要求、部署步骤)都在包内部声明。Root 脚本在运行时通过读取包目录发现这些属性。
## 仓库布局
```
honey-net/
├── honey-pots/
│ ├── cowrie/ ← SSH/Telnet honeypot package
│ ├── mysql/ ← MySQL wire-protocol honeypot package
│ ├── http/ ← HTTP honeypot package
│ ├── smb/ ← SMB honeypot package
│ └── ftp/ ← FTP honeypot package
├── addons/
│ ├── metadata/ ← log sidecar: extracts metadata into inbox
│ └── malware-sender/ ← submits captured samples to malware-catalog
├── server-config/ ← shared host hardening (UFW, SSH, fail2ban)
├── log-stack/ ← Grafana + Loki stack
├── malware-catalog/ ← sample catalog: API, enrichment workers, web UI
│ └── deploy/
│ ├── catalog/ ← FastAPI backend + SQLite
│ ├── static-analyzer/ ← YARA, IOC extraction, ssdeep (always on)
│ ├── intel-fetcher/ ← MalwareBazaar + VirusTotal (opt-in)
│ ├── sandbox-submitter/← tria.ge dynamic analysis (opt-in)
│ ├── ui/ ← nginx + hash-routed browser UI
│ └── vector/ ← ships submission events to Loki
├── docs/ ← design & planning (!DESIGN, !VISION, plan files)
├── terraform/ ← infrastructure-as-code
├── lib/ ← shared Python library (config, ssh, color, package…)
├── scripts/
│ ├── provision.py ← end-to-end provisioning (terraform + server setup)
│ ├── redeploy.py ← update a live server (Tailscale, port 65022)
│ ├── connect.py ← SSH into a server
│ ├── sync_ips.py ← write IPs from Terraform + Tailscale to state.json
│ ├── get_logs.py ← pull logs from a honeypot
│ ├── gen_ts_key.py ← generate a Tailscale auth key
│ ├── check_ssh_keys.py ← check / generate SSH keys for all servers
│ ├── check_logs.py ← check log stream freshness in Loki
│ ├── check_disk.py ← check disk usage on all servers (25 GB Nanode limit)
│ ├── test_loki.py ← push a test log to Loki to verify the stack
│ └── test_honeypot.py ← run smoke tests for a honeypot type
├── honey-net.json ← server manifest (single source of truth)
├── state.json ← gitignored, written by sync_ips.py
├── honey.py ← interactive launcher for all commands
├── _lib.py ← backward-compat shim for honey-pots/*/test.py
├── setup.ps1 ← one-time local setup (Windows)
├── setup.sh ← one-time local setup (macOS/Linux)
└── requirements.txt
```
`honey-net.json` 是所有服务器的唯一真相来源。添加服务器条目就足够了——不需要更改 Terraform 模块或 root 脚本。
## 先决条件
**1. Python 环境** — 克隆后运行一次:
```
# Windows
.\setup.ps1
.venv\Scripts\activate
```
```
# macOS / Linux
./setup.sh
source .venv/bin/activate
```
**2. SSH 密钥对**——每个服务器一个。在 `honey-net.json` 中设置路径(`ssh_key` 字段):
```
ssh-keygen -t ed25519 -f "$env:USERPROFILE\.ssh\log-stack-linode"
ssh-keygen -t ed25519 -f "$env:USERPROFILE\.ssh\mysql-ssh-honeypot"
```
**3. Linode API 令牌**——cloud.linode.com → 个人资料 → API 令牌 → 创建(读取/写入 Linodes 范围)。
**4. Tailscale 账户**——[tailscale.com](https://tailscale.com)。免费层覆盖整个项目。
- Tailscale API 密钥(tailscale.com → 设置 → 密钥 → 生成 API 密钥)
- 首次运行时保存到 `~/.tailscale-apikey`;后续运行自动读取
- 使用 `python scripts/gen_ts_key.py` 生成授权密钥(后端使用非短暂密钥,`--ephemeral` 用于蜜网)
## 部署
Terraform 直接读取 `honey-net.json`。根密码自动生成并存储在 Terraform 状态中。
```
cd terraform
copy terraform.tfvars.example terraform.tfvars
# 编辑 terraform.tfvars — 添加 linode_token(可选:并添加区域)
terraform init
terraform plan
terraform apply
cd ..
python scripts/sync_ips.py # reads terraform output + Tailscale API, writes state.json
```
要销毁所有基础设施:
```
cd terraform && terraform destroy
```
## 部署顺序
首先部署日志堆栈——其 Tailscale IP 是 Vector 在每个蜜网中所需的。
**1. 部署日志堆栈**
```
python scripts/provision.py --server log-stack
```
提示 Tailscale API 密钥、Grafana 管理员密码,然后运行端到端:等待 SSH、生成 Tailscale 授权密钥、SCP 文件、运行 `setup.sh`、轮询 Tailscale 直到注册,并将 Tailscale IP 写入 `state.json`。
如果中断后重新启动,则跳过已在 `state.json` 中的服务器(有提示)。使用 `--force` 无提示重新部署。
**2. 部署蜜网**
```
python scripts/provision.py --server mysql-ssh
```
相同的流程。`provision.py` 从 `state.json` 中读取 `LOKI_HOST`(在步骤 1 中设置)并自动将其传递给 `setup.sh`。设置完成后,端口 22 关闭,SSH 移动到端口 65022(仅 Tailscale)。
**3. 验证日志是否流动**
```
python scripts/test_loki.py # Push a test log line to Loki
```
在 `http://:3000` 打开 Grafana:
- `{job="cowrie"}` — 原始 Cowrie 事件
- `{job="mysql"}` — 原始 MySQL 事件
- `{job="http"}` — 原始 HTTP 事件
- `{job="smb"}` — 原始 SMB 事件
- `{job="ftp"}` — 原始 FTP 事件
- `{job="auth"}` — 主机 auth.log
- `{job="events"}` — 标准化跨蜜网流
## 修改后重新部署
```
python scripts/redeploy.py --server mysql-ssh # Tailscale required
python scripts/redeploy.py --server log-stack
```
通过 Tailscale(端口 65022)将更新后的文件复制到服务器,并运行 `docker compose up -d`。不接触系统配置;`.env` 被保留。
## 拉取日志
```
python scripts/get_logs.py --server mysql-ssh # saves logs/ to logs/mysql-ssh/
```
按照惯例,每个蜜网将 JSON 日志写入 `/opt///volumes/logs/.json`。`get_logs.py` 自动读取这些路径。
## 有用的服务器命令
```
# 在蜜罐服务器上(例如,mysql-ssh)
docker compose -f /opt/mysql-ssh/docker-compose.yml ps
docker compose -f /opt/mysql-ssh/docker-compose.yml logs -f cowrie
docker compose -f /opt/mysql-ssh/docker-compose.yml logs -f mysql-honeypot
docker compose -f /opt/mysql-ssh/docker-compose.yml logs -f vector
# 在日志堆栈上
docker compose -f /opt/log-stack/docker-compose.yml ps
docker compose -f /opt/log-stack/docker-compose.yml logs -f loki
docker compose -f /opt/log-stack/docker-compose.yml logs -f grafana
# Tailscale(任何主机)
tailscale status
tailscale ip -4
```
### 可选——恶意软件目录丰富化
目录运行三个丰富化工作进程,与 API 一起。第一个(`static-analyzer`:YARA、IOC 提取、ssdeep、PE/ELF 解析)无需设置。其他两个只有在你提供密钥时才会运行:
**MalwareBazaar API 密钥** *(可选,启用 hash 查找 + abuse.ch 的 AV 判定)* — 在 [bazaar.abuse.ch](https://bazaar.abuse.ch/)注册。免费。没有它,`intel-fetcher` 将完全跳过 MalwareBazaar。
**VirusTotal API 密钥** *(可选,启用 AV 判定丰富化)* — [virustotal.com/gui/my-apikey](https://www.virustotal.com/gui/my-apikey)。免费层(4 req/min)足够了。仅查找;目录从不上传样本到 VT。
**Triage API 密钥** *(可选,启用动态沙盒分析)* — [tria.ge/account/api](https://tria.ge/account/api)。免费公共层可用。提交是 **公开的**,因此默认情况下仅上传 ELF/PE 样本(已通过 MalwareBazaar 公开),
密钥放在目录服务器的 `malware-catalog/deploy/.env` 中。使用 `malware-catalog/` 中的 `python set-keys.py` 设置或旋转它们。没有任何情报密钥,只有 `static-analyzer` 运行;`sandbox-submitter` 也需要 `COMPOSE_PROFILES=triage`。
## honey.py — 交互式启动器
`python honey.py` 打开一个编号菜单,显示所有命令。选择一个命令;对于可变选项(例如,短暂 vs. 持久 Tailscale 密钥、预设置 vs. 正常 SSH),在运行之前会提示。
```
Honey-Net
1 provision End-to-end provisioning: terraform + server setup
2 redeploy Update a live server (port 65022, Tailscale)
3 connect Open an SSH session to a server
4 sync Sync IPs from Terraform + Tailscale to state.json
5 logs Pull logs from a honeypot server
6 gen-key Generate a Tailscale auth key
7 check-keys Check SSH keys in honey-net.json; generate missing
8 check-logs Check log stream freshness in Loki
9 check-disk Check disk usage on all servers (25 GB Nanode limit)
10 test-loki Push a test log to Loki to verify the stack
11 test Run smoke tests for a honeypot from this machine
q quit
Select:
```
需要服务器名称的命令在省略时提示输入一个名称。所有命令也接受直接标志:
```
python honey.py provision --server mysql-ssh
python honey.py connect --server mysql-ssh
python honey.py connect --server log-stack --pre-setup
python honey.py redeploy --server mysql-ssh
python honey.py logs --server mysql-ssh
python honey.py sync
python honey.py gen-key --ephemeral
python honey.py check-keys
python honey.py check-logs
python honey.py check-disk
python honey.py check-disk --server log-stack
```
或者直接调用脚本——相同的标志,相同的行为:
```
python scripts/connect.py --server mysql-ssh
python scripts/redeploy.py --server mysql-ssh
python scripts/get_logs.py --server mysql-ssh
python scripts/sync_ips.py
```
## 添加蜜网服务器
1. 在 `honey-net.json` 中添加一个条目,包含 `name`、`type`、`ssh_key`、`ports` 和 `honeypots`。
2. 为新服务器生成一个 SSH 密钥对。
3. 如果它是新的蜜网类型,创建 `honey-pots//`,使用标准包布局。
4. 运行 `python honey.py provision --server `——通过 Terraform 创建 VM 并运行完整设置。
不需要更改 `terraform/main.tf` 或任何 root 脚本。有关蜜网包结构,请参阅 `honey-pots/CLAUDE.md`。
标签:API, DNS解析, Git, Grafana, Loki, Python, SMB, SSH, Tailscale, Telnet, 云服务, 威胁情报, 安全测试, 开发者工具, 开源项目, 攻击性安全, 攻击者行为研究, 无后门, 特权提升, 网络安全, 脚本, 自动化部署, 蜜罐, 证书利用, 请求拦截, 逆向工具, 错误配置检测, 隐私保护