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 频道——官网被墙不影响获取更新。