From 51f7f3e55cee16d3b747bea30e0382fca4b25dd1 Mon Sep 17 00:00:00 2001 From: xuans Date: Thu, 1 Oct 2026 16:29:16 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=9F=E4=B8=80=E6=9C=8D=E5=8A=A1=E5=9B=9E?= =?UTF-8?q?=E7=8E=AF=E7=9B=91=E5=90=AC=E5=B9=B6=E8=AE=B0=E5=BD=95=E6=A0=87?= =?UTF-8?q?=E5=87=86=E7=AB=AF=E5=8F=A3=E5=8F=8D=E4=BB=A3=E8=A6=81=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 同步动态服务生成器与静态模板的回环地址策略,补充回归断言和双服务器只读核查记录。生产验收状态保持待复审。 --- backend/internal/admin/service_units_test.go | 1 + backend/internal/servicehost/linux.go | 1 + backend/internal/servicehost/linux_test.go | 2 ++ deploy/README.md | 18 ++++++++++++++++++ doc/Linux生产流程测试记录.md | 15 +++++++++++++++ doc/Scert整改任务执行清单.md | 15 +++++++++++++++ doc/Scert整改合并优化清单.md | 15 +++++++++++++++ 7 files changed, 67 insertions(+) diff --git a/backend/internal/admin/service_units_test.go b/backend/internal/admin/service_units_test.go index b5e73b7..6697c25 100644 --- a/backend/internal/admin/service_units_test.go +++ b/backend/internal/admin/service_units_test.go @@ -18,6 +18,7 @@ func TestScertSystemdUnitPolicy(t *testing.T) { "Documentation=file:///scert/docs/Scert-service-management.md", "User=Scert", "Group=Scert", + "Environment=SCERT_SERVER_HOST=127.0.0.1", "ExecStart=/scert/scert --config /scert/conf/scert.json serve", "Restart=on-failure", "UMask=0077", diff --git a/backend/internal/servicehost/linux.go b/backend/internal/servicehost/linux.go index 29eafd7..53cc69a 100644 --- a/backend/internal/servicehost/linux.go +++ b/backend/internal/servicehost/linux.go @@ -176,6 +176,7 @@ func renderUnitFile(options Options) (string, error) { "WorkingDirectory="+quoteUnitValue(normalized.WorkDir), "ExecStart="+quoteUnitValue(normalized.Executable)+" --config "+quoteUnitValue(normalized.ConfigPath)+" serve", "Environment=SCERT_BOOTSTRAP_FIREWALL_MODE=external", + "Environment=SCERT_SERVER_HOST=127.0.0.1", "KillSignal=SIGTERM", "TimeoutStopSec=30", "Restart=on-failure", diff --git a/backend/internal/servicehost/linux_test.go b/backend/internal/servicehost/linux_test.go index 4d27be5..67f6ee1 100644 --- a/backend/internal/servicehost/linux_test.go +++ b/backend/internal/servicehost/linux_test.go @@ -30,6 +30,7 @@ func TestRenderUnitFileIncludesExecutableConfigurationAndWorkDir(t *testing.T) { "RuntimeDirectory=scert", "RuntimeDirectoryMode=0700", "Environment=SCERT_BOOTSTRAP_FIREWALL_MODE=external", + "Environment=SCERT_SERVER_HOST=127.0.0.1", "[Service]", "Type=simple", "User=Scert", @@ -75,6 +76,7 @@ func TestPackagedUnitAllowsInterfaceDiscoveryWithoutCapabilities(t *testing.T) { "CapabilityBoundingSet=", "AmbientCapabilities=", "NoNewPrivileges=yes", + "Environment=SCERT_SERVER_HOST=127.0.0.1", "User=Scert", } { found := false diff --git a/deploy/README.md b/deploy/README.md index 442a38e..0988fc4 100644 --- a/deploy/README.md +++ b/deploy/README.md @@ -369,3 +369,21 @@ powershell -ExecutionPolicy Bypass -File .\install-windows.ps1 ` ``` Windows Service 实机安装、开机启动、停止、升级和 ACL 仍需在授权 Windows 主机上验收。 + +## 标准端口反向代理部署约束(2026-10-01) + +本轮 Linux 部署使用以下端口边界;前面的自定义公开端口示例不用于本次生产部署。 + +| 组件 | 监听地址 | 用途 | +| --- | --- | --- | +| Nginx | 公网 `80` | 跳转到管理域名的 HTTPS 入口 | +| Nginx | 公网 `443` | 管理页面及接口的唯一 HTTPS 入口 | +| Scert | `127.0.0.1:8443` | 仅供本机 Nginx 访问,不在安全组或防火墙额外放行 | + +静态安装模板与命令行生成的 Linux systemd unit 均设置 `Environment=SCERT_SERVER_HOST=127.0.0.1`。内部端口由 Scert 配置决定,本次使用 `8443`,该环境变量只约束监听地址。部署时必须核对已有 drop-in 或环境文件没有将监听地址覆盖为公网地址。 + +使用 `deploy/nginx/Scert.conf.example` 时,将 HTTP、HTTPS、上游端口分别填写为 `80`、`443`、`8443`,管理域名和证书路径使用实际配置。保留 `proxy_ssl_verify on`、管理域名 SNI 和可信 CA;不得通过关闭 TLS 校验解决上游证书错误。共享 Nginx 仅调整 Scert 对应站点,不覆盖邮件或其他站点。 + +首次初始化也不能临时开放公网业务端口。尚无可信管理证书时,通过密码 SSH 本地转发访问回环初始化入口,并按照既有初始化说明核验临时证书指纹;完成正式证书配置后再启用严格校验的公开反代。 + +复核至少包括:实际监听地址、`nginx -t`、HTTP 跳转、管理域名 HTTPS 就绪检查、回环上游严格 TLS 检查以及独立外部连接无法访问内部端口。检查通过不代替首次初始化、证书签发、部署恢复及数据库生产矩阵验收。 diff --git a/doc/Linux生产流程测试记录.md b/doc/Linux生产流程测试记录.md index 6e652f2..32a1347 100644 --- a/doc/Linux生产流程测试记录.md +++ b/doc/Linux生产流程测试记录.md @@ -1188,3 +1188,18 @@ git diff --check - [ ] T7 最终生产门禁和上线结论。 总体验收位置仍为 **P0-03:完成,待复审**,本轮不得标记全量生产验收通过。 + +## 2026-10-01 反向代理端口收敛记录 + +本节补充当前部署要求,不覆盖历史记录。当前仅处理 Linux;本轮是保留数据的端口配置复核,不代表清库首次初始化验收。 + +- [x] 已完成,等待复审:两台服务器通过密码 SSH 核验,Scert 均仅监听 `127.0.0.1:8443`;没有 `0.0.0.0:8443` 或 `[::]:8443` 监听。 +- [x] 已完成,等待复审:Nginx 对外监听 `80/443`,两台服务器的 `nginx -t` 均通过;未修改邮件及其他既有站点。 +- [x] 已完成,等待复审:第二台管理入口 `odacm.cn` 的 HTTP 请求返回 301 并跳转 HTTPS,反代 `/readyz` 和回环上游 `/readyz` 均返回 200;上游启用 SNI 和证书校验。 +- [x] 已完成,等待复审:从第二台服务器按正常 DNS 访问管理域名,连接地址为 `45.136.13.241`,HTTPS 就绪检查返回 200;该结果不是独立外部客户端的完整生产验收。 +- [x] 已完成,等待复审:静态 systemd 模板已提交并推送 `48d10fe`;动态生成的 Linux unit 同步回环监听约束,并补充模板与生成器回归断言。 +- [x] 已完成,等待复审:本地后端 `go test ./...`、`go vet ./...` 和 `git diff --check` 通过;本机 Windows 测试不代替 Linux 专属用例执行。 +- [~] 进行中:使用干净提交构建 Linux 候选包,核对安装后的默认 unit 和动态生成配置,并补充 Linux 专属用例证据。 +- [!] 暂缓或存在阻塞:历史恢复事务、双服务器真实失败回滚与重试幂等、Smail SMTP、数据库生产矩阵、备份恢复及最终生产门禁仍未完成。 + +端口边界:不新增公网业务端口,不为内部 `8443` 添加防火墙或安全组放行规则。SSH 运维端口与其他已有服务不属于本次端口收敛的修改范围。总体验收保持 **P0-03:完成,待复审**,不新增全量验收通过结论。 diff --git a/doc/Scert整改任务执行清单.md b/doc/Scert整改任务执行清单.md index 910f58a..be824d6 100644 --- a/doc/Scert整改任务执行清单.md +++ b/doc/Scert整改任务执行清单.md @@ -1500,3 +1500,18 @@ P0-05 从 `[!]` 调整为 `[~]`,并未标记完成;P0-04 剩余门禁和全 - [ ] T7 最终生产门禁和上线结论。 总体验收位置仍为 **P0-03:完成,待复审**,本轮不得标记全量生产验收通过。 + +## 2026-10-01 反向代理端口收敛记录 + +本节补充当前部署要求,不覆盖历史记录。当前仅处理 Linux;本轮是保留数据的端口配置复核,不代表清库首次初始化验收。 + +- [x] 已完成,等待复审:两台服务器通过密码 SSH 核验,Scert 均仅监听 `127.0.0.1:8443`;没有 `0.0.0.0:8443` 或 `[::]:8443` 监听。 +- [x] 已完成,等待复审:Nginx 对外监听 `80/443`,两台服务器的 `nginx -t` 均通过;未修改邮件及其他既有站点。 +- [x] 已完成,等待复审:第二台管理入口 `odacm.cn` 的 HTTP 请求返回 301 并跳转 HTTPS,反代 `/readyz` 和回环上游 `/readyz` 均返回 200;上游启用 SNI 和证书校验。 +- [x] 已完成,等待复审:从第二台服务器按正常 DNS 访问管理域名,连接地址为 `45.136.13.241`,HTTPS 就绪检查返回 200;该结果不是独立外部客户端的完整生产验收。 +- [x] 已完成,等待复审:静态 systemd 模板已提交并推送 `48d10fe`;动态生成的 Linux unit 同步回环监听约束,并补充模板与生成器回归断言。 +- [x] 已完成,等待复审:本地后端 `go test ./...`、`go vet ./...` 和 `git diff --check` 通过;本机 Windows 测试不代替 Linux 专属用例执行。 +- [~] 进行中:使用干净提交构建 Linux 候选包,核对安装后的默认 unit 和动态生成配置,并补充 Linux 专属用例证据。 +- [!] 暂缓或存在阻塞:历史恢复事务、双服务器真实失败回滚与重试幂等、Smail SMTP、数据库生产矩阵、备份恢复及最终生产门禁仍未完成。 + +端口边界:不新增公网业务端口,不为内部 `8443` 添加防火墙或安全组放行规则。SSH 运维端口与其他已有服务不属于本次端口收敛的修改范围。总体验收保持 **P0-03:完成,待复审**,不新增全量验收通过结论。 diff --git a/doc/Scert整改合并优化清单.md b/doc/Scert整改合并优化清单.md index 78752a0..c952d79 100644 --- a/doc/Scert整改合并优化清单.md +++ b/doc/Scert整改合并优化清单.md @@ -2130,3 +2130,18 @@ P0-11 生产验收门禁 - [ ] T7 最终生产门禁和上线结论。 总体验收位置仍为 **P0-03:完成,待复审**,本轮不得标记全量生产验收通过。 + +## 2026-10-01 反向代理端口收敛记录 + +本节补充当前部署要求,不覆盖历史记录。当前仅处理 Linux;本轮是保留数据的端口配置复核,不代表清库首次初始化验收。 + +- [x] 已完成,等待复审:两台服务器通过密码 SSH 核验,Scert 均仅监听 `127.0.0.1:8443`;没有 `0.0.0.0:8443` 或 `[::]:8443` 监听。 +- [x] 已完成,等待复审:Nginx 对外监听 `80/443`,两台服务器的 `nginx -t` 均通过;未修改邮件及其他既有站点。 +- [x] 已完成,等待复审:第二台管理入口 `odacm.cn` 的 HTTP 请求返回 301 并跳转 HTTPS,反代 `/readyz` 和回环上游 `/readyz` 均返回 200;上游启用 SNI 和证书校验。 +- [x] 已完成,等待复审:从第二台服务器按正常 DNS 访问管理域名,连接地址为 `45.136.13.241`,HTTPS 就绪检查返回 200;该结果不是独立外部客户端的完整生产验收。 +- [x] 已完成,等待复审:静态 systemd 模板已提交并推送 `48d10fe`;动态生成的 Linux unit 同步回环监听约束,并补充模板与生成器回归断言。 +- [x] 已完成,等待复审:本地后端 `go test ./...`、`go vet ./...` 和 `git diff --check` 通过;本机 Windows 测试不代替 Linux 专属用例执行。 +- [~] 进行中:使用干净提交构建 Linux 候选包,核对安装后的默认 unit 和动态生成配置,并补充 Linux 专属用例证据。 +- [!] 暂缓或存在阻塞:历史恢复事务、双服务器真实失败回滚与重试幂等、Smail SMTP、数据库生产矩阵、备份恢复及最终生产门禁仍未完成。 + +端口边界:不新增公网业务端口,不为内部 `8443` 添加防火墙或安全组放行规则。SSH 运维端口与其他已有服务不属于本次端口收敛的修改范围。总体验收保持 **P0-03:完成,待复审**,不新增全量验收通过结论。