Chapter 05 · Web Security & DR

# Web 安全与灾备

Web 面资产：官网（获客入口）、用户中心、API、公告/端点分发。威胁两类：常规 Web 攻击，以及本项目特有的域名被墙、源站被定位、服务节点被封。原则：一切可被秒级重建，一切入口皆有备份。

## §1资产与暴露面

资产 | 形态 | 暴露面 | 被打击后果
--- | --- | --- | ---
官网 | Astro 纯静态 | 主域名 + 镜像域名 | 获客入口断（存量用户无感）
用户中心 | Next.js 静态导出 | 同上 | 网页端兑换/订阅导入断（客户端内同功能仍可用）
API | Go 服务（CDN 后） | API 域名池 | 登录/兑换/目录刷新断（客户端缓存兜底）
公告与端点分发 | 签名静态 JSON | 多镜像（CF Pages / GitHub / 对象存储） | 失去应急广播能力——所以镜像最多、优先级最高

## §2常规 Web 安全基线

- CDN 前置（Cloudflare）：WAF + bot 管理 + 速率限制全开；源站只允许 CDN 回源网段 + 回源鉴权 header，直接命中源站 IP 一律拒绝。
- 源站 IP 隐藏：源站从未以裸 IP 提供过服务（历史 DNS 记录是最常见泄露途径）；出站请求（webhook 回调、广告回执校验）走独立出口，不暴露源站地址。
- TLS 1.3 全站、HSTS；静态站点 CSP 严格白名单；用户中心开启 SRI。
- 账户安全：登录限流 + 失败锁定；用户中心支持 TOTP 2FA（设计稿既有功能）；会话仅 HttpOnly + Secure cookie 或 header token。
- 注入面：API 全参数化查询（03 章 schema 无拼接场景）；上传/富文本一概没有，攻击面天然小。
- 依赖与供应链：CI 里跑依赖审计；前端构建锁定版本；不引入第三方统计脚本（也符合隐私承诺）。

## §3域名体系与解析兜底

域名组 | 用途 | 策略
--- | --- | ---
主域名 | 官网 + 用户中心 | 品牌入口；被墙概率最高，做好牺牲准备
API 域名池（N≥3） | 客户端 API | 与主域不同注册商、不同 WHOIS（隐私保护）、互不关联；客户端内置全部
订阅/分发域名 | 端点更新、公告 JSON | 独立于以上两组——「取订阅」行为最容易被关联封锁，单独隔离
冷备域名池 | 未启用 | 常备 ≥5 个已注册未使用的域名，启用即配 CDN，随签名端点更新推给客户端

- 全部域名：隐私注册、加密货币付款、注册商分散；域名之间不共享 NS 特征化配置。
- 客户端解析优先 DoH（多提供方轮询），其次系统 DNS，最后 IP 直连兜底（01 章端点池）。
- 被墙检测:域名级探针与节点探针同体系(04 章)——境内拨测 DNS 污染 + TCP 阻断，境外对照。确认被墙 → 从端点池降级 → 启用冷备域名 → 通过签名端点更新下发。

## §4备份与可重建性（一切皆可秒建）

资产 | 备份形态 | 重建路径 | RTO
--- | --- | --- | ---
官网 / 用户中心 | git 仓库即备份（纯静态） | CI 一键部署到任意新域名/新平台（CF Pages、对象存储+CDN） | < 30min
API 服务 | 容器镜像 + IaC（Terraform/Ansible 全量定义） | 新机拉镜像 + 配置注入，接回 DB | < 2h
MySQL | 每日全量 + binlog 增量，age 加密异地（03 章 §5） | 新实例还原 + 回放 | ≤ 4h（RPO ≤ 15min）
节点 | 无需备份（无状态，04 章） | cloud-init 自动重建 | 3–5min/台
密钥类 | JWT 私钥 / 内部 CA / 签名私钥 / 备份解密钥：离线密管，两地保存 | — | —

演练制度每月一次「假装全没了」演练：从干净环境凭 git + IaC + 备份把官网、API、DB 全链路拉起来并跑通注册→兑换→连接，记录实际 RTO。没演练过的备份等于没有备份。

## §5被封 / 被打击应对 Runbook

场景 | 检测 | 应对动作 | 目标恢复
--- | --- | --- | ---
API 域名被墙 | 域名探针：境内 DNS 污染/TCP 阻断，境外正常 | ① 客户端自动故障转移到池内下一域名（无人工动作）② 启用一个冷备域名补池 ③ 签名端点更新下发新池 | 用户无感；池恢复 < 1d
主域名（官网）被墙 | 同上 | ① 镜像域名顶上（官网常备 ≥2 个活跃镜像）② TG 频道 + 客户端公告位广播新地址 ③ 评估是否换主品牌域名 | 获客入口 < 1d
入口节点大面积被封 | 04 章判封体系 + 熔断触发 | ① 自动：存量好节点承载 + 客户端目录刷新 ② 人工：判断封锁模式（IP 段？协议特征？SNI？）③ 对症换厂商/换区域/换伪装参数后批量重建 | 核心连接 < 4h
源站 IP 暴露 / 被攻击 | 源站直连流量告警、异常负载 | ① 立即换源站 IP（IaC 重建）② 复查泄露途径（DNS 历史、出站请求、证书透明度日志）③ 轮换回源鉴权 | < 2h
CDN 账号风险（封号/要求实名） | 账号通知 / 服务异常 | ① 备好第二 CDN 账号与配置导出，DNS 切换 ② 极端情况：API 走多域名直连源站集群（牺牲部分防护换可用性） | < 1d
发卡店/收款通道失效 | webhook 静默 / 渠道通知 | ① 切换备用发卡店（激活码体系与渠道解耦，codes.channel 隔离）② 客户端「兑换/购买」页指向新渠道（远程配置，无需发版） | < 1d
DB 损坏 / 控制面全灭 | 监控全红 | 走 §4 重建路径；期间客户端靠缓存目录 + 已下发凭证维持已有用户连接（数据面独立存活） | ≤ 4h，存量连接不断

### 应急广播体系（所有场景的公共依赖）

- TG 频道：运营匿名号维护，安装包/官网/客户端「联系我们」均长期展示频道地址。
- 客户端公告位：读多镜像签名 JSON（Ed25519 验签防伪造），可推送新域名、新下载地址、事件说明。
- 下载分发冗余：安装包同时发布于官网、GitHub Releases、网盘镜像、TG 频道——官网被墙不影响获取更新。