nate-griff/honeygen
GitHub: nate-griff/honeygen
基于世界模型和 LLM 生成仿真企业诱饵文件并通过多协议端点暴露以捕获访问遥测的蜜罐系统。
Stars: 1 | Forks: 0
# Honeygen
Honeygen 是一个蜜罐系统,它从世界模型中生成逼真的诱饵企业文件,通过多种协议提供这些文件,并在统一的事件日志中记录访问遥测数据。
它专为安全研究和欺骗性工作流而设计:构建可信的文件语料库,通过诱饵端点(HTTP/FTP/NFS/SMB)将其暴露,并观察这些资源是如何被访问的。

## Honeygen 包含的内容
- 一个用于世界模型、生成任务、资产、部署、提供商设置和事件的 Go API
- 一个用于端到端操作系统的 React 管理 UI
- 一个诱饵 Web 服务,在 `/generated/*` 路径下提供生成的文件并转发访问事件
- 能够通过 HTTP、FTP、NFS 和 SMB 协议暴露生成的文件树的协议部署
- 基于 SQLite 的元数据持久化以及基于卷的生成文件
## 快速入门(Docker + `.env`)
### 1) 前置条件
- 带有 Docker Compose v2 的 Docker Desktop / Docker Engine
- 兼容 OpenAI 的提供商端点和 API 密钥(生成所必需)
### 2) 创建 `.env`
```
cp .env.example .env
```
### 3) 在 `.env` 中设置必需的值
至少需要将以下内容设置为实际值:
- `APP_ENV`(用于本地使用:`development`)
- `INTERNAL_EVENT_INGEST_TOKEN`(`api` 和 `decoy-web` 之间的共享密钥)
- `ADMIN_PASSWORD`(用于 `/api/auth/login` 和 UI 登录)
- `PROVIDER_CONFIG_ENCRYPTION_KEY`(用于加密保存在 SQLite 中的提供商 API 密钥)
为了使生成功能立即生效,还需设置:
- `LLM_BASE_URL`
- `LLM_API_KEY`
- `LLM_MODEL`
注意事项:
- 保持 `VITE_API_BASE_URL=` 为空以使用 Docker Compose 的默认行为;管理 UI 随后将通过 NGINX 使用同源 `/api/*` 代理。
- `DEPLOYMENT_PORTS` 会发布部署/监听端口范围(默认为 `9000-9020`),同时部署记录会被验证为使用 `9000-9010` 端口。
- `FTP_PASSIVE_PORTS` 默认为 `9011-9020`,用于 FTP 被动数据通道。
### 4) 构建并运行
```
docker compose up --build -d
```
### 5) 打开服务
- 管理 UI:[http://localhost:4173](http://localhost:4173)
- API 健康探测:[http://localhost:8080/healthz](http://localhost:8080/healthz)
- 诱饵 Web:[http://localhost:8081](http://localhost:8081)
### 6) 登录 UI
使用您在 `.env` 中设置的 `ADMIN_PASSWORD`。
## 项目概述
`docker-compose.yml` 中的运行时服务:
- `api`(`backend/cmd/api`):主 API,SQLite 访问,生成编排,部署管理器
- `admin-web`(由 NGINX 提供服务的 `frontend` 构建):操作控制台 + `/api/*` 反向代理
- `decoy-web`(`backend/cmd/decoy-web`):提供 `/generated/*` 并转发非健康的 HTTP 遥测数据
存储模型:
- SQLite 元数据:`/app/storage/sqlite/honeygen.db`(Compose 卷:`sqlite-data`)
- 生成文件:`/app/storage/generated`(Compose 卷:`generated-assets`)
## 仓库布局
```
honeygen/
backend/
cmd/
api/ # API service entrypoint
decoy-web/ # Decoy web service entrypoint
internal/
api/ # HTTP handlers + routing + auth/session
app/ # App wiring, startup, dependency graph
generation/ # Planner + generation service + job lifecycle
deployments/ # HTTP/FTP/NFS/SMB deployment manager
worldmodels/ # World model validation/persistence/seed
assets/ # Asset metadata repository
events/ # Event ingestion and query services
rendering/ # HTML/Markdown/Text/CSV/PDF/DOCX/XLSX renderers
storage/ # Filesystem storage abstraction
db/ # SQLite migrations and status queries
provider/ # OpenAI-compatible provider integration
ipintel/ # Optional GeoIP/RDAP enrichment pipeline
Dockerfile
frontend/
src/
api/ # Browser API client modules
pages/ # Dashboard, Generation, Files, Events, Deployments, Settings
components/ # UI components
app/ # Router and shell
Dockerfile
nginx.conf # API proxy and download routing
sample-data/
world-models/ # Seed world model JSON
docs/ # Architecture/API/data model documentation
docker-compose.yml
.env.example
```
## 文件生成的工作原理

Honeygen 的生成在结构上是确定性的,但在内容上是可变的。
1. 从 SQLite 加载一个世界模型(`/api/world-models/:id`)。
2. 规划器构建目标资产的清单:
- 基线的公开/内部文档
- 每个部门的备忘录
- 每个员工的项目总结
- 每个员工来自模板池的各种个人/工作文件
3. 如果世界模型中存在 `generation_settings`(`file_count_target`、`file_count_variance`),员工文件数量将相应变化。
4. 对于每个清单条目,Honeygen 会调用配置的兼容 OpenAI 的提供商一次。
5. 提供商文本被规范化并呈现为请求的输出格式(`html`、`markdown`、`text`、`csv`、`pdf`、`docx`、`xlsx`)。
6. 文件被写入以下路径下:
- `generated///...`
7. 资产元数据存储在 SQLite(`assets` 表)中,包括 MIME 类型、校验和以及 `previewable` 状态。
8. 任务摘要/日志持久化在 `generation_jobs` 中。
可以通过 `/api/generation/jobs*` 列出、取消和删除生成任务。
## UI 和 API(通用指南)
### 管理 UI
UI 是一个带有身份验证路由和会话 cookie 认证的 React 应用。
主要部分:
- **Dashboard(仪表盘)**:系统/提供商状态、计数、最近事件、最新任务
- **World Models(世界模型)**:列出/创建/更新世界模型
- **Generation(生成)**:运行任务并跟踪状态
- **File Browser(文件浏览器)**:检查资产树,预览安全的文本格式,上传/删除资产
- **Event Log(事件日志)**:检查捕获的遥测数据
- **Deployments(部署)**:创建/启动/停止/删除协议部署
- **Settings(设置)**:配置和测试提供商设置
### API
基础 URL:`http://localhost:8080`
关键行为:
- 大多数 `/api/*` 端点需要经过身份验证的管理员会话 cookie。
- 登录端点:带有 `{ "password": "..." }` 的 `POST /api/auth/login`。
- 内部事件摄取端点:由 `X-Honeygen-Internal-Event-Token` 保护的 `POST /internal/events`。
主要端点组:
- 认证/会话:`/api/auth/login`、`/api/auth/logout`、`/api/auth/session`
- 健康/状态:`/healthz`、`/api/health`、`/api/status`
- 提供商/设置:`/api/provider/test`、`/api/settings/provider`
- 世界模型:`/api/world-models*`、`/api/world-models/generate`
- 生成/任务:`/api/generation/run`、`/api/generation/jobs*`
- 资产:`/api/assets*`、`/api/assets/tree`、`/api/assets/upload`
- 事件:`/api/events*`
- 部署:`/api/deployments*`、`/api/deployments/:id/start`、`/api/deployments/:id/stop`
## 依赖项
### 运行时 / 基础设施
- Docker + Docker Compose v2
- SQLite(`modernc.org/sqlite`)用于元数据持久化
- API 运行时镜像中的 `wkhtmltopdf` 用于 PDF 渲染
- API 运行时镜像中的 Samba `smbd` 用于 SMB 部署
### 后端
- Go 1.24+
- 关键模块:`github.com/google/uuid`、`goftp.io/server/v2`、`github.com/willscott/go-nfs`、`github.com/xuri/excelize/v2`、`modernc.org/sqlite`
### 前端
- Node.js 20+(Dockerfile 使用 `node:20-bookworm-slim`)
- React 18、React Router、TypeScript、Vite、`marked`、`dompurify`
### 可选的操作员/客户端工具(用于协议测试)
- SMB:`smbclient`(WSL/Linux;为了在 Windows 上原生支持,需要端口 445)
- FTP:`curl`
- NFS:Linux/WSL `mount -t nfs` 支持
## 部署说明(HTTP、FTP、NFS、SMB)
Honeygen 部署会暴露已完成生成任务中的文件。
### 常见的部署工作流
1. 生成文件(任务状态必须为 `completed`)。
2. 在 `9000-9009` 上创建一个部署(`protocol`、`port`、`root_path`)。
3. 启动该部署。
4. 使用适当的客户端连接。
5. 在事件日志中观察遥测数据。
您可以从 **Deployments** 页面或通过 API 执行此操作。
### API 示例:首先进行身份验证
```
BASE="http://localhost:8080"
PASS=""
# 创建一个 authenticated session cookie。
curl -s -c cookies.txt -H "Content-Type: application/json" \
-d "{\"password\":\"$PASS\"}" \
"$BASE/api/auth/login"
```
### API 示例:创建并启动部署
```
JOB_ID=""
WORLD_ID="northbridge-financial"
# 在端口 9002 上创建一个 FTP deployment。
curl -s -b cookies.txt -H "Content-Type: application/json" \
-d "{\"generation_job_id\":\"$JOB_ID\",\"world_model_id\":\"$WORLD_ID\",\"protocol\":\"ftp\",\"port\":9002,\"root_path\":\"/\"}" \
"$BASE/api/deployments"
# 启动它(用返回的 deployment id 替换)。
DEPLOYMENT_ID=""
curl -s -b cookies.txt -X POST "$BASE/api/deployments/$DEPLOYMENT_ID/start"
```
### HTTP 部署
- 协议:`http`
- 典型的连接目标:`http://localhost:/`
示例:
```
curl http://localhost:9000/
```
### FTP 部署
- 协议:`ftp`
- 身份验证:匿名只读(`ftpAnonymousAuth`)
- 在 Docker/Windows 环境中预期使用被动模式
- `FTP_PASSIVE_PORTS` 默认为 `9011-9020`
示例:
```
curl --user anonymous:anonymous ftp://localhost:9002/
```
### NFS 部署
- 协议:`nfs`
- 部署响应包含 `mount_path`(默认为 `/mount`)
- 在 Windows 上,使用 WSL/Linux 工具进行自定义端口的 NFS 挂载
示例(WSL):
```
sudo mount -t nfs -o nfsvers=3,noacl,tcp,port=9003,mountport=9003,nolock,noresvport 127.0.0.1:/mount /mnt/honeygen-nfs
```
### SMB 部署
- 协议:`smb`
- 共享名称:`honeygen`(只读访客)
- 由作为托管子进程启动的 Samba `smbd` 提供支持
- 本地主机上的原生 Windows SMB 客户端受到限制,因为它期望端口为 `445`,而 Honeygen 使用自定义的部署端口
示例(WSL/Linux):
```
smbclient //127.0.0.1/honeygen -p 9001 -N -c "ls"
```
## 跨协议的事件遥测
捕获的事件类型:
- HTTP(`decoy-web` 和 HTTP 部署):`http_request`
- FTP:`ftp_list`、`ftp_download`
- NFS:`nfs_mount`、`nfs_list`、`nfs_read`
- SMB:`smb_connect`、`smb_disconnect`、`smb_opendir`、`smb_open`
非 HTTP 事件将路径规范化为规范的生成文件路径,并在 `metadata` 中包含协议元数据(`deployment_id`、`protocol`、`operation`)。
## 持久化和数据安全
Compose 卷:
- `sqlite-data`
- `generated-assets`
快速持久化检查:
```
docker compose restart
```
重启后,任务/资产/事件/部署应仍然存在。
## 已知限制
- 提供商模式为外部/兼容 OpenAI;生成需要有效的提供商设置。
- API/管理员端点受会话保护;请记住在进行直接 API 调用时进行身份验证。
- PDF 渲染质量取决于 `wkhtmltopdf`。
- 二进制预览被有意限制(PDF/DOCX/XLSX 需优先下载)。
- Windows 上的 FTP 主动模式和本地主机 SMB 具有平台/网络限制;对于本地测试,请优先使用被动 FTP 和 WSL/Linux SMB 工具。
## 附加文档
- `docs/architecture.md`
- `docs/api.md`
- `docs/data-model.md`
- `docs/demo.md`
标签:BOF, DLL 劫持, Docker, Docker Compose, EVTX分析, Go语言, LLM, NFS, OpenAI, Petitpotam, React, SMB, SQLite, Syscalls, TCP SYN 扫描, Unmanaged PE, Web UI, 事件日志, 企业安全, 内存规避, 多协议, 大语言模型, 威胁情报, 安全防御评估, 开发者工具, 文件服务器, 日志审计, 欺骗防御, 程序破解, 网络安全, 网络资产管理, 蜜罐, 证书利用, 诱饵文件, 请求拦截, 负责任AI, 遥测记录, 错误配置检测, 隐私保护