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, 云服务, 威胁情报, 安全测试, 开发者工具, 开源项目, 攻击性安全, 攻击者行为研究, 无后门, 特权提升, 网络安全, 脚本, 自动化部署, 蜜罐, 证书利用, 请求拦截, 逆向工具, 错误配置检测, 隐私保护