概念
"左移":把安全工作提前到软件开发生命周期(SDLC)的早期阶段。
在流程图上,开发流程通常从左(需求、设计、编码)到右(测试、部署、运维)——"左移"就是把安全活动往左边挪。
核心思想:在开发早期发现并修复问题,成本远低于在生产环境中修复。
为什么
修复成本随阶段递增(这是软件工程中被反复验证的经验):
- 设计阶段:改一个架构决策,成本低;
- 编码阶段:改几行代码;
- 测试阶段:要修改、重新测试、可能要回归;
- 生产阶段:紧急修复、可能的停机、数据泄露损失、声誉损失、合规罚款。
安全问题的代价尤其陡峭——因为生产环境的安全漏洞可能直接造成损失(数据泄露、勒索、服务中断),而不只是"功能不好用"。
左移的具体实践
一、需求与设计阶段:威胁建模(Threat Modeling)
在写代码之前,先想清楚:可能受到什么攻击?
常用方法:
- STRIDE:Spoofing(假冒)、Tampering(篡改)、Repudiation(否认)、Information Disclosure(信息泄露)、Denial of Service(拒绝服务)、Elevation of Privilege(权限提升);
- 数据流图(DFD)+ 信任边界:画出数据如何在系统中流动,在边界处识别威胁;
- 攻击树(Attack Tree):系统地列举达成某个攻击目标的路径。
产出:安全需求、需要防护的点、风险接受决策。
这是最"左"的活动,也是性价比最高的之一。
二、编码阶段
1. 安全编码规范与培训
针对不同语言的安全编码指南(如 OWASP 的 Secure Coding Practices)。
2. IDE 插件
在开发环境中实时提示安全问题(如硬编码密钥、已知的不安全函数)。
3. 安全的代码库和框架
使用默认安全的框架(如自动转义的模板引擎)——让安全的做法成为最容易的做法。
4. 密钥检测(Secret Scanning)
在提交前检测代码中是否包含密钥、令牌(如 git-secrets、Gitleaks、detect-secrets)。
三、代码提交与评审
1. 代码评审(Code Review)中的安全关注
在 PR 评审时关注:
- 是否有输入验证;
- 是否有授权检查(前文提到过的 IDOR);
- 是否使用了参数化查询;
- 是否引入了新的危险依赖。
2. pre-commit hooks
提交前自动运行 lint、格式化、密钥扫描。
四、CI 阶段(最重要的自动化层)
1. SAST(静态应用安全测试)
在不运行代码的情况下分析源代码,找出潜在漏洞模式(如 SQL 注入、XSS、路径穿越)。
优点:早、快、覆盖全量代码。
缺点:误报率高,需要调优。
2. SCA(软件成分分析)
扫描依赖中的已知漏洞(CVE)和许可证问题。
3. 容器镜像扫描
4. 基础设施即代码(IaC)扫描
检查 Terraform、Kubernetes YAML 等配置中的安全问题(如公开的存储桶、过宽的安全组规则)。
5. 单元测试中的安全用例
如前文提到的,为越权访问编写测试。
五、测试与预发布
DAST(动态应用安全测试):对运行中的应用做黑盒扫描。误报率低于 SAST,但覆盖有限。
IAST(交互式应用安全测试):结合运行时插桩,精度高。
模糊测试(Fuzzing):向程序输入大量随机或半随机的输入,寻找崩溃和异常。
六、部署与运行("右"的部分依然重要)
左移不意味着放弃运行时的安全:
- 运行时防护(WAF、RASP);
- 监控与告警;
- 事件响应。
关键成功因素
一、不要只是"加门禁"
如果在 CI 中加入一堆安全扫描,产生大量失败的构建和噪音,开发团队会:
- 绕过它;
- 或者要求放宽规则;
- 或者干脆忽略结果。
结果:工具在,但没用。
二、降低噪音,提高信噪比
- 先只启用误报率低的规则;
- 对存量问题设置基线,只关注新增;
- 提供清晰的修复指导(而不只是"这里有漏洞")。
三、让开发者能自己修复
工具应该:
- 集成在开发者熟悉的环境(IDE、PR 评论);
- 给出具体的修复建议和代码示例;
- 快速反馈(几分钟内,而不是几小时后)。
四、安全团队的定位转变
从"守门员"(在最后审批)转变为"赋能者"(提供工具、模板、培训、咨询)。
这在规模化的组织中尤其关键——安全团队不可能审查所有的代码变更。
一句话
安全的目的是让产品更安全,而不是让流程更严格。
左移成功的标志,是开发团队主动使用这些工具,而不是被迫应付检查。
说明:本文为安全工程的知识整理。