Chapter 05 · Web Security & DR

Web 安全与灾备

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

§1资产与暴露面

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

§2常规 Web 安全基线

§3域名体系与解析兜底

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

§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,存量连接不断

应急广播体系(所有场景的公共依赖)