Smail/docs/密码恢复实机验收.md
smail 9c450f1734
Some checks are pending
Security Checks / security (push) Waiting to run
运行时配置清理阶段检查点
2026-10-05 01:31:34 +08:00

54 lines
5.1 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.

# 密码恢复实机验收
## 本轮需求
- [~] 管理员、普通用户通过已验证外部邮箱及离线安全凭据恢复密码。
- [~] 超级管理员登录后通过外部安全邮箱验证码修改密码。
- [~] 超级管理员通过部署端受保护本机通道重置密码。
- [x] 管理员、普通用户的一次性恢复页面复用现有 Web 域名和 HTTPS 证书,固定入口为 `https://Web域名/rest/`。
## 当前实现边界
- 普通用户邮箱恢复通过后可以设置新密码。
- 管理员邮箱恢复通过后仍需要未使用的离线恢复码。
- 离线恢复需要密保问题、密保答案和离线恢复码,不是只填写一个安全码。
- 超级管理员不能通过公开忘记密码接口恢复。登录后安全中心使用已验证外部邮箱验证码改密。
- 公开恢复邮件由 `no-reply@主邮件域名` 发送,邮件中的一次性链接使用 Web 域名,不再配置独立恢复域名或额外证书。
- 旧 `adminRecovery` 配置仅保留兼容读取,不在配置页面展示,也不参与恢复路由和证书域名计算。
- 改密成功会使旧会话和相关恢复、客户端凭据失效;测试后需要重新配置下一轮所需凭据。
## Linux 本机通道部署整改
- 部署根目录为 `/opt/smail`,配置、证书、数据和日志保持原位置。
- 主服务使用 `smail` 系统账户,低端口仅通过 `CAP_NET_BIND_SERVICE` 授权。
- `smail-admin` 使用 root 和系统服务上下文,仅通过 `/run/smail/admin-control.sock` 通信。
- 恢复服务不允许开机自动运行,且只允许向本机密码代理临时目录写入交互请求。
- 安装前拒绝覆盖运行中程序,旧程序和服务文件备份到 `/var/backups`,不覆盖业务配置、数据库或证书。
部署人员在可信终端执行 `systemctl start smail-admin`,并按密码代理提示无回显输入两次新密码;如终端没有收到提示,可在另一个可信终端执行 `systemd-tty-ask-password-agent --query`。不得把密码放到命令行、环境变量或日志里。
## 验收说明
Web 功能使用 MCP 模拟键鼠测试;终端用于源码检查、构建、部署、授权范围内的数据备份清理以及本机重置工具本身的交互,不调用业务 API 代替页面验收。2026 年 9 月 16 日用户已授权清理测试数据,本轮限定在 `yunx-test`,先备份所有测试数据库再清空,保留数据库文件并重新执行初始化。不得将此授权扩大到其他部署环境。
具体测试结果记录到 `test-log/日期/测试log`;收到验证码、页面提示请求已受理、构建成功均不单独等于密码恢复闭环完成。
本轮结果见《清库部署测试记录》。
## 2026-09-18 正式管理员登录恢复
本次需求是诊断用户反馈的账号密码错误和后端无响应,恢复正式实例登录,并复核刷新后的会话。正式部署位于 `47.108.78.12:/opt/smail`,网页为 `https://mail.example.com/`。此次属于现有实例故障恢复,保留业务数据库和邮件,不执行首次安装清库流程。
- [✓] 核对实际运行进程打开的数据库为 `/opt/smail/data/smail.db`。用户表只有 `admin`(超级管理员)和 `remotecheck`(普通用户),没有反馈中的 `xuans`。
- [✓] 浏览器提交反馈账号时,登录请求约 293 毫秒返回 HTTP 200、业务错误 100、账号或密码错误。现有管理员使用用户提供的密码也失败。现场证据支持账号及密码不匹配,未观察到后端无响应。
- [✓] 重置前使用 SQLite 在线备份保存至 `/var/backups/smail-login-recovery-20260918-0xb3EO/smail.db`,完整性检查为 `ok`。目录权限 0700,备份权限 0600。
- [✓] 使用项目现有 `smail-admin` 服务及系统密码代理,无回显输入两次用户提供的新密码。通过受保护本机通道恢复现有超级管理员,服务结果 `success`、退出码 0;会话和安全版本递增至 2,旧会话及相关安全凭据按既有规则撤销。
- [✓] 浏览器用 `admin` 和用户提供的密码重新登录,显示超级管理员及收件箱。最终再次登录约 393 毫秒,邮件列表约 47 毫秒;忽略缓存刷新后仍保持登录,用户信息和邮件列表均返回 HTTP 200。
- [✓] Smail 与 Nginx 均持续 active,Smail PID 605706,自动重启次数为 0。未清库、未改用户名、未创建替代账号、未引入部署或续期脚本。
### 公网恢复入口修复
通过已登录管理员的配置页面,将公网 HTTPS 端口由未设置改为 443,保留 HTTP 8001、HTTPS 8002 及 `direct` 模式。页面执行候选配置保存和应用,应用接口业务错误码为 0,正式配置代次从 2 升至 3,磁盘配置确认 `http.publicHttpsPort=443`。
浏览器访问 `/public-password-recovery`,成功跳转至 `https://mail.example.com/rest/#/forgot-password`,显示中文找回密码表单,返回登录按钮正常。服务器探测入口返回 302,目标为不含内部端口的 `https://mail.example.com/rest/`。本次验证覆盖入口及页面,没有发送恢复邮件,不代表外部邮箱改密闭环完成;超级管理员仍通过受保护本机通道恢复。