Smail/docs/晚间验收复测记录.md
smail 4ea034298f
Some checks are pending
Security Checks / security (push) Waiting to run
记录晚间远程验收复测与共享Nginx续期风险
2026-09-17 23:41:38 +08:00

70 lines
5.6 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.

# 晚间验收复测记录
## 范围与基线
- 日期:2026-09-17,远程检查开始于北京时间 23:30。
- 目标:47.108.78.12,主机名 `ikun2`。所有应用与回归测试仅在该服务器执行。
- 本轮基线提交:`a0e373d`,已推送。仅复测现有部署,不修改应用源码,不重新编译或替换线上程序。
- 测试对象仍为 `review-2263779`,主程序和管理程序摘要与上一轮相同。
- 本轮只读检查线上状态,续期回归使用模拟依赖和独立网络,不登录、不发信、不写业务数据库。因此未清库、未进行首次安装,不计入最新构建清洁部署验收。
- 证据目录:`/var/tmp/smail-review-night-20260917-233135`,权限 0700。保留失败日志与重试结果,不删除历史证据。
## 任务清单
- [✓] 核实当前工作树、程序摘要及服务状态。
- [✓] 可信 TLS、内部 25/587 STARTTLS、HTTP 跳转及未知 Host/SNI 拒绝复测。
- [✓] 六项隔离续期回归及线上脚本摘要核对。
- [✓] 备份摘要、证书有效期、私钥权限与本地恢复 socket 权限检查。
- [✓] 非特权用户实际连接本地恢复 socket 被拒绝。
- [✓] 五分钟资源采样与结束时服务复核,共 11 次采样通过;仅覆盖本轮短时观察。
- [!] 真实远程浏览器业务验收、首次安装及发信闭环未执行。
- [!] Nginx 共用后的续期维护影响待处理,未触发真实续期。
## 已取得证据
| 检查 | 结果与边界 |
| --- | --- |
| 443、8002、465、993、995 | 系统信任链与主机名校验通过,使用同一叶证书 |
| 内部 25、587 | STARTTLS 通过,明文阶段不公布 AUTH,未执行邮件投递 |
| 80、8001 | HTTP 跳转通过,公网 80 不泄露内部 8002 |
| 未知 Host/SNI | HTTP 拒绝、TLS 握手拒绝通过 |
| Nginx 配置 | `nginx -t` 通过,未重载服务 |
| 续期脚本回归 | 六项通过;验证未到期、到期失败及超时恢复、成功路径、权限、证书信任和密钥匹配相关行为 |
| 线上脚本一致性 | 两个续期部署脚本分别与本轮上传副本 SHA256 一致 |
| 已有一致性备份 | `smail-state.tar.gz` 摘要仍为 `29bd3deb4b498ee873d83cd5986cfd37b2c2c3cf08347a6b913e0c9ea8b41965`,未执行恢复 |
| 证书 | 五域名 SAN 完整,有效期至 2026-12-16 13:54:39 UTC,超过 30 天 |
| 私钥与恢复入口 | 应用私钥 0600、ACME 目录 0700、ACME 私钥 0600、恢复 socket 0600;不代表完整恢复撤销通过 |
| 本地 IPC 访问边界 | 以 `nobody` 用户、UID 65534 连接恢复 socket,得到预期 `EACCES`;没有发送业务请求或修改账户,证据为 `ipc-access-boundary.json` |
| UFW | IPv4/IPv6 的 8001:8002 优先拒绝规则存在,未执行独立外网扫描 |
续期回归使用 systemd 独立网络、私有临时目录、只读系统和脚本挂载;禁止访问生产应用、恢复 socket、ACME 目录及备份。限制为 64 MiB 内存、零交换、25% CPU、32 个任务和 90 秒运行时间。
首次启动时,`PrivateTmp` 隐藏了 `/var/tmp` 中的脚本,Python 以退出码 2 结束,尚未运行任何用例。随后将本轮脚本目录只读挂载至 `/opt/smail-night-code` 后重试成功;没有关闭隔离或扩大资源上限。失败日志为 `renewal-regression.log`,成功日志为 `renewal-regression-retry.log`。
成功回归的 systemd 输出记录运行时间 485 ms、峰值内存约 15 MiB;结束后再次查询 `MemoryPeak` 为未设置,因此不能将后一次空值解释为零内存。
## 资源与结束复核
资源采样时间为北京时间 23:32:30 至 23:37:31,共 11 次,跨度约 301.49 秒,每次均按原 128 MiB 保留预算通过。
| 指标 | 实测结果 |
| --- | --- |
| 主机可用内存 | 772,050,944 至 813,060,096 字节 |
| Smail 当前内存采样峰值 | 35,913,728 字节,约 34.3 MiB |
| Smail 增长至硬上限后的最小主机余量 | 270,471,168 字节,约 258 MiB,大于 128 MiB 保留预算 |
| 进程与 OOM | 同一 InvocationID,OOM 和 OOM kill 均为零 |
| 结束时 Smail | active,PID 574584,NRestarts 0 |
| 结束时 Nginx | active,PID 575746,NRestarts 0 |
| 同机服务 | Scert、MySQL、PostgreSQL 的进程与监听在结束复核时仍存在,PID 与本轮开始一致 |
| 结束时传输层 | `transport-final.json` 再次通过 |
逐次证据为 `resource-00.json` 至 `resource-10.json`,汇总为 `resource-summary-retry.json`,服务状态为 `service-final.txt`。首次汇总将 `resource-summary.json` 自身匹配为样本,误报缺少样本并退出;重试改为显式读取 11 个编号文件后通过,空的首次汇总文件保留,原始采样没有被覆盖。
此观察期间没有持续业务负载,不能据此推导并发用户数、邮件吞吐量或长期稳定性,汇总中的 `productionApproved` 保持 `false`。
## 新发现与剩余阻塞
当前 `/etc/nginx/conf.d/scert-apmmk.conf` 为 Scert 提供 8003/8004 入口,与 Smail 共用同一个 Nginx。现有续期脚本会停止整个 Nginx 服务,因而存在跨项目中断风险。此结论来自现场配置与续期源码核对,没有通过停止服务制造故障。需要明确共用服务维护窗口或调整挑战部署方式,并完成对应远程演练。
服务器未检测到 Chromium、Chrome 或 Node/npm 可执行文件,本轮没有启动本机浏览器代替远程浏览器验收。代理客户端 IP、恢复公网端口、管理员恢复与撤销、凭据轮换、持久投递故障恢复、真实续期告警、容量和异机恢复仍未通过。本轮结果不能用于签署整体生产放行。