3、安全需求分析:安全需求来源、隐私合规需求、功能安全需求、安全需求文档编写

好,咱们进入第三个环节——安全需求分析。

说实话,很多团队做安全,上来就撸代码、上扫描工具,结果漏洞一堆。为什么?因为需求阶段就没想清楚。我个人的经验是,安全需求分析做得好,后面至少省一半的返工时间。

3.1 安全需求从哪里来?

安全需求不是拍脑袋想出来的。它有几个明确的来源,我一个个说。

3.1.1 业务场景驱动

每个业务场景都有它的安全痛点。比如你做的是一个支付系统,那资金安全、交易防篡改就是刚需。我做过的项目中,有个电商平台一开始只关注功能,结果上线第一天就被薅羊毛,损失惨重。嗯,这就是典型的业务安全需求没分析到位。

3.1.2 合规与法律要求

这个现在越来越重要。GDPR、个人信息保护法、等保2.0……你不满足,轻则罚款,重则下架。我个人习惯,在项目启动时就让法务或合规团队介入,把红线画清楚。

3.1.3 历史漏洞与威胁情报

你想想看,同行业出过什么漏洞?自家之前踩过什么坑?这些都是宝贵的安全需求来源。我曾经整理过一份“公司历史漏洞TOP10”,每次新项目都对照着看,效果非常好。

3.1.4 安全架构师的经验判断

说白了,就是凭经验。比如做微服务,我一看架构图就知道哪些地方容易出问题——服务间通信没加密、鉴权中心单点故障……这些经验需要时间积累,但可以复用。

核心观点:安全需求不是“加”上去的,而是“挖”出来的。挖得越深,后面越稳。

3.2 隐私合规需求

隐私合规,现在是个大话题。我把它拆成几个关键点来讲。

3.2.1 数据分类分级

你得先知道手里有哪些数据,哪些是敏感数据。我个人习惯用这个表格来梳理:

数据类别 示例 保护等级 合规要求
个人身份信息 姓名、身份证号 加密存储、访问控制
联系方式 手机号、邮箱 脱敏展示、授权使用
行为数据 浏览记录、点击流 匿名化处理
生物特征 指纹、人脸 极高 本地处理、不可逆加密

3.2.2 最小化原则

只收集你真正需要的数据。我在项目中遇到过,产品经理非要收集用户的位置信息,结果功能根本用不上。这就是典型的过度收集,既增加风险,又违反合规。

3.2.3 用户权利保障

用户有权知道他的数据被怎么用了,有权删除、有权导出。这些功能必须在需求阶段就设计进去,不然后面补,成本高得吓人。

小技巧:做隐私合规需求时,可以画一张“数据流向图”,标清楚数据从哪里来、存哪里、谁在用、怎么销毁。这张图能帮你发现很多隐藏问题。

3.3 功能安全需求

功能安全,说白了就是“系统在正常和异常情况下都能安全运行”。这和网络安全不太一样,但同样重要。

3.3.1 输入验证与输出编码

这是最基础的功能安全需求。所有用户输入都可能是恶意的,所有输出都可能被利用。我见过一个系统,因为没做输入验证,被SQL注入搞垮了整个数据库。嗯,血的教训。

// 一个简单的输入验证示例(伪代码)
function validateInput(input) {
    // 1. 检查长度
    if (input.length > 100) return false;
    // 2. 检查字符集
    if (!/^[a-zA-Z0-9_]+$/.test(input)) return false;
    // 3. 转义特殊字符
    return sanitize(input);
}

3.3.2 状态管理与异常处理

系统不能因为一个异常就崩溃,也不能因为一个错误就泄露敏感信息。我曾经处理过一个案例,系统报错时直接把数据库连接字符串打印出来了——这要是被攻击者看到,后果不堪设想。

3.3.3 会话与认证安全

会话超时、密码策略、多因素认证……这些都属于功能安全需求。我建议在需求文档里明确写出:

  • 会话空闲超时时间:15分钟
  • 密码最小长度:12位,包含大小写字母、数字、特殊字符
  • 登录失败锁定:连续5次失败,锁定30分钟
注意:功能安全需求不能只写“要安全”,要写具体、可验证。比如“密码必须加密存储”就不够,要写成“密码使用bcrypt算法,cost factor设为12”。

3.4 安全需求文档怎么写?

好,到了最实操的部分——怎么写安全需求文档。我个人的经验是,文档要清晰、可追踪、可验证。

3.4.1 文档结构

我习惯用这个结构:

  1. 背景与范围:这个系统做什么,安全目标是什么
  2. 安全需求列表:每条需求有唯一编号、描述、优先级、来源
  3. 合规要求映射:每条需求对应哪个法规条款
  4. 验收标准:怎么验证这条需求实现了
  5. 风险与假设:当前未覆盖的风险,以及前提条件

3.4.2 需求描述模板

每条安全需求,我建议用这个模板写:

字段 说明 示例
需求编号 唯一标识 SEC-REQ-001
需求描述 一句话说清楚 所有API接口必须进行身份认证
优先级 高/中/低
来源 业务/合规/经验 等保2.0三级要求
验收标准 怎么验证 未认证请求返回401,且有日志记录

3.4.3 避坑指南

我曾经犯过一个错误——把安全需求写得像技术方案。比如“使用JWT进行认证”,这其实是设计决策,不是需求。需求应该是“系统必须能验证用户身份”,至于用JWT还是OAuth,那是后面的事。

还有一点,安全需求文档要跟功能需求文档同步更新。我见过太多项目,功能需求改了十版,安全需求还是第一版,最后对不上,出了大问题。

总结一下:安全需求分析,说白了就是回答三个问题——
1. 我们要保护什么?(资产识别)
2. 我们要防谁?(威胁建模)
3. 我们要做到什么程度?(合规与风险接受度)
这三个问题想清楚了,文档自然就好写了。

好,这一章就到这里。下一章我们聊聊安全设计,那才是真正开始“动手”的阶段。