2.2 KiB
2.2 KiB
蜜罐(多家族伪装 / 取证 / 封禁)
结构
internal/security/honeypot/family.go是唯一皮肤表:9 个 Family (wordpress / phpmyadmin / tomcat / jenkins / grafana / gitlab / luci / joomla / generic)。 每个 skin 自带 routes、title、brand、tagline、css、fields、hidden、failure、headers、cookies。FamilyOf(path)按 segments 前缀判定(.也算边界,兼容/adminer.php)。 新增路径必须同时进honeypotPrefixes,否则Match根本不接管。asset.go:/wp-admin/css/…、/wp-includes/js/…这类资源回占位内容, 不落库、不计数 —— 一次页面加载会打 5–10 个资源请求。page.go:一次strings.Builder拼接,禁用"a" + b + "c"(每个 + 一次分配);fieldIDReplacer必须包级,别在循环里NewReplacer。route/honeypot.go的 Serve 顺序:cleanPath → 资源短路 → 家族 → 诊断日志 → 回环告警 → 提凭据 → 封禁 → 响应 → 落库。
性能基线(谁改慢了谁负责)
RenderFamily≈ 3.7 µs / 2 allocs / 5.2 KB;AssetFor≈ 55 ns / 0 alloc。- 单页体积上限 4 KB,由
TestRenderIsCheap守。 - 预览:
go run ./dev/preview-honeypot→outputs/honeypot-preview/index.html(9 个 iframe)。 改皮肤后务必跑一次并截图,上一版就是靠它发现 Tomcat 按钮没背景色。
坑
- hidden CSRF token 不能算密码键:PMA / GitLab 的表单带
token,而 map 遍历无序, 一旦 token 进isPasswordKey,真密码会被随机覆盖成 token 值。 所以credentialKeys收 token(只用于判HadFields),isPasswordKey不收。 - Tomcat 家族 = 401 +
WWW-Authenticate,凭据从Authorization头取; 给它一个 HTML 表单反而不像。 - 页面里不能出现
TamaBox/honeypot字样;canary 只放 HTML 注释,<meta name="generator">必须伪装成真实产品(扫描器必查)。 - WP 登录页底部不能挂 404 文案(真实页没有,挂上一眼就假)。
- 新增诱饵前缀前先核对业务路由(
/user、/login、/api、/_/…);forbiddenPrefixes按/xxx段边界判断,所以/users/sign_in不会被/user连坐。