收紧反代访问日志并记录云端安全恢复验收
Some checks are pending
Security Checks / security (push) Waiting to run

This commit is contained in:
smail 2026-10-02 13:34:18 +08:00
parent a6e7d39e5a
commit 56d0688b5f
3 changed files with 60 additions and 4 deletions

View File

@ -1,9 +1,15 @@
# 部署前必须将域名占位符替换为用户在初始化页面确认的邮件主域名和后台域名。
# 此模板不包含测试域名;不要将未填写的模板直接安装到 Nginx。
# 仅记录请求路径,不记录查询参数、来源页或认证头,避免授权码进入访问日志。
log_format smail_privacy
'$time_iso8601 remote=$remote_addr method=$request_method uri=$uri '
'status=$status bytes=$body_bytes_sent duration=$request_time';
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
access_log /var/log/nginx/smail-access.log smail_privacy;
return 404;
}
@ -11,6 +17,7 @@ server {
listen 80;
listen [::]:80;
server_name __SMAIL_MAIL_DOMAIN__ __SMAIL_WEB_DOMAIN__;
access_log /var/log/nginx/smail-access.log smail_privacy;
location ^~ /.well-known/acme-challenge/ {
root /var/lib/smail-acme;
@ -27,6 +34,7 @@ server {
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
server_name _;
access_log /var/log/nginx/smail-access.log smail_privacy;
ssl_reject_handshake on;
}
@ -34,6 +42,7 @@ server {
listen 443 ssl;
listen [::]:443 ssl;
server_name __SMAIL_MAIL_DOMAIN__;
access_log /var/log/nginx/smail-access.log smail_privacy;
ssl_certificate /opt/smail/ssl/custom.crt;
ssl_certificate_key /opt/smail/ssl/custom.key;
return 308 https://__SMAIL_WEB_DOMAIN__$request_uri;
@ -43,6 +52,7 @@ server {
listen 443 ssl;
listen [::]:443 ssl;
server_name __SMAIL_WEB_DOMAIN__;
access_log /var/log/nginx/smail-access.log smail_privacy;
ssl_certificate /opt/smail/ssl/custom.crt;
ssl_certificate_key /opt/smail/ssl/custom.key;

View File

@ -42,19 +42,25 @@
- Web HTTPS 的证书申请、续期和加载由反代服务器上的证书管理工具负责,Smail 不再发起 ACME 请求,也不需要把 ACME 验证路径转发给 Smail。
- 反代模式下,初始化 SSL 步骤只提供外部证书导入,不再提供自动 HTTP 或 DNS 验证。仅切换反代模式不会删除已有证书或自动模式配置;切回直接 HTTPS 时,仍保留自动类型的证书可继续由 Smail 维护。若已主动导入外部证书,则仍由外部维护,不会自动恢复签发。
- HTTP 反代不等于邮件协议代理。SMTP、IMAP、POP3 仍使用 Smail 本地受管证书,必须保留有效证书和匹配私钥,不能改成明文认证。
- 外部工具续期后,需要将邮件服务使用的新证书和私钥重新导入 Smail 受管存储、应用引用并重启相关服务。导入是受验证的副本,不会自动跟随反代服务器上的源文件变化。
- 仅仅在 Nginx 上更换证书,不会更新 Smail 的邮件服务证书。本次调整没有增加跨服务器证书同步或自动重新导入功能。
- HTTP 反代不等于邮件协议代理。SMTP、IMAP、POP3 仍需使用有效的本地证书和匹配私钥,不能改成明文认证。
- 手动配置可以直接引用服务器上的证书和私钥路径,不生成副本。Nginx 与 Smail 引用同一组文件时,外部工具应成对更新证书与私钥,检查 Nginx 配置后平滑加载;Smail 的运行时证书加载器会检查文件变更,并在新证书无效时保留已有有效证书。
- 使用导入副本或不同路径时,更新 Nginx 的源文件不代表 Smail 已更新,仍需重新导入或同步实际引用的文件。跨服务器同步不能靠共享路径配置完成。
- 手动引用和证书热加载都不等于自动续期。必须另行配置、验证外部续期及部署任务,并分别核验网页和各邮件协议实际使用的证书;不能以页面可访问或文件已替换作为续期验收结论。
## Nginx 配置示例
下面示例将 Nginx 的 15184 本机代理端口替换为实际 Smail HTTP 端口。
```nginx
log_format smail_privacy
'$time_iso8601 remote=$remote_addr method=$request_method uri=$uri '
'status=$status bytes=$body_bytes_sent duration=$request_time';
server {
listen 80;
listen [::]:80;
server_name xuans.com;
access_log /var/log/nginx/smail-access.log smail_privacy;
location /.well-known/acme-challenge/ {
# 由反代服务器上的 ACME 客户端写入此目录,不转发到 Smail。
@ -71,6 +77,7 @@ server {
listen 443 ssl;
listen [::]:443 ssl;
server_name xuans.com;
access_log /var/log/nginx/smail-access.log smail_privacy;
ssl_certificate /etc/letsencrypt/live/xuans.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/xuans.com/privkey.pem;
@ -122,6 +129,12 @@ Nginx 对公网提供 Web 服务时通常开放 `80/tcp` 和 `443/tcp`。Smail
邮件协议端口按照实际启用情况开放,例如 `25/tcp`、`465/tcp`、`587/tcp`、`993/tcp`、`995/tcp`;数据库端口不应直接开放公网。IPv6 监听和防火墙规则应同步配置。
## 访问日志保护
`deploy/nginx/smail.conf` 使用专用日志格式,仅保留请求路径及必要的状态信息,不记录查询参数、来源页和认证头,避免微信授权回调、密码恢复链接等敏感参数进入访问日志。不要为 Smail 站点重新启用包含完整请求或来源页的日志格式。
专用日志文件应限制为 `0640` 或更严格权限,并确认日志轮转后的权限不会放宽。不要直接修改共享服务器上其他项目的日志。错误日志和应用日志仍需单独检查,访问日志脱敏不代表所有日志均已完成脱敏。
## 验证清单
- [ ] Smail 日志显示已跳过内部 HTTPS 监听。
@ -132,4 +145,5 @@ Nginx 对公网提供 Web 服务时通常开放 `80/tcp` 和 `443/tcp`。Smail
- [ ] 浏览器收到的会话 Cookie 仍带有 `Secure` 和 `HttpOnly` 属性。
- [ ] 证书续期由反代服务器完成,Smail 不再发出 ACME 申请或续期请求。
- [ ] 使用 HTTP 验证时,ACME 路径由反代服务器提供,其他 HTTP 路径跳转到 HTTPS。
- [ ] 本地邮件服务证书保持有效;外部续期后已重新导入、应用并重启相关服务。
- [ ] 本地邮件服务证书保持有效;外部续期后已更新实际引用文件或重新导入,完成 Nginx 加载及邮件协议实际握手核验。
- [ ] Smail 专用访问日志不记录查询参数、来源页和认证头,文件及轮转权限符合要求。

View File

@ -1,5 +1,7 @@
# 清库部署测试记录
本文保留分日期的测试记录。不同环境、版本和日期的结果不可相互替代;最新云端续验见文末。
## 范围与状态
日期:2026 年 9 月 16 日。仅测试本机 `D:\Desktop\Smail\yunx-test`,使用正式构建包和嵌入前端,未启用开发模式或停用本机恢复通道。
@ -53,3 +55,33 @@
后续正式流程需要符合项目部署要求的 Windows 权限环境或受支持的 Linux 部署环境。当前会话无法提供已提升的 Windows 令牌,不通过绕过权限限制推进验收。
在具备权限的环境中重新完成初始化并确认服务稳定后,再验证登录、会话刷新和邮箱恢复。邮件恢复还需要确定实际可接收验证码的外部测试邮箱;验证码收到、恢复页面打开或接口返回成功均不单独构成完整验收。
## 2026 年 10 月 2 日云端续验
### 范围
本段时间为 13:17 至 13:30,继续当天已经完成的全新部署验收,不重复清库或恢复历史数据。业务操作使用浏览器页面;交互式 SSH 仅检查运行状态、修改 Smail 专用 Nginx 日志配置和权限。未调用业务接口代替页面测试,未新建测试脚本,未修改 Go 或前端业务代码。
### 本段结果
- [✓] 普通用户使用恢复后的临时密码登录成功,原邮件可读;随后通过安全设置恢复指定测试密码并再次登录,收件箱邮件仍在。本文不记录密码或安全码。
- [✓] 密码恢复后的安全设置显示不存在有效安全码,公共恢复入口不再提供安全码验证;源码确认恢复事务会撤销整批凭据。因页面已经撤销整批安全码,本段未单独提交第二枚旧码,不能称为逐码重放实测。
- [✓] 修改密码后页面退出登录,明确提示原安全凭据已失效。
- [✓] 超级管理员在公共找回页面被明确拒绝重置,提示使用安全中心或部署端本机通道;未执行超级管理员本机重置。
- [✓] 基础配置页面显示单一 MySQL 数据库和数据库用户均为 `smail`;页面域名与本次部署确认值一致。
- [✓] SSL 页面显示手动配置、不自动续期,直接引用 Nginx 使用的同组证书文件路径。
- [✓] Smail 专用 Nginx 配置改为不含查询参数、来源页及认证头的访问日志格式;配置语法检查通过并平滑加载。通过浏览器打开带无敏感信息测试参数的登录页后,新访问日志仅包含路径,测试参数匹配数为零。
- [✓] Smail 专用访问日志及错误日志权限均已设为 `0640`;现有日志轮转配置也使用 `0640`,未改动其他项目日志。
- [✓] 调整后 Smail、Nginx 均运行正常;Smail 启动时间仍为当天 11:58:26,自动重启次数为零,本段未重启 Smail。
- [x] 部署模板同步专用访问日志格式,反代部署说明校正证书路径引用与热加载行为;本地差异检查通过。完整占位符模板尚未在另一套全新实例重新部署。
### 尚未关闭的验收项
- [!] 自动证书续期、证书更新后网页及各邮件协议加载闭环尚未实测通过,手动配置和热加载不能替代自动续期验收。
- [!] 外域双向收发、真实 SMTP/IMAP/POP3 客户端、反中继及通知凭据协议隔离仍待完成。
- [!] 外部邮箱恢复、超级管理员本机恢复、附件上传及其他安全功能尚未全部覆盖。
- [!] 本次全新环境的微信、Telegram 配置与真人绑定尚未完成,不继承历史成功结果。
- [!] 历史日志未删除;应用日志、错误日志及其他日志的敏感信息检查仍待完成,不能以访问日志格式修改代替全部日志审计。
- [!] 本轮临时账号、分组和其他验收数据保留用于后续测试,发布前仍需按确认范围完成清理。
以上不构成全项目验收通过或上线签收。