Scert/doc/阿里云部分域名授权验收记录.md

7.4 KiB
Raw Permalink Blame History

阿里云部分域名授权验收记录

验收日期:2026 年 9 月 15 日。以下时间为北京时间,程序报告的 checked_at 使用 UTC。

一、需求与任务清单

  • [✓] 区分服务器已有域名、RAM 当前权限和用户允许修改的范围,不能互相替代。
  • [✓] 47.108.78.12 是 Scert 管理端;8.137.23.95 仅作为证书推送目标,不在目标机部署管理端。
  • [✓] 不调用全局 DescribeDomains,只检查明确的候选域名。
  • [✓] pcux.cn 及其子域名不得修改 DNS、证书、私钥或相关服务配置。本次只查询托管区读取权限。
  • [✓] 对允许写入检查的候选域名,使用随机专用 TXT 记录验证新增与精确删除;不操作业务记录。
  • [✓] 识别云端实际返回的 Forbidden.RAM,补齐中文诊断和回归测试。
  • [✓] 增加 CLI 只读检查和显式确认后的写入检查入口,不依赖完成 Web 初始化。
  • [✓] 自动化验证任意 SAN 权限拒绝时,在创建签发器、DNS 挑战 Provider 和推送之前停止。
  • [!] 真实未授权写入拒绝和 Web 全流程尚未验收,不能用单元测试或只读拒绝替代。

二、目标服务器入口盘点

来自 8.137.23.95 的运行中服务、监听端口和 Nginx 生效配置只读检查。

业务 域名 后端 Nginx 证书路径 边界
FRPS 原生面板 a.salg.cn 127.0.0.1:7500 /etc/ssl/salg.cn/fullchain.crt 与下列两项共用证书
FRPS 多用户面板 b.salg.cn 127.0.0.1:7200 /etc/ssl/salg.cn/fullchain.crt 共用证书
FRPS 泛域名代理 *.salg.cn 127.0.0.1:8001 /etc/ssl/salg.cn/fullchain.crt 共用证书
Gitea git.pcux.cn 127.0.0.1:3000 /ssl/pcux.cn/fullchain.pem 禁止修改
Xmail Web xuans.vcer.cn 127.0.0.1:3001 /etc/ssl/vcer.cn/fullchain.crt 邮件协议证书消费者需另行核实

这些入口共用 Nginx 进程。以上只证明配置对应关系,不是公网 HTTPS、SNI 或生产重载验收。目标机还有 MySQL、SSH、RustDesk 相关进程及端口转发,不能凭监听端口推断其域名或证书关系。

三、真实 RAM 结果

使用管理机现有加密凭据存储中的阿里云配置。密钥未打印、未写入本记录或提交。

候选托管区 实测时间 定向读取 临时 TXT 新增及删除 结论
salg.cn 18:59、19:08 成功 均成功 本轮证明可读、可新增及删除专用 TXT
vcer.cn 18:59、19:08 成功 均成功 本轮证明可读、可新增及删除专用 TXT
solit.cn 19:00 未单独检查 均成功 本轮证明可新增及删除专用 TXT
odacm.cn 19:00 未单独检查 均成功 本轮证明可新增及删除专用 TXT
apmmk.cn 19:00 未单独检查 均成功 本轮证明可新增及删除专用 TXT
ifmj.uno 19:00 未单独检查 均成功 本轮证明可新增及删除专用 TXT
vraq.uno 19:00 未单独检查 均成功 本轮证明可新增及删除专用 TXT
pcux.cn 19:04、19:08 HTTP 403,Forbidden.RAM 禁止执行,未测试 当前 RAM 拒绝该读取操作,同时用户明确禁止修改

