安全实战地图:资产、威胁与攻防边界
很多安全项目之所以“做了很久却没变安全”,根因不是工具不够,而是缺少一套统一的实战语境:我们到底要保护什么(资产与数据),要防谁(威胁与能力),边界在哪里(信任边界与攻击面),以及用什么尺度衡量“值不值得先做”(风险与业务影响)。如果没有这套地图,团队就会在漏洞公告、甲方检查、应急事件之间被动漂移:今天修一个高危 CVE,明天关一个端口,后天又补一条 WAF 规则——看似忙碌,实则难以形成可复用的治理闭环。
本章的目标是把“点修漏洞”提升为“体系化治理”的第一块基石:建立可复用的资产—威胁—边界—风险框架,并落地到可执行的清单与队列。你可以把本章产出当成后续所有章节(渗透、检测、响应、加固、合规、DevSecOps)的共同输入:不管你在做红队还是蓝队,只要这张地图是对的,讨论就会更少争吵、更少拍脑袋、更多基于证据的优先级。
> 纸书版“实战清单”页码索引(占位):资产清单模板见 Pxxx;攻击面清单模板见 Pxxx;优先级处置队列模板见 Pxxx。 > 电子版模板下载(占位):[资产清单模板](https://download.example.com/sec/assets.xlsx)、[攻击面清单模板](https://download.example.com/sec/attack-surface.xlsx)、[处置队列模板](https://download.example.com/sec/backlog.xlsx)[^tpl]。
<!--tag:安全目标--> <!--tag:资产盘点--> <!--tag:信任边界--> <!--tag:攻击面--> <!--tag:威胁建模--> <!--tag:风险评估--> <!--tag:治理闭环-->
1.1 安全目标不是“CIA”三个字:把可用性与业务连续性放进同一张表
经典的 CIA(三性)是起点,不是终点:
- **机密性(Confidentiality)**:数据不被未授权访问或泄露。
- **完整性(Integrity)**:数据与系统状态不被未授权篡改。
- **可用性(Availability)**:服务在需要时可用、性能满足业务预期。
在工程实践中,你必须把“可用性”扩展到业务连续性(BC)与灾难恢复(DR),否则很容易出现两类误判:
1. 把“短时不可用”当成可接受,但对交易链路/生产系统来说可能是致命(例如制造业产线 MES 停 30 分钟就是实损)。 2. 把“安全加固导致的降级/误封”当成小事,最终安全团队反而成为可用性的风险源头。
建议把安全目标落到可量化指标上,形成能对齐业务的共同语言:
- **RTO(Recovery Time Objective)**:允许中断多久必须恢复。
- **RPO(Recovery Point Objective)**:允许丢失多少数据(时间窗口)。
将 CIA 与 RTO/RPO 合并在资产维度做“目标声明”,示例表格如下(可直接复用到资产清单中):
| 资产/服务 | 机密性目标 | 完整性目标 | 可用性目标 | RTO | RPO | 业务说明 | |---|---|---|---|---:|---:|---| | 核心交易 API | P1(高度敏感) | P0(不可篡改) | 99.95% | 30min | 5min | 直接营收 | | 内部门户 | P2 | P2 | 99.5% | 4h | 24h | 员工协作 | | 日志检索平台 | P1 | P1 | 99.0% | 8h | 1h | 安全运营 |
这里的关键不是“填表”,而是把业务承诺与技术控制绑定:例如某资产 RTO=30min,那么备份、容灾、灰度、限流、DDoS 防护、应急流程必须匹配;否则你只是“写了目标”。
1.2 资产与数据分级:从“我有多少服务器”到“我有哪些必须守住的东西”
<!--tag:资产清单-->
资产盘点常见失败模式是:只盘点了计算资源(IP、服务器、容器),却没盘点“业务对象”(租户、订单、会员、工单)、“权限对象”(账号、令牌、密钥)、“数据对象”(表、桶、日志、备份)。攻击者真正想要的往往是后者。
1.2.1 资产的四层模型:服务、运行载体、身份与数据
建议用四层模型梳理资产(后续威胁建模与攻击面分析会直接复用):
1. 业务服务层(Service):对外/对内提供的业务能力(API、Web、App、批处理、消息队列消费者)。 2. 运行载体层(Compute/Runtime):VM、物理机、容器、K8s、函数、托管数据库、SaaS。 3. 身份与权限层(Identity):人(员工、外包)、机(服务账号)、令牌(AK/SK、OAuth、JWT)、证书、密钥。 4. 数据层(Data):数据库表、对象存储桶、日志、备份、数据仓库、第三方数据同步。
一个经验判断:如果你的清单里没有“密钥/证书/服务账号”,那你还没真正开始做资产治理。
1.2.2 数据分级的可操作版本:用“可识别性×影响”定义等级
很多组织的数据分级停留在口号(“重要/一般/敏感”),无法驱动控制措施。建议把分级做成两步:
- **可识别性(Identifiability)**:是否能识别个人/客户/设备/业务主体(直接或间接)。
- **影响(Impact)**:泄露/篡改/不可用会造成多大损失(合规罚款、营收损失、声誉、供应链)。
可用一个简单矩阵定义等级(示例):
| 等级 | 定义(示例) | 常见数据 | |---|---|---| | P0 极敏感 | 直接导致重大合规/资金损失 | 支付凭证、私钥、密钥种子、身份证号+姓名全量 | | P1 高敏感 | 可识别个人或核心商业秘密 | 手机号、邮箱、客户合同、核心算法参数 | | P2 中敏感 | 组合后可能产生影响 | 内部工单、部分行为日志、脱敏后的标识符 | | P3 低敏感 | 公开或泄露影响可控 | 公告内容、公开接口文档 |
把分级绑定控制措施(最少要做到“默认闭合”):
- P0:强制加密(静态+传输)、双人审批访问、密钥托管、最小权限、全量审计、严禁落地到开发机。
- P1:传输加密、访问审批或基于角色控制、审计与异常告警、脱敏展示。
- P2:按需授权、日志审计、定期抽查。
- P3:基本访问控制即可。
> 实操提醒:分级不是一次性工作。你需要在数据流转路径上打标:采集→传输→存储→处理→共享→归档/销毁。否则“库里是 P0,导出到 Excel 就变成没人管的 P0”。
1.3 信任边界与攻击面:从“哪里有漏洞”到“哪里可以被打”
<!--tag:信任边界--> <!--tag:攻击面-->
攻击面(Attack Surface)不是“所有端口与所有 URL 的集合”,而是“跨越信任边界的入口”。信任边界的定义必须能回答三件事:
1. 谁可以访问谁(身份、网络、设备态势)。 2. 访问时能做什么(权限范围、可调用的功能)。 3. 访问行为是否可见(日志、追踪、告警)。
1.3.1 常见信任边界类型(工程化视角)
- **公网边界**:Internet → DMZ/WAF/Ingress → Web/API。
- **办公网边界**:员工终端 → VPN/零信任网关 → 内网系统。
- **云账户边界**:一个云账号/订阅 → 另一个云账号/订阅(含跨账号角色)。
- **集群边界**:K8s 集群内命名空间、网络策略、服务网格策略。
- **数据边界**:应用 → 数据库/缓存/对象存储;生产 → 备份/数仓。
- **第三方边界**:支付、短信、物流、客服、CDN、SaaS。
1.3.2 用一张图把边界画出来:攻击路径通常沿边界“折线推进”
```mermaid flowchart LR I[互联网攻击者] -->|HTTP/HTTPS| W[边界入口: WAF/Ingress] W --> A[Web/API 服务区] A -->|SQL/Cache| D[(核心数据库)] A -->|调用| MQ[(消息队列)] A -->|访问令牌| IAM[身份系统/权限中心] O[办公网终端] -->|VPN/零信任| IN[内网管理区] IN --> A A --> S3[(对象存储/文件桶)] Third[第三方服务] -->|Webhook/回调| A ```
读图方法:每一条跨区连线都是潜在攻击面。攻击者常见策略是:先拿公网入口,再横向到应用区,然后利用身份/凭证/配置错误进入数据区,最后在备份与对象存储处“打包带走”。
1.3.3 攻击面清单的最小集合:入口、协议、身份、可达性、暴露面
工程上建议把攻击面做成表格而不是散乱笔记,字段至少包含:
- **入口标识**:域名/IP/URL/队列 Topic/回调地址/管理端口。
- **暴露范围**:公网/办公网/VPN/第三方/仅集群内。
- **认证方式**:无认证、Basic、Cookie、JWT、mTLS、AK/SK、IP 白名单等。
- **权限与敏感操作**:是否涉及资金、用户数据导出、配置变更、脚本执行。
- **可观测性**:是否有访问日志、审计日志、TraceID、告警策略。
- **变更频率**:变更越快越需要自动化检测(CI/CD、配置漂移)。
后文的“中型企业示例”会给出一份可执行模板,并产出优先级处置队列。
1.4 威胁建模:STRIDE 做结构,ATT&CK 做战术落地
<!--tag:STRIDE--> <!--tag:ATT&CK-->
威胁建模的价值是:在漏洞出现之前,先把“会怎么被打”想清楚,从而把投入放在最有效的控制点上。本书采用“STRIDE + ATT&CK 映射”的组合:
- **STRIDE** 适合做系统化覆盖,确保没有漏掉威胁类型。
- **MITRE ATT&CK** 适合对齐真实对手的战术技术(TTP),指导检测与响应。
1.4.1 STRIDE 快速回顾(面向工程实践)
| STRIDE | 威胁含义 | 常见例子(工程) | |---|---|---| | S Spoofing | 身份伪造 | 盗用 Cookie/JWT、伪造回调签名、冒用服务账号 | | T Tampering | 篡改 | 参数篡改、订单金额篡改、供应链包被替换 | | R Repudiation | 抵赖 | 无审计日志导致无法追责,或日志可被删除/改写 | | I Information Disclosure | 信息泄露 | 越权读、对象存储桶公开、日志泄露密钥 | | D Denial of Service | 拒绝服务 | 大流量、慢请求、队列堆积、资源耗尽 | | E Elevation of Privilege | 权限提升 | SSRF 打内网、RCE 提权、横向移动拿域控 |
1.4.2 从 STRIDE 到 ATT&CK:把“类别”落到“打法”
一个可复用的映射思路:
- S(身份伪造)常对应:凭证访问、会话劫持、OAuth 配置误用、钓鱼获取凭证。
- T(篡改)常对应:供应链投毒、CI/CD 凭证滥用、配置管理权限被拿。
- I(泄露)常对应:云存储错误配置、权限过大导致横向读取、日志/监控系统暴露。
- E(提权)常对应:利用应用漏洞(RCE/SSRF/反序列化)、滥用云角色、域环境提权。
在模型输出上,你不需要写满 ATT&CK 的编号,但至少要落到“可检测/可缓解的控制点”。例如对“第三方回调伪造”(S):
- 预防:回调签名(HMAC)、时间窗与 nonce、防重放、IP 段校验(谨慎使用)。
- 检测:签名校验失败率突增、同一订单多次回调、来源 ASN 异常。
- 响应:冻结受影响订单、拉黑来源、回滚回调配置、重置密钥。
1.4.3 威胁建模的流程化产出:输入—分析—输出—验证
```mermaid graph TD A[输入: 资产清单/边界图/数据分级] --> B[分解: 关键数据流与入口] B --> C[威胁枚举: STRIDE] C --> D[映射: ATT&CK/历史事件] D --> E[风险评分: 可能性×影响] E --> F[输出: 控制点/检测点/处置队列] F --> G[验证: 演练/红队/渗透/回归测试] G --> A ```
最后一步“验证”非常关键:没有验证的建模只是文档工程。验证可以是一次桌面推演,也可以是一次针对关键入口的最小化渗透测试。
1.5 风险评估:用“可能性×影响”做决策,而不是用“漏洞分数”做决策
<!--tag:风险评估-->
漏洞分数(如 CVSS)只能描述“漏洞本身”,不能描述“你是否会出事”。风险要结合你的资产、暴露面、对手与补救成本。最实用的起点是二维模型:
$$Risk = Likelihood \times Impact$$
1.5.1 可能性(Likelihood):暴露、可利用性、对手动机、控制强度
建议把可能性拆成 4 个可打分维度(1~5 分):
1. 暴露程度:公网最高,内网/仅集群内较低。 2. 可利用性:是否有成熟利用链、是否需要高权限、是否有已知 PoC。 3. 对手动机与价值:资产是否高价值(钱、数据、横向跳板)。 4. 现有控制强度:WAF、鉴权、速率限制、审计、隔离是否到位。
1.5.2 影响(Impact):不仅是数据泄露,还包括业务中断与恢复成本
影响至少包含:
- **直接损失**:退款、赔付、停机损失、产线停摆。
- **间接损失**:品牌、客户流失、监管处罚、诉讼。
- **恢复成本**:应急人力、加班、取证、重建。
可以把影响分为 1~5 并用示例锚定(组织内部要统一口径):
| 分值 | 影响锚定(示例) | |---:|---| | 5 | 核心业务长时间中断/大量敏感数据泄露/重大合规风险 | | 4 | 关键业务受影响/敏感数据局部泄露/需要对外通报 | | 3 | 部分功能不可用/内部数据泄露/可控范围内处理 | | 2 | 小范围异常/无敏感数据/无需对外 | | 1 | 影响可忽略/仅测试或非生产 |
1.5.3 风险优先级:用“处置队列”替代“漏洞列表”
把风险评估的输出变成工程队列(Backlog),每条包含“要做什么、为什么、谁负责、做到什么算完成”。建议字段:
- 问题描述(面向风险,不是面向漏洞)
- 影响资产/数据等级
- 攻击路径(跨越了哪些边界)
- 可能性、影响、总分
- 处置方案(短期缓解/长期治理)
- 验收标准(可测试/可观测)
- Owner 与截止时间
后面示例会给出模板与样例。
1.6 从“点修漏洞”到“体系化治理”:控制点、检测点、恢复点三位一体
治理的核心是把风险收敛到三个可工程化的点:
1. 控制点(Prevent):降低可能性,例如强鉴权、网络隔离、最小权限、配置基线。 2. 检测点(Detect):降低平均发现时间(MTTD),例如日志、告警、溯源链路。 3. 恢复点(Recover):降低平均恢复时间(MTTR),例如快照、备份演练、熔断降级、预案。
很多团队只做了控制点:修补、加固、上线 WAF;一旦绕过,就“全黑”。反过来,仅做检测点也不够:你发现了攻击,却没有可执行的处置路径。三者必须成体系,才能把一次事件的经验沉淀为组织能力。
1.7 中型企业示例:从零到一产出资产清单、攻击面清单与处置队列
<!--tag:案例--> <!--tag:资产清单模板--> <!--tag:攻击面模板--> <!--tag:处置队列-->
下面用一个“中型企业”场景贯穿演示。假设企业“海岳制造”具有如下特征:
- 员工约 1200 人,研发约 120 人,信息化团队 20 人。
- 业务系统:官网、经销商门户、MES 产线系统、ERP、售后工单、数据看板。
- 基础设施:混合云(自建机房 + 公有云),部分系统上 K8s。
- 安全现状:有防火墙/WAF、杀软、堡垒机;缺统一资产台账,账号权限历史包袱大。
1.7.1 第一步:资产清单(最小可用版本)
资产清单不追求一次完整,而是追求“先能驱动决策”。建议先覆盖“高价值+高暴露”的 20% 资产。
资产清单模板(核心字段)
| 字段 | 说明 | 示例 | |---|---|---| | AssetID | 唯一标识 | APP-TRADE-API-001 | | 资产名称 | 系统/服务名 | 经销商下单 API | | 负责人 | 业务 Owner + 技术 Owner | 张三/李四 | | 环境 | 生产/预发/测试 | 生产 | | 暴露范围 | 公网/办公网/VPN/内网 | 公网 | | 入口 | 域名/URL/端口 | api.dealer.example.com:443 | | 技术栈 | 语言/框架/运行时 | Java/Spring/K8s | | 数据等级 | P0~P3 | P1 | | CIA 目标 | 机密/完整/可用 | P1/P0/99.95% | | RTO/RPO | 连续性指标 | 30min/5min | | 依赖 | DB/MQ/第三方 | MySQL、Kafka、支付回调 | | 日志与审计 | 有无、存储位置 | Nginx+APM+审计 | | 变更频率 | 发布/配置变更 | 每周 3 次 |
样例条目(节选)
| AssetID | 名称 | 暴露范围 | 数据等级 | 入口 | 关键依赖 | 日志 | |---|---|---|---|---|---|---| | WEB-OFFICAL-001 | 官网 | 公网 | P3 | www.example.com | CDN | 访问日志 | | APP-DEALER-001 | 经销商门户 | 公网 | P1 | dealer.example.com | SSO、订单 DB | 应用日志+审计 | | SYS-MES-001 | MES | 内网/VPN | P1 | mes.intra:8443 | 产线 DB | 部分 | | DATA-BI-001 | 数据看板 | 办公网 | P2 | bi.intra | 数仓 | 访问日志 |
> 关键落点:清单里必须明确“入口”和“数据等级”。没有入口就无法谈攻击面,没有数据等级就无法谈影响。
1.7.2 第二步:画出信任边界与关键数据流(选 1~2 个关键系统)
以“经销商门户”为例,关键数据流包括:登录(SSO)、下单、支付回调、订单查询、导出报表。我们把跨边界的流标出来:
- Internet → WAF/Ingress →