防御体系总览:威胁模型、攻击面与安全基线
很多安全体系之所以“看起来很完整、用起来很无力”,根本原因不是缺少工具,而是缺少一套可复用的防御方法论:把业务目标翻译成资产与风险,把系统结构翻译成攻击面与信任边界,把“可能发生的攻击”翻译成可验证的控制项与度量指标。换句话说,防御不是堆产品,而是工程化地回答三个问题:我们要保护什么(资产)、谁在以什么方式伤害它(威胁)、我们如何持续证明自己在变好(基线与指标)。
本章给出全书的“总览框架”:先用业务为中心梳理资产、数据流与信任边界,再用 STRIDE/LINDDUN、Kill Chain、MITRE ATT&CK 将威胁具体化,最后产出一份能落地的最小可行安全基线(Minimum Viable Security Baseline, MVSB)与路线图,并配套可度量指标(覆盖率、MTTD/MTTR、误报率等)。你可以把它当作后续各章的“索引”:每一条控制项、每一种检测告警、每一次应急演练,都能在这里找到它在整体防御体系中的位置。
---
1. 防御体系的工程视角:从“感觉安全”到“可证明的安全”
<!-- tags: defense-methodology, security-engineering -->
1.1 安全的目标:不追求零风险,而追求可控风险
安全不是把风险降到零(做不到),而是把风险控制在业务可承受范围内。对中级读者而言,最关键的转变是:从“漏洞清单”转向“风险闭环”。一个完整闭环通常包括:
- **识别(Identify)**:资产、数据、边界、依赖、攻击面。
- **保护(Protect)**:基线、最小权限、分层防御、加密、加固。
- **检测(Detect)**:可观测性、日志、告警、关联分析。
- **响应(Respond)**:分级处置、遏制、取证、复盘。
- **恢复(Recover)**:回滚/重建、凭据轮换、控制项加固。
> 经验法则:在资源有限时,优先把“识别—保护—检测”做成闭环;响应与恢复则通过演练逐步成熟。没有检测能力的保护,最终会沦为“祈祷式安全”。
1.2 三层对象:业务资产、系统组件、运营过程
工程化建模时,把对象分成三层能显著降低复杂度:
1. 业务资产层:订单、账户余额、用户隐私、商业机密、可用性(SLA)。 2. 系统组件层:Web、API、数据库、缓存、消息队列、对象存储、CI/CD、监控平台。 3. 运营过程层:发布、运维、权限审批、应急响应、供应链管理。
很多真实事故的根因不在代码本身,而在运营过程:凭据泄漏、过度权限、发布绕过审核、监控缺失导致长期潜伏等。因此本书的“防御体系”会把工程控制 + 运营控制一起纳入基线。
---
2. 以业务为中心梳理资产、数据流与信任边界
<!-- tags: asset-inventory, dfd, trust-boundary -->
2.1 资产清单:把“系统有什么”变成“要保护什么”
资产清单不要只列服务器与域名,而要面向风险建模。建议最少包含四类字段:
- **资产标识**:名称、Owner、环境(Prod/Stage/Dev)、位置(云账号/VPC/机房)。
- **暴露面**:公网/内网、入口协议、依赖(第三方 API、消息通道)。
- **数据属性**:数据类型、敏感级别、保留周期、合规要求。
- **业务影响**:泄露/篡改/不可用对业务的损失(可用等级或粗略金额)。
清单 1-1(纸书检查用):数据分级建议(最小版) 1. S0 公开:官网内容、公开文档。 2. S1 内部:非公开但不敏感(内部流程、非生产配置)。 3. S2 敏感:用户标识符、订单明细、业务报表、访问日志(可能含个人信息)。 4. S3 严重敏感:认证凭据、密钥、支付信息、身份证件、可直接导致资金损失的数据。
电子版可以把它做成可下载表格(例如 Excel/Notion 模板),便于跨团队协作;Markdown 版则建议保持结构化表格,便于后续自动统计覆盖率(例如“已分级资产占比”)。
2.2 数据流图(DFD):用图把“攻击面”画出来
威胁建模最怕凭空想象,DFD 能强制你回答:数据从哪里来、到哪里去、经过哪些处理、跨越哪些边界。实践中,建议从“一个典型业务请求”切入:例如“用户登录—下单—查询订单—后台导出报表”。
下面给出一个典型 Web + API + 数据库 系统的 DFD(可作为本书后续案例的统一底图)。
```mermaid flowchart LR %% 外部实体 U[外部用户\nBrowser/Mobile] -->|HTTPS| WAF[WAF/CDN] A[运营/管理员] -->|VPN/SSO| ADM[管理后台]
%% 信任边界:互联网 subgraph TB1[信任边界:Internet] WAF --> WEB[Web Frontend\nNginx/SSR] WAF --> APIGW[API Gateway] end
%% 信任边界:应用区 subgraph TB2[信任边界:App Zone] WEB -->|JWT/Cookie| AUTH[Auth Service] APIGW --> SVC1[Business API\nOrder/User] SVC1 --> CACHE[(Redis)] SVC1 --> MQ[(Message Queue)] SVC1 --> OBJ[(Object Storage)] ADM --> SVC1 AUTH --> SVC1 end
%% 信任边界:数据区 subgraph TB3[信任边界:Data Zone] SVC1 --> DB[(RDBMS)] SVC1 --> DW[(Analytics/Warehouse)] end
%% 观测与运营 subgraph TB4[信任边界:Ops/Observability] WEB --> LOG[Log Agent] SVC1 --> LOG APIGW --> LOG LOG --> SIEM[SIEM/Log Platform] SIEM --> SOAR[Alerting/On-call] end
%% 第三方 SVC1 -->|HTTPS| PAY[Third-party Payment] ```
如何用这张图直接得到攻击面:
- 任何**跨信任边界的箭头**,都是潜在的攻击路径(输入注入、权限绕过、重放、边界穿透)。
- 任何**共享组件**(API Gateway、Redis、MQ、对象存储、日志平台)都是“放大器”:一旦被滥用,影响面会横向扩散。
- 任何**高权限入口**(管理后台、CI/CD、云控制面)都值得单独建模:攻击者往往不从最难的地方打穿,而是从运营链路“抄近路”。
2.3 信任边界:安全设计里最值得反复推敲的线
信任边界(Trust Boundary)是“默认不信任”成立的位置。常见边界包括:
- **互联网边界**:浏览器/移动端到 WAF/CDN/Ingress。
- **身份边界**:匿名到登录态;普通用户到管理员;服务间身份(mTLS/JWT/OIDC)。
- **网络边界**:VPC、子网、Security Group、K8s NetworkPolicy。
- **数据边界**:应用区到数据区;热数据到归档;生产到分析/数仓。
- **运营边界**:研发到生产;自动化流水线到云控制面。
> 设计原则:边界不是画出来就安全了,必须有“可执行的控制”来守边界,例如强身份、最小权限、显式授权、可审计日志、速率限制与异常检测。
---
3. 把威胁具体化:STRIDE、LINDDUN、Kill Chain 与 ATT&CK 的分工
<!-- tags: threat-modeling, stride, linddun, mitre-attack -->
3.1 STRIDE:面向安全属性的系统化枚举
STRIDE 适合在 DFD 上逐元素分析(外部实体、进程、数据存储、数据流),对应六类威胁:
- **S(Spoofing)身份伪造**:会话劫持、伪造服务身份、盗用 API Token。
- **T(Tampering)篡改**:请求参数/消息体篡改、配置篡改、供应链篡改。
- **R(Repudiation)抵赖**:缺少不可抵赖日志,导致事后无法追责与复盘。
- **I(Information Disclosure)信息泄露**:越权读取、日志泄露、对象存储暴露。
- **D(Denial of Service)拒绝服务**:资源耗尽、请求洪泛、依赖雪崩。
- **E(Elevation of Privilege)权限提升**:从普通用户到管理员,从应用到云控制面。
用法建议:STRIDE 不要求你一次性想完所有威胁,而是要求你把威胁写成“可验证的陈述”:
- 错误示例:可能被攻击。
- 正确示例:**若 API Gateway 未对服务间调用进行身份校验,则攻击者一旦获得内网访问能力,可伪造服务身份调用 `Order` 管理接口导出全量订单数据**(对应 S/E/I)。
3.2 LINDDUN:面向隐私与数据合规的威胁建模
如果系统涉及个人信息(几乎都涉及),只做 STRIDE 还不够。LINDDUN 更关注“数据主体”的风险:
- **Linkability 可关联性**:多处标识符可拼接还原用户画像。
- **Identifiability 可识别性**:去标识化不足,仍可还原身份。
- **Non-repudiation 不可否认性(隐私语境)**:过度留存导致“无法否认”用户行为。
- **Detectability 可探测性**:能否探测到某用户是否存在/是否使用某服务。
- **Disclosure of information 信息泄露**:与 STRIDE 的 I 类似,但更聚焦个人信息。
- **Unawareness 不知情**:用户对收集、用途、共享不透明。
- **Non-compliance 不合规**:超范围收集、超期保存、跨境传输缺少依据。
实务中,你可以把 LINDDUN 作为 STRIDE 的“补集”:凡是数据分级为 S2/S3 的流与存储,都至少过一遍 LINDDUN。
3.3 Kill Chain:把攻击拆成阶段,便于布控“断点”
Kill Chain(或其变体)适合回答:“攻击者从进入到得手,中间要跨过哪些阶段?”典型阶段包括侦察、武器化、投递、利用、安装、命令控制(C2)、达成目标。对防守方的价值在于:你不一定能在第一步挡住,但可以在中途制造多个可检测、可拦截的断点。
例子(面向本章案例系统):
- 侦察:枚举接口、探测登录/注册行为差异。
- 投递/利用:利用输入验证缺陷或弱鉴权获取初始访问(Initial Access)。
- 横向移动:从 Web/API 触达内部服务、缓存、消息队列。
- 达成目标:导出订单/用户信息,或篡改支付回调,或破坏可用性。
3.4 MITRE ATT&CK:把“威胁描述”映射到“已知技战术”
ATT&CK 更像一本“对手作战字典”。它能帮助你:
- 用一致的语言描述事件与检测(跨团队对齐)。
- 把告警、日志字段、检测规则映射到技战术,避免“只报现象不报行为链”。
实操建议:
- 在威胁模型输出中,为关键攻击路径标注对应 ATT&CK 战术(Tactic)与技术(Technique)类别即可,不必在本章穷举编号。
- 后续章节(日志、检测、应急)再逐步把这些映射落到规则与剧本。
---
4. 从威胁到“可执行基线”:控制项、责任边界与度量指标
<!-- tags: security-baseline, metrics, mttd, mttr -->
4.1 安全基线的定义:最小但必须、可审计、可自动化
安全基线不是“最佳实践大礼包”,而是你在当前成熟度与资源下能承诺做到的最低安全标准。一条可用的基线通常满足:
- **可执行**:能落实到配置/代码/流程,不是口号。
- **可验证**:能通过审计、扫描、测试或日志证明。
- **可持续**:能自动化或流程化,避免靠人记忆。
- **可追责**:明确 Owner 与例外机制(Exception)。
> 实务建议:把基线拆成“必须(MUST)/应该(SHOULD)/可选(MAY)”,并在纸书版用编号清单对照检查;电子版则附带可复制模板与链接;Markdown 版保留结构化字段,方便统计覆盖率。
4.2 三个最核心的度量指标:覆盖率、MTTD/MTTR、误报率
度量不是为了好看,而是为了做决策(投资源、调优先级、评估改进)。本书建议最少建立以下指标闭环:
4.2.1 覆盖率(Coverage):控制项有没有“落到面上”
覆盖率不是“装了多少产品”,而是“关键对象是否被控制”。示例口径:
- **鉴权覆盖率**:需要登录的 API 中,启用强鉴权与权限校验的比例。
- **加密覆盖率**:S2/S3 数据存储中启用静态加密(at rest)的比例;跨边界传输启用 TLS 的比例。
- **日志覆盖率**:关键安全事件(登录、权限变更、导出、支付回调)是否都有结构化日志且进入 SIEM。
可用一个简单公式表达:
$$Coverage = \frac{\text{已满足控制项的对象数}}{\text{应满足控制项的对象数}} \times 100\%$$
4.2.2 MTTD/MTTR:检测与恢复速度
- **MTTD(Mean Time To Detect)平均检测时间**:从事件发生到被检测到的平均耗时。
- **MTTR(Mean Time To Recover/Respond)平均恢复/响应时间**:从检测到事件关闭(遏制或恢复完成)的平均耗时。
常见计算方式:
$$MTTD=\frac{1}{N}\sum_{i=1}^{N}(t^{(i)}_{detect}-t^{(i)}_{start})$$
$$MTTR=\frac{1}{N}\sum_{i=1}^{N}(t^{(i)}_{close}-t^{(i)}_{detect})$$
注意点:很多团队没有“start”的准确时间,可以用“最早可观测时间”(first seen)替代,并在复盘中逐步改进时间戳质量。
4.2.3 误报率(False Positive Rate):告警是否可运营
误报率高会导致值班疲劳,最终把检测体系拖垮。最简口径:
$$FPR=\frac{\text{误报告警数}}{\text{总告警数}} \times 100\%$$
同时建议引入“可行动告警比例”(Actionable Rate):告警是否包含足够上下文(谁、何时、哪里、做了什么、影响是什么、建议处置是什么)。
---
5. 实战案例:为典型 Web+API+数据库系统做一次可交付的威胁建模
<!-- tags: practical, dfd, attack-paths, mvsb -->
本节用前面的 DFD 做一次“从图到清单”的完整走通。目标交付物有三类: 1. 可复用的 DFD 与边界划分(已给出,可在团队内迭代)。 2. 关键攻击路径(入口、横向、提权、外流)。 3. 最小可行安全基线(MVSB)清单 + 落地路线图。
5.1 第一步:明确资产与数据的“皇冠明珠”
皇冠明珠(Crown Jewels)是攻击者最想要、最能造成业务损失的资产。对本系统而言,通常包括:
- **账户与权限体系**:用户凭据、会话、管理员权限、服务间凭据。
- **交易与订单数据**:订单明细、支付状态、退款信息。
- **个人信息**:手机号、邮箱、地址、设备标识、行为日志(可拼接画像)。
- **运营能力**:管理后台导出、批量操作、配置开关。
- **云与发布链路**:镜像仓库、CI/CD Token、云 API Key、K8s 管理凭据。
把这些标注到 DFD 的节点上,你就能立刻看出:哪些数据流必须加密、哪些接口必须强鉴权、哪些操作必须审计与双人复核。
5.2 第二步:按 STRIDE 做“最少但关键”的威胁枚举
这里不追求穷尽,而追求覆盖关键边界与关键能力点。下面给一个可直接复用的输出格式(Markdown 表格适合机器二次处理;纸书可按编号对照;电子版可做成可筛选表格)。
表 1-1:威胁条目模板(建议最少字段)
| 编号 | DFD 元素/数据流 | 威胁(STRIDE/LINDDUN) | 攻击前置条件 | 影响(机密性/完整性/可用性/合规) | 现有控制 | 缺口与建议控制 | 验证方式 | |---|---|---|---|---|---|---|---| | TM-001 | Internet→APIGW | S/E:伪造身份、越权 | 令牌校验弱/权限粒度粗 | I:批量读取订单;E:访问管理接口 | OAuth/JWT(弱配置) | 强制 OIDC 校验、细粒度 RBAC、敏感操作二次验证 | 单元/集成测试 + 审计日志检查 | | TM-002 | SVC1→OBJ | I:对象存储泄露 | 桶策略过宽/签名 URL 过期长 | I:文件与导出数据外流 | 基础 ACL | 最小权限 IAM、短 TTL 签名 URL、下载审计 | 配置审计 + 日志告警 | | TM-003 | ADM→SVC1 | R:抵赖 | 缺少管理员操作审计 | 合规与追责失败 | 部分日志 | 全量管理员审计、不可变更存储、告警联动 | 演练与抽查 | | TM-004 | 日志→SIEM | LINDDUN:可识别性 | 日志含敏感字段 | 合规风险、二次泄露 | 无脱敏 | 日志脱敏、字段白名单、访问控制 | 采样检查 |
> 电子版提示:把“验证方式”链接到自动化脚本/仪表盘(例如配置审计结果、日志覆盖率看板)。Markdown 版保留字段,有利于后续自动生成“风险热力图”。
5.3 第三步:识别关键攻击路径(入口→横向→提权→外流)
关键攻击路径不是“某个漏洞”,而是一条可实现目标的链路。下面给出四条最常见、也最值得优先防护的路径类型(描述保持防御视角,不提供可滥用的操作细节)。
路径 A:入口(Initial Access)—从公网到应用能力
典型入口包括:
- Web/API 的鉴权缺陷(会话管理薄弱、权限校验遗漏、令牌滥用)。
- 业务接口被滥用(短信/邮件验证码风控不足导致账号接管风险)。
- 管理后台暴露