证据解释

  1. pcux.cn 首次只读查询返回 Forbidden.RAM,请求 ID 为 01A0A4BD-FFB7-5DE8-AA81C-C25AB0ABC348。随后用新增的 Scert 原生 CLI 再次复现。
  2. 不把读取失败推导成所有 Action 均不可执行;严格结论是 DescribeDomainRecords 被拒绝。没有尝试该域名的写入,也没有要求扩大权限。
  3. 另外七个域名的报告均为 writable=true、cleanup=true、verified=true。cleanup=true 表示删除 API 返回成功,不代表本轮额外完成了权威 DNS 缓存消失验证。
  4. 当前允许范围内的七个候选都通过,不能凭“只授权部分域名”猜测其中某一个应被拒绝。完整账号列表和完整 RAM 策略没有被枚举。
  5. 结果是检查时刻的能力证据,不是永久授权。读取、新增、更新、删除等权限必须分开理解。

四、代码变更与使用方式

只读检查

scert dns inspect --domain example.com --config /scert/conf/scert.json
  • 只调用指定托管区的 DescribeDomainRecords,单页一条,不输出业务记录内容。
  • 不逐级检查父域,不调用全局发现,不执行新增、更新、删除。
  • 读取成功时退出码为零,但 verified=false;报告明确表示未验证写入和清理权限。
  • 云端拒绝或网络失败退出非零。网络失败不得被解释为已确认权限拒绝。

明确授权后的临时写入检查

scert dns check --domain example.com --confirm-dns-write --config /scert/conf/scert.json
  • 未提供 --confirm-dns-write 时,在读取凭据和发起云端调用之前拒绝。
  • 复用项目原有 AliyunAuthorizationChecker.Verify,不使用成功缓存冒充实时证明。
  • 原有检查器可能针对子域逐级尝试父托管区;实际验收本轮只传入已明确允许检查的根域。
  • 不启动应用、续期任务、通知服务或业务数据库,不改写初始化状态,也不申请或部署证书。
  • 主密钥或密文存储文件缺失时拒绝,不通过自动生成新主密钥掩盖凭据损坏。

新增与修改文件:

  • backend/internal/cli/dns.go
  • backend/internal/cli/dns_test.go
  • backend/internal/cli/root.go
  • backend/internal/dnsprovider/aliyun_authorization.go
  • backend/internal/dnsprovider/aliyun_authorization_test.go
  • backend/internal/certificate/authorization_test.go
  • backend/internal/app/certificate_authorization_test.go

五、构建与验证

以下命令本轮执行通过:

go test -p 1 -count=1 -timeout=3m ./...
go test -race -p 1 -count=1 -timeout=3m ./internal/cli ./internal/dnsprovider ./internal/certificate ./internal/app ./internal/httpapi
go vet -p=1 ./...

Linux amd64 独立 CLI 构建并上传到管理机,上传后 SHA256 与本地一致:

  • /scert/scert-permission-20260915:672d8201b1730f1448fdad82d9ded5be1276313c5bb60fbb2bd8b66945da7e41
  • /scert/scert-permission-readonly-20260915:7cb3a38e8629737e8f66b405046f1abdacc638d6e4541b18718bfcdd0a5952c9

没有替换运行中的 /scert/scert 主程序,没有重启管理服务,也没有将以上 CLI 上传至推送目标机。

六、验收结论与未完成项

本轮已证明:针对明确候选,系统可以区分读取拒绝、仅可读,以及经专用 TXT 实际证明的新增和删除能力。真实识别出的受限候选是 pcux.cn,禁止修改边界得到保留。

以下不能标记完成:

  • 真实写入拒绝的签发阻断和完整 Web 页面验收;本轮对此只有自动化回归证据。
  • 管理服务仍为 active,但 /readyz 返回 setup_incomplete,不是生产就绪。
  • 运行中 Web 服务尚未升级到本轮新增 CLI 和诊断代码。
  • 授权缓存存在十分钟有效期,撤权即时性及已有效证书直接推送的授权边界仍需专项验证。
  • 现有域名新增前置检查在凭据读取错误等情况下存在跳过分支,仍需单独复审失败关闭行为。
  • 真实 ACME 获取证书、隔离 SSH/SFTP 推送回滚及生产 TLS/SNI 验收尚未由本轮完成。

本轮未清空业务数据库、未删除用户文件、未改 RAM 策略、未改生产证书、未重载目标机服务。不能据此宣布整个项目通过生产验收。