3ae96ef229
覆盖前端五端/后端/MySQL/弹性节点拓扑/Web安全/安全总纲,遵循 design/ 设计系统视觉呈现。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
161 lines
9.7 KiB
HTML
161 lines
9.7 KiB
HTML
<!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>容器镜像 + IaC(Terraform/Ansible 全量定义)</td><td>新机拉镜像 + 配置注入,接回 DB</td><td>< 2h</td></tr>
|
||
<tr><td>MySQL</td><td>每日全量 + binlog 增量,age 加密异地(03 章 §5)</td><td>新实例还原 + 回放</td><td>≤ 4h(RPO ≤ 15min)</td></tr>
|
||
<tr><td>节点</td><td>无需备份(无状态,04 章)</td><td>cloud-init 自动重建</td><td>3–5min/台</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>
|