Files
pangolin/doc/05-web-security.html
T
wangjia 3ae96ef229 docs: 新增整体架构设计文档(doc/,HTML 七章)
覆盖前端五端/后端/MySQL/弹性节点拓扑/Web安全/安全总纲,遵循 design/ 设计系统视觉呈现。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 23:57:49 +08:00

161 lines
9.7 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>05 Web 安全与灾备 · 穿山甲架构设计</title>
<link rel="stylesheet" href="assets/style.css">
</head>
<body>
<header class="site-header"><div class="inner">
<a class="brand" href="index.html"><img src="assets/logo-mark.svg" alt="Pangolin"><span><span class="zh">穿山甲 · 架构设计</span><br><span class="en">Pangolin Architecture</span></span></a>
<nav class="site-nav">
<a href="index.html">总览</a>
<a href="01-frontend.html">01 前端</a>
<a href="02-backend.html">02 后端</a>
<a href="03-database.html">03 数据库</a>
<a href="04-infra.html">04 网络拓扑</a>
<a href="05-web-security.html" class="active">05 Web 安全</a>
<a href="06-security.html">06 安全总纲</a>
</nav>
<button class="theme-btn" id="themeBtn" title="切换深浅主题"><i data-lucide="moon"></i></button>
</div></header>
<main class="doc">
<div class="doc-hero">
<div class="overline">Chapter 05 · Web Security & DR</div>
<h1>Web 安全与灾备</h1>
<p class="lede">Web 面资产:官网(获客入口)、用户中心、API、公告/端点分发。威胁两类:常规 Web 攻击,以及本项目特有的<strong>域名被墙、源站被定位、服务节点被封</strong>。原则:一切可被秒级重建,一切入口皆有备份。</p>
</div>
<section id="assets">
<h2><span class="num">§1</span>资产与暴露面</h2>
<div class="tbl-wrap"><table>
<thead><tr><th>资产</th><th>形态</th><th>暴露面</th><th>被打击后果</th></tr></thead>
<tbody>
<tr><td>官网</td><td>Astro 纯静态</td><td>主域名 + 镜像域名</td><td>获客入口断(存量用户无感)</td></tr>
<tr><td>用户中心</td><td>Next.js 静态导出</td><td>同上</td><td>网页端兑换/订阅导入断(客户端内同功能仍可用)</td></tr>
<tr><td>API</td><td>Go 服务(CDN 后)</td><td>API 域名池</td><td>登录/兑换/目录刷新断(客户端缓存兜底)</td></tr>
<tr><td>公告与端点分发</td><td>签名静态 JSON</td><td>多镜像(CF Pages / GitHub / 对象存储)</td><td>失去应急广播能力——所以镜像最多、优先级最高</td></tr>
</tbody>
</table></div>
</section>
<section id="hardening">
<h2><span class="num">§2</span>常规 Web 安全基线</h2>
<ul>
<li><strong>CDN 前置(Cloudflare</strong>WAF + bot 管理 + 速率限制全开;源站只允许 CDN 回源网段 + 回源鉴权 header,直接命中源站 IP 一律拒绝。</li>
<li><strong>源站 IP 隐藏</strong>:源站从未以裸 IP 提供过服务(历史 DNS 记录是最常见泄露途径);出站请求(webhook 回调、广告回执校验)走独立出口,不暴露源站地址。</li>
<li><strong>TLS 1.3 全站</strong>、HSTS;静态站点 CSP 严格白名单;用户中心开启 SRI。</li>
<li><strong>账户安全</strong>:登录限流 + 失败锁定;用户中心支持 TOTP 2FA(设计稿既有功能);会话仅 HttpOnly + Secure cookie 或 header token。</li>
<li><strong>注入面</strong>:API 全参数化查询(03 章 schema 无拼接场景);上传/富文本一概没有,攻击面天然小。</li>
<li><strong>依赖与供应链</strong>:CI 里跑依赖审计;前端构建锁定版本;不引入第三方统计脚本(也符合隐私承诺)。</li>
</ul>
</section>
<section id="domains">
<h2><span class="num">§3</span>域名体系与解析兜底</h2>
<div class="tbl-wrap"><table>
<thead><tr><th>域名组</th><th>用途</th><th>策略</th></tr></thead>
<tbody>
<tr><td>主域名</td><td>官网 + 用户中心</td><td>品牌入口;被墙概率最高,做好牺牲准备</td></tr>
<tr><td>API 域名池(N≥3</td><td>客户端 API</td><td>与主域不同注册商、不同 WHOIS(隐私保护)、互不关联;客户端内置全部</td></tr>
<tr><td>订阅/分发域名</td><td>端点更新、公告 JSON</td><td>独立于以上两组——「取订阅」行为最容易被关联封锁,单独隔离</td></tr>
<tr><td>冷备域名池</td><td>未启用</td><td>常备 ≥5 个已注册未使用的域名,启用即配 CDN,随签名端点更新推给客户端</td></tr>
</tbody>
</table></div>
<ul>
<li>全部域名:隐私注册、加密货币付款、注册商分散;域名之间不共享 NS 特征化配置。</li>
<li>客户端解析优先 DoH(多提供方轮询),其次系统 DNS,最后 IP 直连兜底(01 章端点池)。</li>
<li><strong>被墙检测</strong>:域名级探针与节点探针同体系(04 章)——境内拨测 DNS 污染 + TCP 阻断,境外对照。确认被墙 → 从端点池降级 → 启用冷备域名 → 通过签名端点更新下发。</li>
</ul>
</section>
<section id="backup">
<h2><span class="num">§4</span>备份与可重建性(一切皆可秒建)</h2>
<div class="tbl-wrap"><table>
<thead><tr><th>资产</th><th>备份形态</th><th>重建路径</th><th>RTO</th></tr></thead>
<tbody>
<tr><td>官网 / 用户中心</td><td>git 仓库即备份(纯静态)</td><td>CI 一键部署到任意新域名/新平台(CF Pages、对象存储+CDN</td><td>< 30min</td></tr>
<tr><td>API 服务</td><td>容器镜像 + IaCTerraform/Ansible 全量定义)</td><td>新机拉镜像 + 配置注入,接回 DB</td><td>< 2h</td></tr>
<tr><td>MySQL</td><td>每日全量 + binlog 增量,age 加密异地(03 章 §5)</td><td>新实例还原 + 回放</td><td>≤ 4hRPO ≤ 15min</td></tr>
<tr><td>节点</td><td>无需备份(无状态,04 章)</td><td>cloud-init 自动重建</td><td>35min/台</td></tr>
<tr><td>密钥类</td><td>JWT 私钥 / 内部 CA / 签名私钥 / 备份解密钥:离线密管,两地保存</td><td></td><td></td></tr>
</tbody>
</table></div>
<div class="callout"><b>演练制度</b>每月一次「假装全没了」演练:从干净环境凭 git + IaC + 备份把官网、API、DB 全链路拉起来并跑通注册→兑换→连接,记录实际 RTO。没演练过的备份等于没有备份。</div>
</section>
<section id="runbook">
<h2><span class="num">§5</span>被封 / 被打击应对 Runbook</h2>
<div class="tbl-wrap"><table>
<thead><tr><th>场景</th><th>检测</th><th>应对动作</th><th>目标恢复</th></tr></thead>
<tbody>
<tr>
<td><strong>API 域名被墙</strong></td>
<td>域名探针:境内 DNS 污染/TCP 阻断,境外正常</td>
<td>① 客户端自动故障转移到池内下一域名(无人工动作)② 启用一个冷备域名补池 ③ 签名端点更新下发新池</td>
<td>用户无感;池恢复 < 1d</td>
</tr>
<tr>
<td><strong>主域名(官网)被墙</strong></td>
<td>同上</td>
<td>① 镜像域名顶上(官网常备 ≥2 个活跃镜像)② TG 频道 + 客户端公告位广播新地址 ③ 评估是否换主品牌域名</td>
<td>获客入口 < 1d</td>
</tr>
<tr>
<td><strong>入口节点大面积被封</strong></td>
<td>04 章判封体系 + 熔断触发</td>
<td>① 自动:存量好节点承载 + 客户端目录刷新 ② 人工:判断封锁模式(IP 段?协议特征?SNI?)③ 对症换厂商/换区域/换伪装参数后批量重建</td>
<td>核心连接 < 4h</td>
</tr>
<tr>
<td><strong>源站 IP 暴露 / 被攻击</strong></td>
<td>源站直连流量告警、异常负载</td>
<td>① 立即换源站 IP(IaC 重建)② 复查泄露途径(DNS 历史、出站请求、证书透明度日志)③ 轮换回源鉴权</td>
<td>< 2h</td>
</tr>
<tr>
<td><strong>CDN 账号风险</strong>(封号/要求实名)</td>
<td>账号通知 / 服务异常</td>
<td>① 备好第二 CDN 账号与配置导出,DNS 切换 ② 极端情况:API 走多域名直连源站集群(牺牲部分防护换可用性)</td>
<td>< 1d</td>
</tr>
<tr>
<td><strong>发卡店/收款通道失效</strong></td>
<td>webhook 静默 / 渠道通知</td>
<td>① 切换备用发卡店(激活码体系与渠道解耦,codes.channel 隔离)② 客户端「兑换/购买」页指向新渠道(远程配置,无需发版)</td>
<td>< 1d</td>
</tr>
<tr>
<td><strong>DB 损坏 / 控制面全灭</strong></td>
<td>监控全红</td>
<td>走 §4 重建路径;期间客户端靠缓存目录 + 已下发凭证维持已有用户连接(数据面独立存活)</td>
<td>≤ 4h,存量连接不断</td>
</tr>
</tbody>
</table></div>
<h3>应急广播体系(所有场景的公共依赖)</h3>
<ul>
<li><strong>TG 频道</strong>:运营匿名号维护,安装包/官网/客户端「联系我们」均长期展示频道地址。</li>
<li><strong>客户端公告位</strong>:读多镜像签名 JSON(Ed25519 验签防伪造),可推送新域名、新下载地址、事件说明。</li>
<li><strong>下载分发冗余</strong>:安装包同时发布于官网、GitHub Releases、网盘镜像、TG 频道——官网被墙不影响获取更新。</li>
</ul>
</section>
</main>
<nav class="pager">
<a href="04-infra.html"><span>上一章</span><b>← 04 机器与网络拓扑</b></a>
<a class="next" href="06-security.html"><span>下一章</span><b>06 安全总纲 →</b></a>
</nav>
<footer class="colophon">穿山甲 · Pangolin — 内部架构设计文档 · 遵循 design/ 设计系统 · 2026-06</footer>
<script src="https://unpkg.com/lucide@latest/dist/umd/lucide.min.js"></script>
<script src="assets/doc.js"></script>
</body>
</html>