tamakyi
|
86ea96e5ca
|
feat(autoban): 封禁响应图改为 ban_image_path 配置,默认仍是纯文字
上一版把 403 图 //go:embed 进了二进制。实际部署里图会集中放在 R2 统一管理、
由运维分发到各机器,进仓库反而成了负担:换一张图就要重新编译。
改为配置驱动:
- 新增 [security] ban_image_path(相对路径以进程工作目录为基准);
- 留空 / 文件读不到 / 是目录 / 不是图片 / 超过 2 MB → 一律回退为纯文字
"403 Forbidden",即改造前的老行为。封禁响应是最后一道兜底,不能因为
一张图缺失就变成 500,更不能把站点拦在启动阶段(失败只 Warn);
- 启动时读一次装进 atomic.Pointer,热路径零磁盘 IO;换图 = 换文件 + 重启。
安全细节:按内容嗅探(http.DetectContentType)而不是扩展名,必须是 image/*。
把 ban_image_path 配成 app.ini / .env 会被拒绝并告警 —— 否则等于把配置文件
原样吐给每一个被封的攻击者。这条有专门的用例与变异验证。
顺带删掉 internal/route/assets(webp + embed),已无引用。
测试:
- TestWriteBannedTextFallback:未配图 → 403 + text/plain + 13 字节明文;
- TestWriteBannedServesConfiguredImage:配了 1×1 PNG → image/png(按内容嗅探)、
Content-Length 与文件一致、body 与文件逐字节相同;
- TestLoadBanImageRejectsBadInput:不存在 / 是目录 / 非图片 / 空文件四种配置错误
都不得装载,且**不得把文件内容当响应体吐出去**;
- TestLoadBanImageTooLarge:超 2 MB 拒绝;
- TestWriteBannedHead:两条分支的 HEAD 都只回头不给 body。
变异验证:去掉 image/* 校验 → 用例报「把文件内容当响应体吐了出去:
"[server]\nsalt = secret"」;强制走纯文字分支 → 配图用例按预期变红。
实测:真 webp 嗅探为 image/webp;app.sample.ini 嗅探为 text/plain 被拒。
|
2026-10-23 15:25:07 +08:00 |
|
tamakyi
|
6fad0cbe50
|
docs: 说明封禁响应的图片体与替换方式
|
2026-10-23 15:04:14 +08:00 |
|
tamakyi
|
9d3f5a72fa
|
docs: 补 XML-RPC 端点行为、动态 token 与 .php 变体说明,记实现取舍
|
2026-10-23 12:58:49 +08:00 |
|
tamakyi
|
db97ac13ed
|
docs: 蜜罐文档补家族伪装与资源开销
honeypot.md:
- 开篇从「一个假 WordPress 后台」改为「按扫描目标伪装成对应后台」,列出 9 个家族
与各自触发路径;
- §1 补静态资源的处理(回占位内容、不落库、插件 .php 回 404 的理由);
- §3 封禁路径表补一行「Tomcat Basic 认证」的归属,说明 401 也走凭据通道;
- 补资源开销的实际数字,便于运维判断这功能值不值。
cli.md:paths 说明补家族汇总。
|
2026-10-23 12:38:42 +08:00 |
|
tamakyi
|
90a284a3dd
|
docs: 写清「封的是一把键」与取证地址的区别
honeypot.md:
- §3 新增小节:LimitKey 折叠规则(IPv4 原样 / IPv6 折 /64)、邮件里两个地址
各自含义、封禁只在内存里、建封 WARN 的字段与 grep 方法;
- §4 注明取证存的是精确地址,不是 /64 聚合键;
- §8 排障首行补「邮件说封了但还能访问」的三种原因与判定路径,
并提醒「邮件里的来源 IP 不是封禁键,拿它对 ban_key 永远对不上」。
cli.md:stats 说明改为「来源排行(IPv6 按 /64 聚合)」,补 ip 语义。
|
2026-10-23 10:53:12 +08:00 |
|
tamakyi
|
3d453749eb
|
docs: 新增蜜罐部署运维文档,cli.md 补 honeypot 命令与排障条目
docs/honeypot.md(新增):
- 生效范围与匹配规则:挂在 NotFound、业务前缀强制剔除、三类匹配方式;
- 配置项表,并单独警告「行尾注释会被并入值」(IgnoreInlineComment 的坑);
- 两条封禁路径:GET 探测走常规阈值、提交凭据才一次即封,附原因
(GET 就封等于拿不到字典,这是最容易误解的一点);
- 凭据文件格式/权限/保留期,以及为什么不入库(备份、主从、BI);
- trust_proxy 部署必读:回环 IP 会让取证失真且一次封禁封掉整站;
- 升级清理旧版明文列(purge-creds 不可逆);
- 排障表 + 设计取舍(GET 不封、canary 位置、邮件带明文等)。
docs/cli.md:
- §0 补两条实测踩坑:「替换二进制必须重启进程」「strings 不认中文,
用 grep -ac」;
- 命令总览加 honeypot;
- 新增 §7 honeypot 命令(hits/stats/paths/size/prune/purge-creds),
原 7/8/9 顺延为 8/9/10;
- 排错表加 5 条:回环 IP、整站 403、进程未重启、strings 误判、命令不存在。
|
2026-10-21 16:25:58 +08:00 |
|