🔐 安全开发生命周期 (SDL) 解析
Source: Dev.to
什么是安全开发生命周期(SDL)?
安全开发生命周期(SDL)是一种结构化的方法,将安全性嵌入软件开发的每个阶段,而不是在结束时才补上。
核心理念: 通过设计实现安全软件,而不是偶然实现。SDL 确保安全风险在早期被识别、持续降低,并在发布前得到验证。
阶段
| 阶段 | 目标 | 关键问题 |
|---|---|---|
| 规划 | 定义安全期望 | 会出现什么问题? |
| 设计 | 安全架构 | 我们如何防止滥用? |
| 开发 | 编写安全代码 | 我们的编码是否安全? |
| 测试 | 查找弱点 | 我们遗漏了什么? |
| 发布 | 安全交付 | 部署是否安全? |
| 维护 | 保持安全 | 有哪些变化或破坏? |
实际 DevOps 示例
场景
你正在构建面向客户的 Web 应用:
- 前端: React
- 后端: Java API
- CI/CD: GitHub Actions
- 云平台: AWS
活动
- 识别敏感数据(PII、凭证)
- 定义合规需求
- 决定安全标准
示例: 应用存储用户邮箱和密码
决策
- ✅ 必须对密码进行哈希处理
- ✅ 强制使用 TLS
- ✅ 不在 GitHub 仓库中存放密钥
识别的风险: 凭证泄露
缓解措施: 使用密钥管理器 + 哈希
威胁建模与安全架构
活动
- 威胁建模
- 安全架构设计
- 定义信任边界
示例: API 公开暴露,数据库位于私有子网,使用基于 JWT 的认证
识别的威胁: 通过未认证请求滥用 API
缓解措施: 使用 OAuth2 + 限流 + API Gateway
安全编码标准
活动
- 依赖管理
- 静态代码分析
示例: 开发者提交 Java 代码;GitHub Action 运行 SAST 和依赖漏洞扫描
- name: Run security scan
run: mvn verify
不良实践
String query = "SELECT * FROM users WHERE id=" + userId;
安全实践
PreparedStatement stmt = connection.prepareStatement(
"SELECT * FROM users WHERE id = ?"
);
动态测试
活动
- DAST
- 渗透测试
- 模糊测试
示例: 应用部署到预发布环境;自动扫描器检测到:
- 漏洞: 搜索端点的 XSS
- 严重程度: 高
在投产前已应用 修复。
安全签署与基础设施加固
活动
- 密钥验证
- CI/CD 检查硬编码密钥、开放的安全组、缺失 HTTPS
发布被阻止,直至问题解决。
持续维护
活动
- 修补依赖
- 监控日志
- 事件响应
示例: 某库出现新 CVE;GitHub Dependabot 提交 PR;在数小时内合并修补。
好处
| 好处 | 影响 |
|---|---|
| 减少泄露事件 | 🟢 |
| 降低修复成本 | 🔵 |
| 提升合规性 | 🟠 |
| 防止临时慌乱 | 🔴 |
关键要点: SDL 将安全视为一种特性,而非缺陷。仅在部署后检查安全已经为时已晚;安全软件必须从一开始就进行设计。