Smail/docs/完整候选反代隔离验收记录.md
smail cfa41e1efe
Some checks are pending
Security Checks / security (push) Waiting to run
完成完整候选反代隔离验收并补齐收尾回归证据
2026-09-18 02:17:40 +08:00

73 lines
8.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 完整候选反代隔离验收记录
## 范围与结论
远程主机为 `47.108.78.12`,主机名 `ikun2`。本轮从远程时间 2026 年 9 月 18 日 01:51 开始,仅在远程执行应用和自动测试;本机用于编辑、Git 和文件传输。所有业务流程使用新建隔离实例及空数据库,不清理或复用线上业务数据,不删除历史证据,不暂停线上服务。
- [✓] 完整候选六个 Linux 可执行文件上传后逐一校验长度、SHA-256、ELF64 和 x86_64 标识。
- [✓] 真实独立 Nginx 反代到 HTTPS 8002,HTTP 8001 初始化和运行端口通过;通过正式配置 API 设置公网 HTTPS 443 和可信代理范围。
- [✓] 公网 80 及应用 8001 跳转均保留路径和查询参数,不携带内部 8002;匿名恢复入口、页面登录地址和实际生产入口脚本可用。
- [✓] 两个真实连接来源分别验证登录限流;被限制来源伪造转发头仍被拒绝,另一来源能够正常登录。
- [✓] 空库首次安装、登录会话、SMTP/IMAP/POP3 认证、内部 25 STARTTLS 中文正文及附件收信、混合认证过载后的恢复通过;双库完整性正常,线上不存在测试邮件。
- [✓] 测试进程与线上独立网络、挂载隔离;最终反代测试四个线上服务 PID、InvocationID 和重启计数前后一致,没有新增内核 OOM。
- [✓] 6 项测试收尾模拟回归通过,覆盖资源查询超时、停止及强制终止失败后继续处理其余测试单元、拒绝业务服务名。
- [!] 最新应用尚未替换线上版本。这是隔离候选验收,不是正式部署、真实浏览器闭环、可信 CA 正式换证或整体生产放行。
## 候选组成
应用源码为 `c1dd533c805cbfda7a366a1170d2e710f04f86a1`,版本 `review-c1dd533`。本轮验收工具修改前提交并推送中文基线 `1d4b9c4`,该基线不改变应用源码。
主前端采用上一轮远程生产构建,详见《远程前端构建验收记录》。Telegram 界面也由同一版本归档源码远程构建,其 16 个输入文件已在前序构建阶段核对。依赖安装日志位于 `/var/tmp/smail-review-telegram-build-20260918/deps-0140.txt`,最终构建日志为 `build-0143.txt`;实际 Node 路径修正后 `vue-tsc --build`、Vite 均通过,构建峰值约 395 MiB、交换空间为零。首次私有临时目录造成的启动失败日志保留。
Linux 候选由干净源码归档、上述新界面产物及重新编译的三个插件组成,主程序使用 `bundled` 标签;前序交叉编译使用 Go 1.26.6、`CGO_ENABLED=0`、`GOOS=linux`、`GOARCH=amd64`、`-mod=readonly -trimpath`。本轮未再次编译或更改应用源码。
本机产物位于 `out/release-review-c1dd533-linux-amd64`,远程位于 root 所有的 `0700` 目录 `/var/tmp/smail-review-candidate-c1dd533`。`receipt.json` 记录六个文件的长度和摘要。
| 项目 | SHA-256 |
| --- | --- |
| 主程序 | `b2ceda68f26e3753be7124d11ce5bc06e309a119dd13ef7254bf403c3e0a4792` |
| 管理工具 | `2a99f6bef10092b72d550e195141a572ec02fae541fb3615d3b529bd15a193eb` |
| 配置迁移工具 | `b2016a293798c82190f7334b623237b3f460816e67ae9bdb2d592ea6a4ef8c55` |
| 主前端归档 | `91f775c666e01a24e47b7ac35132ac171a087aac9641c5bffb3456113d311f01` |
| Telegram 界面归档 | `07f05f902dbe58c7e49d757b53c3f47c4a6c1442ffd4cc7c83db56af03d061de` |
首次管理工具版本断言将额外的根目录输出误判为版本不匹配,在运行业务测试前退出;随后按实际版本输出行核对为 `review-c1dd533`。主程序没有被当作支持 `--version` 的命令直接在宿主环境启动。
## 反代验收方式
`test/tools/runtime_review.py` 新增可选 `--nginx-template`,保持原有直连默认路径。`runtime_proxy.py` 仅替换部署模板中的测试域名和证书、临时文件路径;保留 `proxy_pass https://127.0.0.1:8002`、上游证书校验、SNI 和覆盖客户端转发头的配置。模板摘要为 `bf6816c38f9c639ab17fd7344fff4b06afc5a2388f74318e18c60b8b3311ebd8`。
证书由隔离测试创建,仅供当前客户端及测试 Nginx 信任,不写入宿主信任库,不复制正式私钥。公网端口指隔离网络中的 80/443,不对实际互联网开放。应用、探针、Nginx 的内存硬上限分别为 128/48/32 MiB,交换空间均禁止;反代预检至少要求 320 MiB 可用内存,不通过时拒绝执行。
先在 8001 完成正常初始化,再通过真实反代登录、读取配置代次、验证及保存候选、显式应用配置。`publicHttpsPort` 设置为 443,`trustedProxyCidrs` 仅为 `127.0.0.1/32`,没有直接改写测试数据库或配置文件来绕过正式流程。
来源测试从 `127.0.0.2` 连续发送十次错误密码,使账号与 IP 组合限流生效;该来源改用正确密码并伪造 `X-Forwarded-For`、`X-Real-IP` 仍被拒绝。随后从 `127.0.0.3` 使用正确密码登录成功。该验证覆盖当前单代理拓扑,不等同于任意多层代理、防火墙或公网攻击容量验收。
恢复页以匿名连接访问,验证 `/public-password-recovery` 跳转至 `/rest/`、页面 `no-store`、注入登录地址为 `https://mail.runtime.invalid/#/login`,并解析 HTML 后实际读取生产脚本入口。没有执行浏览器 JavaScript、恢复邮件送达或密码重置,不能据此宣称恢复业务闭环完成。
## 运行证据与失败记录
- `/var/tmp/smail-review-runtime-20260918-015323`:修改工具前的完整候选直连基线通过,探针 24.91 秒,应用峰值 77,230,080 字节。
- `/var/tmp/smail-review-runtime-20260918-020045`:首次反代失败。生成配置为 root 组且权限 0640,受限 Nginx 无法读取;记录保留,线上不变,测试进程已停止。
- `/var/tmp/smail-review-runtime-20260918-020252`:修复为 root 所有、smail 组的 0640 后反代通过,探针 39.28 秒。
- `/var/tmp/smail-review-runtime-20260918-020719`:补齐恢复页和收尾逻辑后的反代验收通过,探针 40.32 秒,应用峰值 77,225,984 字节,Nginx 峰值 3,612,672 字节,两者交换空间为零。
- `/var/tmp/smail-review-runtime-20260918-020823`:最新工具的默认直连回归通过,探针 25.59 秒,应用峰值 77,254,656 字节,交换空间为零;证明可选反代模式未破坏原直连流程。
每个运行目录保留 `result.json`、`probe-result.json`、`probe.log`、`service.log`,失败目录也保留。最终结果中的 `resource_errors`、`cleanup_errors` 均为空,`live_message_absent`、`live_unchanged` 为真,两库 `integrity_check` 均为 `ok`。停止操作只接受工具生成的单元名,查询异常仍执行收尾;这些措施不代替未来宿主掉电等完整故障演练。
收尾模拟单元 `smail-runtime-cleanup-tests-20260918-0206b` 六项通过,峰值 14.9 MiB、交换空间为零。首次 `0206` 因 `PrivateTmp` 隐藏工具目录而没有执行测试;第二次仅增加指定工具目录的只读挂载,继续保留生产目录不可访问和独立网络限制。模拟用例不调用真实停止命令。
02:16 在相同限制下补跑六项模拟回归,全部通过,单元 `smail-runtime-cleanup-tests-20260918-021606` 运行 406 毫秒、峰值 15.1 MiB、交换空间为零。持久日志为 `/var/tmp/smail-review-proxy-c1dd533/cleanup-tests-20260918-021606.txt`。模拟单元以 root 执行,不宣称其为非特权用户回归。
02:15 远程收尾复核:四个线上服务仍 active,主进程及 InvocationID 与测试前一致;Nginx 配置检查、MySQL 就绪探测通过,Smail 与 Scert 的系统信任 HTTPS 页面均返回 200。本轮测试无运行中单元,历史失败单元记录继续保留。四个远程验收工具与本机 SHA-256 逐一一致。此时专用 DNS 配置仍不存在,旧续期 timer 为 active,未把候选脚本当作已经上线。
## 后续门槛
- [ ] 对线上部署建立可回退备份,部署候选并复核真实公网配置和传输入口。
- [ ] 真实桌面浏览器首次安装、登录、网页提交邮件、最终队列状态和实际收件结果。
- [ ] 受保护本地 IPC 管理员恢复及旧会话、协议凭据撤销,凭据轮换与访问审计。
- [ ] 队列与数据库故障、目标数据库兼容性、竞态、容量和异机恢复。
- [!] 01:51 只读复核时专用 DNS 配置仍缺失、旧续期 timer 仍启用;全新 DNS 挑战、正式新证书发布及外部告警仍未验收。不得将本轮隔离证书当作可信证书自动续期完成。
维持整体结论:不满足生产放行。以上通过项是完整目标中的增量证据,不缩减原发布验收范围。