3. 安全需求分析:从威胁到安全需求的转化

上一章我们画出了威胁模型,手里攥着一堆攻击路径。但问题来了——这些威胁怎么变成真正的安全需求?

我见过不少团队,威胁分析报告写得厚厚一本,结果开发一看就懵了:「这玩意儿我该怎么改代码?」说白了,威胁是问题,需求才是解决方案。中间缺了一座桥。

这一章,我们就来搭这座桥。

3.1 从威胁到安全需求的转化方法

转化不是拍脑袋。我个人习惯用一套标准流程,把每个威胁拆解成可落地的需求条目。

3.1.1 威胁-需求映射矩阵

每个威胁至少对应一个安全目标。我常用的映射关系是这样的:

威胁类型 典型场景 安全目标 需求示例
欺骗 攻击者伪造身份 认证 所有API调用必须携带JWT令牌
篡改 中间人修改请求 完整性 传输层使用TLS 1.3,关键字段加签
抵赖 用户否认操作 不可否认性 所有写操作记录审计日志,包含时间戳和用户ID
信息泄露 数据库被拖库 机密性 存储层敏感字段使用AES-256加密
拒绝服务 流量攻击打垮服务 可用性 网关层配置限流,单IP每秒不超过100次请求
权限提升 普通用户越权访问 授权 每个接口校验用户角色,RBAC模型落地

嗯,这里要注意:一个威胁可能对应多个安全目标。比如「攻击者通过SQL注入拖库」,既涉及机密性(数据被拿走),也涉及完整性(数据被篡改)。

3.1.2 转化三步法

我在项目中总结了一套三步走的套路:

  1. 描述威胁:用一句话说清楚「谁、通过什么方式、攻击什么资产、造成什么后果」。
  2. 确定安全目标:从STRIDE或CIA三元组里选一个或多个目标。
  3. 写出需求:用「系统必须/应该/可以」的句式,写一条可验证的需求。

举个例子:

威胁描述:攻击者通过未授权接口调用,获取用户手机号。

安全目标:授权 + 机密性。

安全需求:系统必须对每个API请求进行身份验证和权限校验;用户手机号在数据库中必须使用AES-256加密存储。

3.2 安全需求分类:预防 / 检测 / 响应

需求写出来了,但怎么分类?我习惯按时间维度分——攻击发生前、攻击发生时、攻击发生后。

说白了就是:预防(别让它发生)、检测(发生了你得知道)、响应(知道了你得处理)。

3.2.1 预防类需求

这类需求最容易被接受,因为「防患于未然」的道理谁都懂。但代价也最高——你想想看,为了防一个概率极低的攻击,可能要多写几千行代码。

典型预防需求:

  • 输入校验:所有用户输入必须经过白名单过滤。
  • 身份认证:登录必须使用MFA。
  • 访问控制:基于RBAC的权限校验。
  • 加密:传输层和存储层加密。
  • 安全配置:服务器禁用不安全的TLS版本。

我的经验:预防类需求要优先落地,但别追求100%覆盖。我曾经在一个项目里花了两个月做全量输入校验,结果发现80%的攻击都来自三个核心接口。先守住关键路径,再慢慢补全。

3.2.2 检测类需求

预防不是万能的。你想想看,零日漏洞怎么防?内部人员作案怎么防?

检测类需求就是你的「第二道防线」。它的核心目标是:缩短攻击者的自由活动时间。

典型检测需求:

  • 日志记录:所有认证失败、权限异常、数据变更必须记录。
  • 告警规则:同一IP 5分钟内登录失败超过10次,触发告警。
  • 异常检测:用户行为偏离基线(比如凌晨3点批量导出数据),标记为可疑。
  • 完整性校验:关键配置文件定期计算哈希值,发现变化立即告警。

避坑指南:我曾经见过一个团队,日志写得比业务代码还多,一天产生几个TB的日志。结果呢?没人看。检测类需求一定要配套「可消费」的输出——要么是告警,要么是可视化报表。否则就是数据垃圾。

3.2.3 响应类需求

检测到攻击了,然后呢?

响应类需求定义了「发现安全事件后,系统该做什么」。这部分往往被忽略,但恰恰是决定损失大小的关键。

典型响应需求:

  • 自动阻断:检测到暴力破解,自动封禁源IP 30分钟。
  • 降级处理:认证服务不可用时,切换到备用认证方式。
  • 数据隔离:发现数据泄露,立即隔离受影响的数据分区。
  • 恢复流程:从备份恢复被篡改的数据,RTO不超过4小时。
  • 取证保留:安全事件发生后,保留所有相关日志,防止被覆盖。

3.3 需求优先级排序

需求列了一大堆,但资源有限。先做哪个?

我见过最蠢的做法是「按领导喜好排」——领导说加密重要,就全员搞加密;领导说日志重要,就全员写日志。结果呢?安全没做好,业务也耽误了。

3.3.1 排序维度

我个人习惯用两个维度来排:威胁等级和实施成本。

威胁等级 实施成本 优先级 行动建议
高 低 P0(立即做) 马上排入当前迭代
高 高 P1(尽快做) 拆解成多个子任务,逐步落地
低 低 P2(顺手做) 在开发其他功能时顺带完成
低 高 P3(暂缓做) 放入技术债务清单,定期评估

威胁等级怎么定?我一般用DREAD模型打分:

  • D(Damage):造成的损失有多大?
  • R(Reproducibility):复现难度高不高?
  • E(Exploitability):利用难度高不高?
  • A(Affected Users):影响多少用户?
  • D(Discoverability):发现难度高不高?

每个维度打1-3分,总分越高,威胁等级越高。

3.3.2 排序实操案例

拿一个真实项目举例。当时我们做的是一个电商平台,威胁分析后列了这些需求:

安全需求 威胁等级 实施成本 优先级
支付接口必须使用TLS 1.3 高(15分) 低(1人天) P0
用户密码必须加盐哈希存储 高(14分) 低(2人天) P0
全站API接入WAF 高(13分) 高(20人天) P1
后台操作日志审计 中(9分) 低(3人天) P2
用户头像上传做病毒扫描 低(5分) 高(15人天) P3

你看,P0的两个需求都是「高威胁+低成本」,必须马上做。P1的WAF虽然重要,但成本高,可以拆成两期做。P3的头像扫描,说实话,电商平台被通过头像上传攻击的概率极低,先放着。

3.4 本章知识体系

下面这张图把整个流程串起来了:

安全需求分析流程 威胁模型输入 STRIDE / 攻击树 威胁→需求转化 映射矩阵 + 转化三步法 安全需求分类 预防 / 检测 / 响应 需求优先级排序 威胁等级 × 实施成本 = 优先级 输出:安全需求列表(P0/P1/P2/P3) 可落地、可验证、可追溯 核心原则 每个安全需求必须对应一个具体威胁,每个威胁必须有一个可验证的需求

3.5 避坑总结

最后,分享几个我踩过的坑:

坑一:需求写得太抽象

「系统必须保证数据安全」——这种需求等于没写。安全需求必须可验证:用什么算法?密钥存哪里?谁来管理?

坑二:只做预防,不做检测和响应

我曾经有个项目,防火墙、WAF、加密全上了,结果内部员工拖库拖了一个月才发现。为什么?因为没有检测类需求。记住:预防不是100%可靠的。

坑三:优先级排序只看技术难度

「这个需求好做,先做这个」——这是典型的开发思维。安全需求排序必须看威胁等级。一个低威胁的需求再简单,也不该挤占高威胁需求的资源。