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分钟
3.4 安全需求文档怎么写?
好,到了最实操的部分——怎么写安全需求文档。我个人的经验是,文档要清晰、可追踪、可验证。
3.4.1 文档结构
我习惯用这个结构:
- 背景与范围:这个系统做什么,安全目标是什么
- 安全需求列表:每条需求有唯一编号、描述、优先级、来源
- 合规要求映射:每条需求对应哪个法规条款
- 验收标准:怎么验证这条需求实现了
- 风险与假设:当前未覆盖的风险,以及前提条件
3.4.2 需求描述模板
每条安全需求,我建议用这个模板写:
| 字段 | 说明 | 示例 |
|---|---|---|
| 需求编号 | 唯一标识 | SEC-REQ-001 |
| 需求描述 | 一句话说清楚 | 所有API接口必须进行身份认证 |
| 优先级 | 高/中/低 | 高 |
| 来源 | 业务/合规/经验 | 等保2.0三级要求 |
| 验收标准 | 怎么验证 | 未认证请求返回401,且有日志记录 |
3.4.3 避坑指南
我曾经犯过一个错误——把安全需求写得像技术方案。比如“使用JWT进行认证”,这其实是设计决策,不是需求。需求应该是“系统必须能验证用户身份”,至于用JWT还是OAuth,那是后面的事。
还有一点,安全需求文档要跟功能需求文档同步更新。我见过太多项目,功能需求改了十版,安全需求还是第一版,最后对不上,出了大问题。
1. 我们要保护什么?(资产识别)
2. 我们要防谁?(威胁建模)
3. 我们要做到什么程度?(合规与风险接受度)
这三个问题想清楚了,文档自然就好写了。
好,这一章就到这里。下一章我们聊聊安全设计,那才是真正开始“动手”的阶段。