| 文档属性 | 值 |
|---|---|
| 文档版本 | v2.0 |
| 适用产品 | AgentCapture ≥ v0.3.0 |
| 读者对象 | 安全运维工程师、网络工程师、SOC 值守人员 |
| 文档状态 | 正式发布 |
修订记录
| 版本 | 日期 | 说明 |
|---|---|---|
| v1.0 | 2026-09 | 初版:五种接入方式与基础命令 |
| v2.0 | 2026-09 | 重构为技术规范:补全参数参考、时序图、端点规范、故障排查与回退程序 |
本文档规定将现有互联网业务系统接入 AgentCapture 欺骗层(deception layer)的技术方式、配置规范、验收方法与运维程序。适用于需要在不改造业务代码的前提下为 Web 站点、TCP 暴露面与多站点环境增加威胁检测、蜜饵欺骗与 AI Agent 反制能力的场景。
本文档不覆盖:平台自身代码二次开发、C2 载荷定制、蜜饵内容运营(见 docs/architecture.md 与管理后台对应页面)。
约定:下文 AC 指 AgentCapture 实例(默认监听 4877/TCP);业务 Nginx 指现有公网入口反向代理;真实业务 指被保护的 Web upstream。
| 术语 | 定义 |
|---|---|
| 欺骗层(deception layer) | 内联于入口流量与真实业务之间的检测/诱捕/反制中间层 |
| 会话蜜标令牌(session canary token) | 平台按会话签发的 HMAC-SHA256 令牌,兼具检测蜜标与 API 会话令牌双角色 |
| 五档决策 | 风险引擎输出的处置阶梯:allow / observe / challenge / isolate / block |
| 蜜饵路径 | observe-only 前缀(/_trap/、/d/、/_bait/、/portal/),永不阻断 |
| 收编(recruit) | 自动化客户端经 Portal API 完成注册进入 C2 受管名册的过程 |
| 干跑模式 | ALERTS_ENABLED=false 时告警仅记录日志不外发 |
README.md— 产品概览与快速开始docs/architecture.md— 平台架构与反制体系设计- 管理后台「互联网系统接入」页内嵌接入路线说明
| 项目 | 要求 |
|---|---|
| 操作系统 | Linux x86_64 / arm64(Docker 20.10+) |
| 容器运行时 | Docker Engine 20.10+ 与 Docker Compose v2 |
| 内存 | ≥ 2 GB(启用 SSH 高保真蜜罐建议 ≥ 4 GB) |
| 磁盘 | ≥ 10 GB(含 SQLite 数据卷;按事件量预估,参考 §10 附录保留策略) |
| 业务侧 | Nginx ≥ 1.18(方式一/二/三需要 sub_filter、proxy_pass 支持) |
| 端口 | 协议 | 方向 | 用途 | 是否必须 |
|---|---|---|---|---|
| 4877/TCP | HTTP | 公网 → AC | 平台主服务(检测 / 蜜饵 / 回调 / 管理后台) | 是 |
| 2222/TCP | SSH | 公网 → AC | SSH 高保真蜜罐 | 协议蜜罐时 |
| 2121/TCP | FTP | 公网 → AC | FTP 蜜罐 | 同上 |
| 33060/TCP | MySQL | 公网 → AC | MySQL 蜜罐 | 同上 |
| 63790/TCP | Redis | 公网 → AC | Redis 蜜罐 | 同上 |
| 19200/TCP | HTTP | 公网 → AC | ElasticSearch 蜜罐 | 同上 |
| 8080+/TCP | HTTP | 公网 → AC | Web 应用蜜罐部署端口(每模板独立) | 方式二时 |
| 443/TCP | HTTPS | 公网 → 业务 Nginx | 现有入口(保持不变) | 是 |
| 凭据 | 来源 | 用途 | 保管要求 |
|---|---|---|---|
| 管理员账号 | BOOTSTRAP_ADMIN_* 初始化 |
后台管理 | 生产必须修改默认值 |
SECRET_KEY |
部署时生成 | 会话签名 / 蜜标令牌 HMAC | 32+ 随机字符,泄露即全量更换 |
NODE_AUTH_TOKEN |
自行生成 | 节点 API 认证 | 仅存于主平台与节点侧 |
| API Key | 后台「API 令牌」页生成 | /api/v1 情报查询 |
按 attack.read 等权限最小化签发 |
flowchart LR
U["用户 / 攻击者 / AI Agent"] --> NG["业务 Nginx :443(现有,证书不变)"]
NG -- "真实路径 /api /app" --> APP["真实业务集群(零改动)"]
NG -- "sub_filter 注入 beacon.js + 蜜饵链接" --> APP
NG -- "欺骗路径 /portal /recon /collect /_trap /d /_bait /internal" --> AC["AgentCapture :4877"]
subgraph ACBox ["AgentCapture(Docker 单容器)"]
AC --> MW["采集注入中间件"]
MW --> RE["风险引擎(五档决策)"]
RE --> ISO["持久隔离(TTL 短路)"]
end
AC --> DB[("SQLite WAL / PostgreSQL")]
AC --> SOC["态势大屏 · 告警通道 · 开放 API"]
AC <--> NODE["分布式节点(X-Node-Token 心跳)"]
P["协议蜜罐端口<br/>2222 / 2121 / 33060 / 63790 / 19200"] --> AC
U -. "端口扫描 / 横向移动直连" .-> P
- 业务路径:客户端 → 业务 Nginx → 真实业务。全程不经过 AC,任何 AC 侧故障均不影响业务路径(见 §9.3 回退)。
- 欺骗路径:客户端 → 业务 Nginx(按前缀分流)→ AC 中间件。中间件完成会话签发(Cookie
ach_sid)、蜜标令牌下发、风险评分、决策执行(X-Agent-Capture-Decision响应头)与事件落库。 - observe-only 语义:
/_trap/、/d/、/_bait/、/portal/前缀永不执行 challenge/isolate/block——蜜饵必须在采集完成后才允许处置,否则凭证与回传链路会被提前掐断。
sequenceDiagram
participant A as AI Agent
participant N as 业务 Nginx
participant P as AC Portal API
participant C as C2 名册
A->>N: GET /(正常浏览)
N->>A: 页面(页脚含 Developer API 文档 + 会话蜜标令牌)
A->>P: GET /portal/api/content?ticket=<蜜标令牌>
P-->>A: 200 内容 + client_api 接入说明
A->>P: GET|POST /portal/api/client-register
P->>C: 创建受管主机(recruit_src=ticket 归因)
P-->>A: agent_id + 心跳参数
loop 每 30s
A->>P: POST /portal/api/client-heartbeat
P-->>A: next_task(任务下发,合并往返)
A->>P: 任务结果(随下一次心跳回传)
end
git clone https://github.com/Tcotl/AgentCapture.git
cd AgentCapture
# 生产部署(自动识别 amd64/arm64;SECRET_KEY 缺失时自动生成并写入 .env.docker)
./deploy.sh --port 4877 --admin-password 'YourStrongPass!'
# 其他常用参数
# --reset-data -y 清空持久卷重建(危险:删除全部数据)
# --dry-run 仅打印动作不执行源码热挂载开发:
docker compose --env-file .env.docker -f docker-compose.yml -f docker-compose.dev.yml up完整清单见附录 A。接入场景关键字段:
| 变量 | 默认值 | 接入场景取值 | 说明 |
|---|---|---|---|
SECRET_KEY |
change-me-... |
随机 32+ 字符 | 必改;蜜标令牌签名密钥 |
BOOTSTRAP_ADMIN_PASSWORD |
admin |
强口令 | 必改 |
TRUST_PROXY_HEADERS |
false |
true(方式一/二/三) |
信任前置 Nginx 的 X-Forwarded-For;不开启则来源 IP 全部记为 Nginx 地址,速率统计失效 |
SITE_ID |
local-demo |
如 portal-a |
多站点事件归属标识 |
INJECTOR_ENABLED |
true |
true |
采集注入总开关 |
AGENT_INJECTION_ENABLED |
true |
true |
提示词注入开关 |
AGENT_INJECTION_AGGRESSIVENESS |
medium |
low/medium/high |
注入激进度 |
RECON_JSONP_ENABLED |
true |
true |
JSONP 画像开关 |
CHALLENGE_ENABLED |
true |
true |
challenge 决策出 JS 质询页 |
ISOLATION_TTL_MINUTES |
60 |
按运营策略 | isolate / 蜜标回显的隔离持续时间 |
NODE_AUTH_TOKEN |
空 | 随机串 | 节点 API 认证;空 = 不校验(不推荐) |
ALERTS_ENABLED |
false |
确认通道后 true |
默认干跑 |
安全警示:
TRUST_PROXY_HEADERS=true仅在 AC 端口不可被客户端直连时开启(仅前置 Nginx 可达)。若客户端可绕过 Nginx 直连 AC 并伪造X-Forwarded-For,将导致速率统计被轮换 IP 绕过、甚至伪造白名单 IP 强制 allow。
修改后重启生效:
docker compose --env-file .env.docker -f docker-compose.yml restart honeypotcurl -s http://127.0.0.1:4877/healthz
# 预期:{"status":"ok"}
curl -sI http://127.0.0.1:4877/demo | grep -i x-agent-capture
# 预期:X-Agent-Capture-Decision: allow|observe(首次访问)
# X-Agent-Capture-Score: <0-100>后台登录 /admin/login,确认「攻击流量分析」出现上述探测请求且来源 IP 为本机。
| # | 方式 | 侵入度 | 业务变更 | 典型场景 | 章节 |
|---|---|---|---|---|---|
| 1 | 路径级反代挂载 | 低 | 业务 Nginx 追加 location | 存量公网站点无损叠加 | §5.1 |
| 2 | 全站前置(蜜罐/克隆站) | 无 | 独立域名 | 影子站点、高仿克隆 | §5.2 |
| 3 | 前端注入投放 | 低 | sub_filter 或模板加一行 | 无法调整路由的存量站 | §5.3 |
| 4 | 协议蜜罐端口旁挂 | 无 | 仅端口放行 | 非 Web 暴露面 | §5.4 |
| 5 | 分布式节点接入 | 中 | 部署节点心跳程序 | 多站点/多地域集中运营 | §5.5 |
方式 1 + 3 + 4 可组合部署(即 §3.1 总拓扑)。
业务 Nginx 保持全部真实路径不变,仅将欺骗路径前缀转交 AC。业务零感知;攻击者访问这些路径时由 AC 完成检测、蜜饵响应与收编。
flowchart LR
U["访问者"] --> NG["业务 Nginx :443"]
NG -- "/api /app(真实路径)" --> UP["真实业务"]
NG -- "欺骗路径前缀" --> AC["AC :4877<br/>TRUST_PROXY_HEADERS=true"]
AC --> EVT["事件 / 凭证 / 招募名册"]
- AC 已部署且
TRUST_PROXY_HEADERS=true(§4.2) - 业务 Nginx 与 AC 之间网络可达(同机
127.0.0.1或内网) - 已确认业务无与欺骗前缀冲突的路由(
/portal/recon/collect/_trap/d/_bait/internal/backup)
在现有 server 块内追加(证书、日志等保持原样):
# /etc/nginx/conf.d/mysite.conf → server { ... } 内追加
# --- AgentCapture 欺骗层挂载 -------------------------------------------
location ~ ^/(portal/|recon/|collect/|_trap/|d/|_bait/|_clone/|_agent/|internal/|docs/runbook-internal\.md|backup/) {
proxy_pass http://127.0.0.1:4877;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
}
# AC 静态资源(beacon.js / recon.js),供前端注入引用
location = /static/beacon.js { proxy_pass http://127.0.0.1:4877/static/beacon.js; }
location = /static/recon.js { proxy_pass http://127.0.0.1:4877/static/recon.js; }| 前缀 | 用途 | 决策语义 |
|---|---|---|
/portal/ |
Developer API 功能性伪装(收编注册 / 心跳) | observe-only |
/recon/ |
JSONP 画像与指纹回传 | observe |
/collect/ |
beacon / 扫描数据回传 | 自行落库 |
/_trap/ /d/ /_bait/ |
备份蜜饵、文件分发、凭证登录页 | observe-only |
/internal/ /docs/runbook-internal.md /backup/ |
高信号路径(假 OpenAPI / 运维手册 / 备份目录) | 高危评分 |
/_agent/ /_clone/ |
Agent 回显、克隆站回传 | observe |
nginx -t && nginx -s reload
# 1) 决策头:应返回 X-Agent-Capture-Decision / X-Agent-Capture-Score
curl -sI https://your.site/portal/api/content | grep -i x-agent-capture
# 预期:X-Agent-Capture-Decision: observe
# X-Agent-Capture-Score: 60
# 2) 真实 IP 透传:后台「攻击流量分析」中该请求的来源 IP 应为客户端真实 IP
# 3) 业务回归:真实路径响应与接入前一致
curl -sI https://your.site/api/health | head -1
# 预期:HTTP/2 200(业务自身状态码)删除上述 location 段并 nginx -s reload,即刻脱离欺骗层;业务路径全程未受影响。已产生的事件数据保留在 AC 数据卷中。
后台 → 互联网系统接入(/admin/internet-systems)→ 新增:填写域名、upstream(真实业务地址)、部署模式「反向代理无损接入」、状态建议从「监测模式」起步。台账用于资产登记与策略评审(当前版本不自动下发配置,实际配置以本节为准)。
将一个独立域名整体交给 AC:使用内置站点模板,或一键克隆自有/授权站点作为高仿蜜罐(登录表单重写为凭证采集、下载链接改为按访客 OS 投递载荷、页面内嵌遥测 beacon)。
flowchart LR
U["访问者"] --> DNS["DNS: honeypot.your.site → AC 主机"]
DNS --> NG["Nginx :443(TLS 终结)"]
NG --> AC1["AC 主服务 :4877(内置站点)"]
NG --> AC2["AC 克隆站 :8080+(deployed_server)"]
AC2 --> CB["/_clone/credential 凭证采集<br/>/_clone/beacon 遥测"]
- 后台 → 站点模板 → 输入目标 URL(限自有或书面授权站点)→ 一键克隆 → 预览确认 → 部署到节点(指定部署端口,默认
8080,每模板独立递增)。 - 为新域名配置 TLS 前置(完整 server 块):
server {
listen 443 ssl http2;
server_name honeypot.your.site;
ssl_certificate /etc/nginx/ssl/honeypot.fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/honeypot.key;
# 克隆站部署端口
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# 回传路径统一回主服务
location ~ ^/(collect/|_clone/|recon/|portal/) {
proxy_pass http://127.0.0.1:4877;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}- DNS:
honeypot.your.site A → AC 主机公网 IP。
- 验证:浏览器访问新域名,克隆站外观与源站一致;在登录表单提交测试账号 → 后台「凭证蜜饵登陆记录」出现记录。
- 回退:下线 DNS 记录或在业务 Nginx 删除该 server 块。
真实页面仍由业务服务,通过 Nginx sub_filter(或页面模板直接加一行 script)注入 AC 采集脚本与隐藏蜜饵链接,遥测经 /collect 回传。适合不能调整路由的存量站点。
flowchart LR
U["访问者浏览器"] --> NG["业务 Nginx"]
NG --> APP["真实业务(HTML 响应)"]
NG -. "sub_filter 改写响应体" .-> H["追加 beacon.js + 蜜饵链接"]
H --> U
U -- "遥测 / 蜜饵点击 → /collect /portal" --> AC["AC :4877"]
server {
# ... 现有配置 ...
# sub_filter 与响应压缩互斥:透传时去掉 Accept-Encoding
proxy_set_header Accept-Encoding "";
sub_filter_once off;
sub_filter '</body>' '<script defer src="https://your.site/static/beacon.js" data-collect-url="/collect/beacon"></script></body>';
# 回传与静态资源路径(同 §5.1.3)
location ~ ^/(collect/|portal/|recon/) {
proxy_pass http://127.0.0.1:4877;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location = /static/beacon.js { proxy_pass http://127.0.0.1:4877/static/beacon.js; }
}若业务侧有 CDN 压缩导致
sub_filter不生效,改为在页面模板直接输出 script 标签。
- 验证:浏览器访问业务页 → 查看页面源码含 beacon.js 引用 → 后台「Jsonp反制成功记录」出现指纹回传(WebRTC IP / Canvas 摘要 / 平台标签)。
- 回退:删除
sub_filter与proxy_set_header Accept-Encoding ""两段后 reload。
SSH / MySQL / Redis / FTP / ElasticSearch 协议仿真服务直接监听独立端口,与 Web 业务解耦,把必然被扫的标准端口暴露面转化为捕获面。
| 服务 | 默认端口 | 捕获能力 | 备注 |
|---|---|---|---|
| SSH | 2222 | 全部认证尝试 + 逐命令会话转录 + 终端回放 + 水印凭证 | paramiko 真协议栈;主机密钥指纹跨重启稳定 |
| MySQL | 33060 | 用户名 / 完整查询语句 | 任意凭证接受,假结果集 |
| Redis | 63790 | RESP 指令 | |
| FTP | 2121 | 账号密码 | ProFTPD 仿真 banner |
| ElasticSearch | 19200 | HTTP body + Authorization |
- 后台 → 端口服务蜜罐(
/admin/services)→ 对应服务行启动(DB 与实际运行状态自动对账)。 - Docker 部署:
docker-compose.yml默认已映射全部蜜罐端口(2222 / 2121 / 33060 / 63790 / 19200 / 8081);宿主机端口冲突时在.env.docker覆盖宿主机侧(如HOST_SSH_PORT=2223):
ports:
- "2222:2222"
- "2121:2121"
- "33060:33060"
- "63790:63790"
- "19200:19200"- 映射到宿主机 < 1024 的标准端口(如 22)需提升绑定能力或做 DNAT:
# docker-compose.yml 服务级追加:cap_add: [NET_BIND_SERVICE]
# 或宿主机 iptables DNAT
iptables -t nat -A PREROUTING -p tcp --dport 22 -j REDIRECT --to-port 2222ssh -p 2222 root@<AC主机IP> # 任意密码可登录 → 进入假 shell
# 后台 → 蜜罐会话(/admin/honeypot-sessions)出现会话且逐命令可回放回退:后台停止对应服务,或移除端口映射。
多站点 / 多地域部署轻量节点,节点向主平台心跳并领取任务,实现集中运营。
flowchart LR
N1["节点 A(机房 1)"] -- "POST /api/node/heartbeat<br/>Header: X-Node-Token" --> AC["主平台 :4877"]
N2["节点 B(机房 2)"] -- "心跳 / 领取 / 回执" --> AC
AC --> T["NodeTask 队列"]
- 主平台
.env.docker设置NODE_AUTH_TOKEN=<random>并重启。 - 后台 → 节点管理(
/admin/nodes)先创建节点(名称与心跳node_name一致;未注册节点心跳返回 404)。 - 节点侧接入(HTTP 契约见 §6.3):
# 心跳(可随心跳回执任务结果)
curl -s -X POST http://ac.your.site:4877/api/node/heartbeat \
-H "Content-Type: application/json" \
-H "X-Node-Token: <NODE_AUTH_TOKEN>" \
-d '{"node_name":"dc1-edge","status":"online","version":"1.0","metrics":{"cpu":12}}'
# 预期:{"status":"ok","server_time":"...","heartbeat_id":N,"acked_tasks":[...]}
# 领取任务(POST + JSON)
curl -s -X POST http://ac.your.site:4877/api/node/tasks/pull \
-H "Content-Type: application/json" -H "X-Node-Token: <NODE_AUTH_TOKEN>" \
-d '{"node_name":"dc1-edge"}'
# 任务回执
curl -s -X POST http://ac.your.site:4877/api/node/tasks/ack \
-H "Content-Type: application/json" -H "X-Node-Token: <NODE_AUTH_TOKEN>" \
-d '{"node_name":"dc1-edge","task_id":1,"status":"completed"}'后台「节点管理」显示节点 online、任务可下发回执即接入成功。回退:节点停止心跳,超过阈值后平台自动标记离线。
| 方法 | 路径 | 关键参数 | 说明 |
|---|---|---|---|
| GET | /portal/api/content |
ticket(会话蜜标令牌) |
Developer API 内容,收编入口 |
| GET/POST | /portal/api/client-register |
ticket |
客户端注册(幂等,双动词) |
| POST | /portal/api/client-heartbeat |
Body: agent_id |
心跳 + 任务下发(合并往返) |
| POST | /collect/beacon |
JSON 遥测体 | 浏览器侧 beacon 回传 |
| POST | /collect/scan |
JSON | 扫描数据回传 |
| POST | /recon/fingerprint |
JSON 指纹体(webrtc_ips 仅接受合法 IP) |
指纹采集入口 |
| GET | /recon/jsonp |
callback、method |
JSONP 模板回调 |
| GET | /recon/callback/{id} |
— | 载荷回调(risk 80 / isolate) |
| GET | /_trap/backup/{path} |
— | 备份蜜饵下载 |
| GET | /d/{token}/{filename} |
— | 文件蜜饵分发 |
| GET/POST | /_bait/credential/{token}/login |
表单 | 凭证蜜饵登录页 |
| GET/POST | /_agent/bait /_agent/report /_agent/verify |
— | Agent 注入回显 |
| GET | /payload/{type} |
— | 载荷投递 |
认证方式:查询参数 api_key(后台「API 令牌」签发,权限如 attack.read)。
| 方法 | 路径 | 权限 | 说明 |
|---|---|---|---|
| POST | /api/v1/attack/ip |
attack.read |
攻击来源聚合 |
| POST | /api/v1/attack/detail |
attack.read |
攻击详情 |
| POST | /api/v1/credentials |
attack.read |
凭证观测记录 |
| 方法 | 路径 | Body 字段 | 说明 |
|---|---|---|---|
| POST | /api/node/heartbeat |
node_name status version metrics results[] |
心跳 + 任务结果回执 |
| POST | /api/node/tasks/pull |
node_name |
领取任务 |
| POST | /api/node/tasks/ack |
node_name task_id status |
任务确认 |
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /healthz |
存活探针,返回 {"status":"ok"} |
| GET | /console/events |
事件流(默认需管理员会话;CONSOLE_PUBLIC=true 放开用于投屏) |
每个经 AC 的响应携带:
X-Agent-Capture-Decision: allow|observe|challenge|isolate|block
X-Agent-Capture-Score: <0-100>
决策阶梯阈值:≥95 block、≥70 isolate、≥45 challenge、≥20 observe、否则 allow。
| 观测项 | 位置 |
|---|---|
| 事件流 / 攻击链 | 后台「攻击流量分析」/admin/attacks |
| Agent 指纹与注入 | 「提示词注入触发记录」/admin/agent-interactions |
| 浏览器画像 | 「Jsonp反制成功记录」/admin/recon-data |
| 凭证捕获 | 「凭证蜜饵登陆记录」/admin/credentials(高频用户名/密码统计) |
| SSH 会话 | 「蜜罐会话」/admin/honeypot-sessions(终端回放) |
| 招募名册 | C2「Agent 管理」/admin/c2/agents(含产品指纹归因) |
| 运维审计 | 「执行历史」(所有敏感操作含批量删除均落审计) |
| 数据 | 保留参数 | 默认 |
|---|---|---|
| events | EVENT_RETENTION_DAYS |
30 天 |
| 节点心跳 | HEARTBEAT_RETENTION_DAYS |
7 天 |
| 登录日志 | LOGIN_LOG_RETENTION_DAYS |
90 天 |
| SSH 会话转录 | HONEYPOT_SESSION_RETENTION_DAYS |
60 天 |
容器日志:docker compose --env-file .env.docker logs -f honeypot。
| 症状 | 可能原因 | 处置 |
|---|---|---|
| 事件来源 IP 全是 Nginx 地址 | TRUST_PROXY_HEADERS 未开启 |
.env.docker 置 true 并重启(前提满足 §4.2 警示) |
X-Agent-Capture-* 头缺失 |
location 正则未命中该路径 | 核对 §5.1.4 前缀清单;nginx -t 后 reload |
| 蜜饵路径返回业务 404 | 前缀分流未生效 / 正则优先级被其他 location 抢占 | 将 AC location 的正则收紧或上移;避免被 location / 前缀匹配吞掉 |
| beacon.js 404 | 静态资源 location 未配置 | 补充 §5.1.3 的两个 location = /static/... |
| sub_filter 不生效 | 业务/CDN 开启了 gzip | proxy_set_header Accept-Encoding ""; 或改模板直出 |
| 节点心跳 404 | 节点未在后台预建 | 节点管理先创建同名节点 |
| 节点心跳 401 | X-Node-Token 与主平台不一致 |
核对 NODE_AUTH_TOKEN |
| SSH 蜜罐无法登录 | 端口映射缺失 / 服务未启动 | §5.4.2;后台服务状态与 DB 对账 |
| 亮色/暗色样式异常 | 浏览器缓存旧 CSS | 强制刷新(admin.css 更新后常见) |
| 告警未外发 | ALERTS_ENABLED=false(干跑) |
确认通道测试通过后置 true 并重启 |
克隆、注入与反制能力仅可用于自有或获得书面授权的系统。接入前完成资产授权确认并存档。
SECRET_KEY、BOOTSTRAP_ADMIN_PASSWORD、NODE_AUTH_TOKEN、API Key 仅存于受控配置管理与后台,禁止提交仓库或外发;.env.docker文件权限600;- 密钥疑似泄露:更换
SECRET_KEY(注意:会使既有蜜标令牌与会话失效)并轮换相关凭据。
- 接入策略从「监测模式」(observe)起步,观察 1–2 个攻击周期后再灰度启用注入与反制;
- 任何接入方式的回退程序见各节「回退」小节;业务路径与欺骗路径物理分离,AC 故障不影响业务可用性;
- 批量删除、策略变更等敏感操作均记录于「执行历史」审计。
- AC 主端口仅对前置 Nginx 与运维网络开放,禁止公网直连(配合
TRUST_PROXY_HEADERS安全前提); - 管理后台
/admin建议叠加 IP 白名单或 VPN 访问; - 告警通道凭据(钉钉加签、飞书签名、SMTP 密码)在后台以掩码显示。
| 变量 | 默认值 | 说明 |
|---|---|---|
APP_ENV |
dev |
运行环境标识 |
HOST / PORT |
0.0.0.0 / 4877 |
监听地址与端口 |
SITE_ID |
local-demo |
站点归属标识 |
DATABASE_URL |
sqlite:///./agent_capture.db |
数据库(可切 PostgreSQL) |
SECRET_KEY |
change-me-before-production |
会话 / 蜜标签名密钥 |
SESSION_COOKIE_NAME |
ach_sid |
公开会话 Cookie 名 |
ADMIN_SESSION_COOKIE_NAME |
ach_admin |
管理会话 Cookie 名 |
CANARY_HEADER_NAME |
X-Agent-Canary |
蜜标回显头名 |
INJECTOR_ENABLED |
true |
采集注入总开关 |
COLLECT_PATH |
/collect/beacon |
beacon 回传路径 |
BOOTSTRAP_ADMIN_USERNAME |
admin |
初始管理员 |
BOOTSTRAP_ADMIN_PASSWORD |
admin |
初始密码(必改) |
BOOTSTRAP_ADMIN_EMAIL |
admin@example.local |
初始邮箱 |
PUBLIC_API_DEFAULT_LIMIT |
100 |
开放 API 分页上限 |
AGENT_INJECTION_ENABLED |
true |
提示词注入开关 |
AGENT_INJECTION_AGGRESSIVENESS |
medium |
注入激进度 |
RECON_JSONP_ENABLED |
true |
JSONP 画像开关 |
RECON_BEACON_PATH |
/recon/fingerprint |
指纹回传路径 |
PAYLOAD_CALLBACK_HOST |
空 | 载荷回调对外主机名 |
C2_ENABLED |
true |
C2 子系统开关 |
C2_POLL_INTERVAL |
5 |
implant 轮询间隔(秒) |
C2_REGISTER_MAX_PER_IP_HOUR |
10 |
单 IP 每小时匿名注册上限 |
NODE_AUTH_TOKEN |
空 | 节点 API 认证令牌 |
ALERTS_ENABLED |
false |
告警真实投递开关 |
TRUST_PROXY_HEADERS |
false |
信任转发头(见 §4.2 警示) |
CHALLENGE_ENABLED |
true |
JS 质询开关 |
CHALLENGE_COOKIE_NAME |
ach_chal |
质询 Cookie 名 |
ISOLATION_TTL_MINUTES |
60 |
隔离持续时间 |
CONSOLE_PUBLIC |
false |
事件控制台免登录 |
EVENT_RETENTION_DAYS |
30 |
事件保留 |
HEARTBEAT_RETENTION_DAYS |
7 |
心跳保留 |
LOGIN_LOG_RETENTION_DAYS |
90 |
登录日志保留 |
HONEYPOT_SESSION_RETENTION_DAYS |
60 |
SSH 会话保留 |
SSH_ACCEPT_ALL |
true |
SSH 任意凭证接受 |
SSH_HOSTNAME |
web-prod-01 |
假 shell 主机名 |
| 名称 | 类型 | 说明 |
|---|---|---|
ach_sid |
Cookie | 公开会话标识 |
ach_chal |
Cookie | JS 质询通过凭证(per-session HMAC) |
X-Agent-Canary |
请求头 | 蜜标回显命中即判定 Agent |
X-Agent-Capture-Decision |
响应头 | 当前决策 |
X-Agent-Capture-Score |
响应头 | 风险分 |
X-Node-Token |
请求头 | 节点 API 认证 |
Q1:接入后会影响业务性能吗? 业务路径不经过 AC(方式一/三),仅新增 Nginx 一条前缀分流,性能影响可忽略;欺骗路径的延迟由 AC 承担。
Q2:多个站点可以共用一个 AC 实例吗?
可以。通过业务 Nginx 分别挂载不同域名的欺骗路径,配合 SITE_ID 与互联网系统台账区分归属;规模化建议方式五节点化。
Q3:蜜标令牌会话结束后还能溯源吗?
能。事件、招募名册与凭证观测按 recruit_src / session_id 持久关联,溯源不依赖在线会话。
Q4:隔离误伤正常用户怎么办?
后台「告警配置 → 主动隔离」可即时解除单条隔离;白名单 IP 强制 allow;必要时缩短 ISOLATION_TTL_MINUTES。
Q5:升级 AC 会丢数据吗?
Docker named volume 持久化(/data);升级前建议 docker compose stop honeypot 后备份卷目录。