# honeyprompt

推出 `honeyprompt`,这是一个以LLM优先的欺骗框架,专为/由Web开发者打造。这是 [@alectrocute](https://github.com/alectrocute) 的个人热爱项目。
支持所有主要的云端和本地LLM提供商。支持SSH、HTTP、TLS、TCP、telnet等。它作为一个小的容器(以及一个单一的静态二进制文件)发布,所有控制旋钮都集中在一个 `honeyprompt.yaml` 文件中。
无需编译插件,无需运行数据库,易于扩展,可在低端硬件上部署。
## 演示实例
演示实例位于 `172.233.151.216`,未认证的Web面板在这里:<http://172.233.151.216:9090>。这是一个运行在廉价Linode VPS上的honeyprompt公开实例,使用 `openrouter/free` 作为唯一的LLM提供商/模型。
## 快速启动
为了2026年最简单的设置,我们推荐使用Docker和OpenRouter/`openrouter/free` 作为LLM提供商。所有主要的云端和本地LLM提供商都受支持。三个文件和一个命令即可完成完整的默认部署:七个由LLM支持的诱饵、持久化事件存储和操作面板。
**1. 获取默认配置、compose文件和env模板:**
```bash
# 如果你没有Docker:
# curl -fsSL get.docker.com -o get-docker.sh && sh get-docker.sh
mkdir honeypot && cd honeypot
wget https://raw.githubusercontent.com/alectrocute/honeyprompt/main/honeyprompt.yaml
wget https://raw.githubusercontent.com/alectrocute/honeyprompt/main/compose.yaml
wget -O .env https://raw.githubusercontent.com/alectrocute/honeyprompt/main/.env.example
```
(或者克隆仓库并 `cd` 进去——同样的三个文件。)
**2. 填写 `.env`。** 两个必需的值:
```dotenv
OPENROUTER_API_KEY=sk-or-... # 使用带有支出限制的专用密钥
HONEYPROMPT_PANEL_PASSWORD=changeme # 面板的基本认证密码
```
**3. 启动它:**
```bash
docker compose up -d
```
**4. 戳一下它:**
```bash
ssh -p 2222 root@localhost # 密码:root — 然后输入任何内容
curl http://localhost:2375/v1.54/containers/json # "暴露的" Docker API
```
**5. 在只读面板上观看它发生**,访问 <http://127.0.0.1:9090>(以 `admin` 用户和你的面板密码登录)。每个连接、凭据和命令都实时流式传输。如果你部署到远程主机,你需要暴露 `:9090` 端口在 [`compose.yaml`](https://github.com/alectrocute/honeyprompt/blob/main/compose.yaml) 中。不建议在生产部署中使用。
> 对于生产部署,请固定一个带编号的版本而不是 `latest`——在 `.env` 中设置 `HONEYPROMPT_IMAGE`。
你刚刚下载的 [`honeyprompt.yaml`](https://github.com/alectrocute/honeyprompt/blob/main/honeyprompt.yaml) 是一个完整注释的展示。它内置了以下配置文件:
- **通用企业Web服务器** — 端口80,最大的覆盖范围;`/` 立即提供标准的nginx欢迎页面,更深层次的路径则落入LLM,生成完整的HTML/CSS内网页面、登录表单和管理面板,旨在让攻击者持续点击。
- **MCP / 代理网关** — 可流式HTTP发现、OAuth元数据、JSON-RPC工具调用和诱人的生产工具。
- **Docker Engine API 29.5** — 真实云蠕虫使用的未认证端口2375界面。
- **Kubernetes API v1.36** — 命名空间、工作负载、Secret、ConfigMap和RBAC发现。
- **Ubuntu 26.04 AI构建基础设施** — SSH、GPU工作负载、Docker、kubeconfigs、CI状态和提供商凭据。
- **Redis 8.8** — 用于凭据窃取、持久化和横向移动的常见RESP探测。
- **工业边缘 / OT** — 一个故意遗留的Telnet管理界面,因为现代防御仍然需要捕获针对旧基础设施的攻击。
### 无LLM运行
> [!重要]
> 即使你使用LLM,也要确定最常用的路径并为它们添加静态规则。这将节省大量LLM代币,并加速对不值得LLM调用的请求的响应。随机示例:`whoami`、健康检查、favicon、版本探测等。
这个最小的 `honeyprompt.yaml` 使用两个静态规则模拟了一个SSH机器,没有LLM:
```yaml
panel:
enabled: true
address: "0.0.0.0:8080"
events:
buffer: 2000
file: /data/events.jsonl # 持久化的攻击者活动
services:
- protocol: ssh
address: "0.0.0.0:2222"
description: "Ubuntu 26.04 LTS build runner"
serverName: "gpu-runner-07"
passwordRegex: "^(root|admin|123456)$" # 哪些密码“有效”
commands:
- regex: "^whoami$"
handler: "root"
- regex: "^(.+)$"
handler: "bash: command not found"
```
```bash
docker run --rm \
-p 2222:2222 -p 8080:8080 \
-v "$(pwd)/honeyprompt.yaml:/etc/honeyprompt/honeyprompt.yaml:ro" \
-v honeyprompt-data:/data \
alectrocute/honeyprompt:latest
```
## 部署
对于持久化部署,请使用附带的 [`compose.yaml`](https://github.com/alectrocute/honeyprompt/blob/main/compose.yaml)。[部署指南](https://github.com/alectrocute/honeyprompt/blob/main/DEPLOYMENT.md) 涵盖了Docker Hub发布、所需的GitHub密钥、端口和防火墙设置、通过SSH的面板访问、升级、回滚、事件存储和隔离。
## 为什么要使用以LLM优先的欺骗(简要说明)
蜜罐只需做好一件事:保持足够说服力,让攻击者持续输入。他们运行的每个命令都是情报——他们使用的工具、重复使用的凭据、他们假设你尚未修补的CVE。静态蜜罐在有人运行作者未预期的命令时就会暴露身份。honeyprompt将这个时刻交给LLM,因此shell会像真实系统一样回答 `dmesg | tail` 或 `cat /etc/shadow`,从而让会话继续下去。
请观看Adel Karimi精彩的DEF CON 32演讲,关于Galah(第一个?)LLM蜜罐,它启发了我这个项目:<https://www.youtube.com/watch?v=XGsm4Qcc_Ag>
## 记录内容:两个独立的流
这部分值得提前理解,因为两者被故意分开:
- 欺骗事件:每次攻击者交互:连接、认证尝试、每个命令或请求、honeyprompt发送回的响应、哪个提供商和模型回答了以及耗时。这是你的威胁情报。它保存在一个有界的內存缓冲区中,用于实时面板,你也可以将其全部持久化到磁盘。
- 操作日志:启动、绑定的端口、提供商故障、关闭、内部错误。这是运行时不正常时你要读的内容。它与攻击者活动无关。
你可以分开配置它们:
```yaml
# 蜜罐:攻击者活动。
events:
buffer: 2000 # 保留在内存中以供面板使用的最近事件
file: /data/events.jsonl # 以JSON Lines格式持久化每个事件
# 运行时的自身诊断。
logging:
level: info # debug | info | warn | error
format: text # 在控制台上的显示方式:text(人类可读)或 json
file: /data/honeyprompt.log # 可选;在磁盘上始终是JSON
```
`events.jsonl` 是每行一个自包含的JSON对象——准备好 `tail -f`、发送到SIEM或使用 `jq` 重放。上面的Docker命令将命名卷 `honeyprompt-data` 挂载到 `/data`,因此事件在容器替换后仍然存在。这两个文件是追加写入的,并在干净关闭时刷新。
`format` 仅影响操作日志在控制台上的渲染;操作日志文件(如果启用)始终是结构化JSON,以便于解析。
## Web面板

一个可选的只读仪表板,实时流式传输欺骗事件,按协议分类,并一键导出为JSON:
```yaml
panel:
enabled: true
address: "0.0.0.0:8080"
auth: # 可选的基本认证
username: admin
password: "${HONEYPROMPT_PANEL_PASSWORD}"
```
该仪表板是纯HTML、CSS和JavaScript([`src/panel/assets`](https://github.com/alectrocute/honeyprompt/blob/main/src/panel/assets)),嵌入到二进制文件中。如果不需要认证,请将 `auth` 保持未定义。
## 提供商
每个提供商都有自己的模块,具有自己的超时、重试、速率限制和标头。密钥来自环境变量。开箱即用的提供商:
| 提供商 | `type` | 备注 |
| ------------------------- | ------------------- | ----------------------------------------------- |
| Ollama | `ollama` | 本地模型;默认使用 `localhost:11434` |
| llama.cpp | `llamacpp` | 本地 `server` OpenAI端点 |
| OpenAI | `openai` | `OPENAI_API_KEY` |
| Azure OpenAI | `azure` | 需要 `azure.deployment` + `azure.apiVersion` |
| OpenRouter | `openrouter` | `OPENROUTER_API_KEY` |
| Anthropic | `anthropic` | `ANTHROPIC_API_KEY` |
| Google Gemini | `google` | `GEMINI_API_KEY` |
| 任何OpenAI形状的 | `openai-compatible` | 将 `baseUrl` 指向你的网关 |
### 负载均衡和故障转移
配置提供商,选择一个 `pool.strategy`(`round-robin`、`weighted`、`random` 或 `failover`),honeyprompt会在它们之间分配流量。如果选择的提供商超时或返回可重试的错误,honeyprompt会透明地转移到下一个——一个宕机的后端绝不会让蜜罐离线。不可重试的错误(比如错误的API密钥)会停止级联,以便你发现,而不是静默地消耗配额。
服务使用全局池,除非它们指定了自己的提供商子集:
```yaml
llm:
enabled: true
providers: [local-ollama] # 一个名称:强制此服务使用该提供商
```
列出多个名称可以保持负载均衡和故障转移,但仅限于该子集内:
```yaml
llm:
enabled: true
providers: [openai-primary, openrouter-backup]
```
### 命名池
当多个服务应该共享同一个提供商组——或者子集需要自己的策略而不是全局策略时——定义一个**命名池**。池具有名称、策略和有序的提供商列表,服务可以在任何需要指定提供商的地方通过名称引用它:
```yaml
pools:
- name: cheap-first
strategy: failover # 先尝试本地模型,如果失败则回退到付费API
order: [local-ollama, openrouter]
- name: spread
strategy: round-robin
order: [openrouter, openai]
services:
- protocol: ssh
# ...
llm:
enabled: true
providers: [cheap-first] # 一个池名称,代替提供商
- protocol: http
# ...
llm:
enabled: true
providers: [spread]
```
池名称必须是 `providers` 中的唯一条目——不允许将池与单独提供商混合在同一个列表中,因为那会不清楚哪个策略获胜。池名称与提供商名称位于相同的命名空间,且不能与它们冲突。
## 使用钩子扩展响应
当“匹配正则表达式”或“询问模型”不足时,钩子允许你将自定义TypeScript插入到请求和响应路径中。钩子可以在请求到达模型之前重写提示,或者在响应到达攻击者之前重写回复。
```ts
import { registerHook } from "./src/engine/hooks.ts";
registerHook({
name: "fake-latency-notice",
transformResponse(response, ctx) {
if (ctx.protocol === "ssh" && /rm -rf/.test(ctx.input)) {
return "rm: cannot remove '/': Operation not permitted\n";
}
return response;
},
});
```
通过名称从任何服务的 `hooks:` 列表中引用它。示例配置中内置了一个 `redact-secrets` 钩子并已启用,这样模型永远不会将真实的凭据泄露出去。
## 指标
Prometheus指标在面板的 `/metrics` 路径提供(未经认证,因此抓取工具可以正常工作):
```
honeyprompt_events_total{protocol="ssh"} 412
honeyprompt_llm_requests_total{provider="openai",protocol="ssh"} 118
honeyprompt_auth_attempts_total{protocol="ssh"} 87
honeyprompt_engine_errors_total{protocol="http"} 0
```
## 从源码构建
如果你想贡献或需要一个原生二进制文件,你需要 [Deno](https://deno.com) 2.x——这是唯一的依赖。
```bash
deno task check # 类型检查
deno task lint
deno task fmt
deno task test # 单元测试 + 集成测试
deno task start -- --config honeyprompt.yaml # 本地运行
deno task dev -- --config honeyprompt.yaml # 使用文件监视运行
deno task compile # -> ./dist/honeyprompt (自包含二进制文件)
```
`deno compile` 将运行时、面板资源等全部打包到一个可执行文件中,无需依赖。Linux、macOS和Windows的预构建二进制文件随每个标记的[发布](../../releases)一起提供。
CI 在每次推送时运行格式化、lint、类型检查、测试、配置验证、跨平台 `compile` 和Docker构建。标记 `vX.Y.Z` 会发布发布二进制文件,并将带有出处和SBOM的多架构镜像发布到 [`alectrocute/honeyprompt`](https://hub.docker.com/r/alectrocute/honeyprompt)。
## CLI
```
honeyprompt run [--config <path>] 启动所有已配置的服务(默认)
honeyprompt validate [--config <path>] 解析并验证配置,然后退出——非常适合CI
honeyprompt version
honeyprompt help
```
`--config` 默认为 `./honeyprompt.yaml`,如果设置则使用 `$HONEYPROMPT_CONFIG`(容器中将其设置为 `/etc/honeyprompt/honeyprompt.yaml`)。
## 给用户和贡献者的警告
这是一个用于在你**拥有或已授权测试**的基础设施上引诱和研究攻击者的工具。暴露诱饵服务仍然意味着暴露服务;请在隔离的主机上运行,保持修补,并且不要将其指向任何你无法承受被探测的事物。欺骗不能替代实际保护真实系统。
如果你想为这个项目做出贡献,并使用AI智能体或大量依赖生成式代码,完全没问题——但你将被逐一询问你提供的每一行代码,如果你不能立即展示出无需AI的理解,你的**整个**贡献将被拒绝并废弃。
## 许可证
[MIT](https://github.com/alectrocute/honeyprompt/blob/main/LICENSE)