SDL & DevSecOps

SDL

什么是SDL

SDL(安全开发生命周期),是一种将安全活动融入到软件开发生命周期每个阶段的系统性方法。

SDL一共有五个阶段

阶段核心安全活动主要交付物参与角色
需求阶段安全需求分析、合规评估、数据分级安全需求规格说明书、合规评估报告产品经理、安全工程师
设计阶段安全设计、威胁建模、安全方案评审安全设计文档、威胁建模报告架构师、开发、安全工程师
编码阶段安全编码、代码审计、依赖组件安全检查安全代码、代码审查报告开发工程师、安全工程师
测试阶段安全测试、渗透测试、漏洞修复验证安全测试报告、漏洞修复记录测试工程师、安全工程师
发布与运维安全部署、安全监控、应急响应安全配置基线、监控告警规则运维工程师、安全工程师

SDL-需求阶段:安全需求分析

1.安全需求分析

安全需求分析就是明确”这个产品需要满足哪些安全需求”

  • 合规性需求:法律法规、行业标准要求的安全措施,比如等保要求、个人信息保护要求
  • 业务安全需求:业务本身需要的安全能力,比如用户认证、权限控制、数据加密
  • 安全基线需求:公司统一的安全标准,比如所有系统都必须有的安全功能

安全需求的分类

类别说明典型需求
身份认证(Authentication)验证用户是谁用户名密码登录、手机验证码登录、多因素认证(MFA)、单点登录(SSO)
授权与访问控制(Authorization)验证用户能做什么角色权限管理(RBAC)、数据权限控制、接口鉴权、越权防护
数据安全(Data Security)保护数据的机密性、完整性、可用性敏感数据加密存储、传输加密(HTTPS)、数据脱敏、数据备份
审计与日志(Audit & Logging)记录关键操作,可追溯用户登录日志、操作审计日志、异常行为告警、日志留存期限
可用性与韧性(Availability)保证系统持续可用防DDoS攻击、限流熔断、容灾备份、故障恢复
会话安全(Session Security)保护用户会话安全会话超时、会话固定防护、CSRF防护、安全Cookie
输入输出安全(Input/Output)防止恶意输入和输出泄露输入校验、输出编码、文件上传安全、防SQL注入/XSS

怎么写好安全需求:好的安全需求应该是明确、可衡量、可测试

写好安全需求的SMART原则:

  • S(Specific):具体明确,不模糊
  • M(Measurable):可衡量,能验证是否满足
  • A(Achievable):可实现,不是天方夜谭
  • R(Relevant):相关,和业务场景匹配
  • T(Time-bound):有时限,什么时候完成

2.数据分类分级

不同的数据有不同的敏感程度,需要的保护措施也不一样。数据分级就是根据数据的敏感程度,将数据分为不同等级,然后采取对应的保护措施。

数据等级定义示例保护要求
绝密/核心泄露会造成严重损失用户密码、支付密钥最高级别保护,加密存储,严格访问控制
机密/重要泄露会造成较大损失用户手机号、身份证号加密存储,访问留痕,最小权限
秘密/一般泄露会造成一定影响用户昵称、头像基本访问控制,防止批量泄露
公开可公开的信息产品介绍、公开文档防篡改即可

3.合规评估

评估产品是否满足相关法律法规和行业标准的要求

SDL-设计阶段:安全设计与威胁建模

安全设计有一些通用的原则

原则含义举例
最小权限原则每个主体只拥有完成其任务所必需的最小权限数据库账号只给查询权限,不给删表权限
纵深防御原则建立多层安全防护,一层被攻破还有下一层既有WAF,又有代码层面的输入校验,还有数据库层面的防护
安全默认原则默认配置就是安全的,用户不需要额外配置新用户默认强制设置强密码,默认开启二次验证
职责分离原则关键操作需要不同角色分别完成,防止单点风险转账操作需要操作员录入、审核员复核
零信任原则不信任任何外部输入,也不信任内部其他模块的输出所有输入都要做校验,即使是内部服务传来的数据
可审计原则所有关键操作都要有日志记录,可追溯用户登录、修改密码、转账等操作都记录日志

威胁建模-STRIDE模型

字母威胁类型中文说明对应的安全属性
SSpoofing身份伪造冒充他人身份认证(Authentication)
TTampering篡改数据未经授权修改数据完整性(Integrity)
RRepudiation抵赖用户否认做过某个操作不可否认性(Non-repudiation)
IInformation Disclosure信息泄露信息被不该看到的人看到机密性(Confidentiality)
DDenial of Service拒绝服务让系统不可用可用性(Availability)
EElevation of Privilege权限提升普通用户获得管理员权限授权(Authorization)

威胁建模的基本步骤:

1.画系统架构图:明确系统又哪些组件、组件之间怎么交互、数据怎么流动
2.识别信任边界:找出哪些地方是从可信区域到不可信区域的边界
3.枚举威胁:用STRIDE模型,逐个分析每个组件、每条数据可能面临的威胁
4.评估风险:根据威胁发生的可能性和影响程度,给威胁分级
5.制定缓解措施:针对每个高风险威胁,设计对应的防护方案

SDL-编码阶段:安全编码与代码审查

安全编码规范

常见的安全编码要点:

  • 输入校验:所有外部输入都必须校验,包括长度、格式、范围等。永远不要信任用户输入
  • 输出编码:输出到前端的数据要做HTML编码,防止XSS攻击
  • 参数化查询:数据库操作使用参数化查询或ORM,不要拼接SQL字符串,防止SQL注入
  • 密码安全:密码必须加盐哈希存储,绝对不能明文存储,也不能用可逆加密
  • 错误处理:错误信息不能泄露系统细节(比如数据库结构、文件路径等)
  • 日志安全:日志中不能记录敏感信息(比如密码、身份证号等)
  • 文件上传安全:文件上传要校验文件类型、大小,限制存储路径,防止任意文件上传漏洞

代码审查

方式说明优点缺点
人工代码审查安全工程师人工阅读代码,找安全问题能发现复杂的逻辑漏洞,理解业务上下文效率低,依赖个人经验,覆盖不全
自动化代码审计用工具自动扫描代码中的安全问题速度快,覆盖率高,可重复误报率高,难以发现逻辑漏洞

第三方组件安全

第三方组件安全的主要风险:

  • 已知漏洞:使用的开源组件存在已知的CVE漏洞
  • 组件依赖链复杂:一个组件可能依赖很多其他组件,漏洞可能藏在深层依赖中
  • 组件版本过旧:使用的组件版本太老,很多已知漏洞没修复
  • 供应链攻击:攻击者在开源组件中植入恶意代码

SDL-测试阶段:安全测试与漏洞修复

安全测试多种类型

测试类型全称原理特点
SAST静态应用安全测试分析源代码或二进制代码不需要运行,速度快,误报较高
DAST动态应用安全测试在运行状态下测试,模拟黑客攻击从外部测试,接近真实攻击,误报较低
IAST交互式应用安全测试结合SAST和DAST,在运行时插桩检测准确率高,误报低,需要插桩
渗透测试Penetration Testing安全专家模拟黑客进行攻击测试发现问题最深入,成本高,周期长
模糊测试Fuzz Testing输入大量随机数据,看程序是否崩溃适合发现内存破坏类漏洞

漏洞管理流程

发现漏洞-漏洞分级-漏洞推送-漏洞修复-漏洞复测-确认修复

SDL-发布与运维阶段:安全部署与持续监控

安全部署

安全部署的主要内容:

  • 安全配置基线:服务器、数据库、中间件等都按照安全基线进行配置,比如关闭不必要的端口、禁用默认账号、设置强密码等
  • 最小权限原则:服务运行账号只给必需的最小权限,比如Web服务不要用root账号运行
  • 网络安全配置:安全组、防火墙策略配置,只开放必要的端口和IP
  • 密钥和证书管理:加密密钥、API密钥、SSL证书等的安全管理,不能硬编码在代码里
  • 上线前安全检查:上线前做最后一轮安全检查,确认没有明显的安全问题

安全监控与告警

常见的安全监控类型:

监控类型监控内容目的
Web攻击监控WAF日志、Web访问日志发现SQL注入、XSS等Web攻击
主机安全监控主机登录日志、进程监控、文件监控发现服务器被入侵、异常登录等
数据库安全监控数据库访问日志、异常查询发现数据泄露、异常操作
业务安全监控业务异常行为,比如异常登录、异常交易发现盗号、刷单、薅羊毛等业务风险
漏洞情报监控新爆出的漏洞情报及时发现影响自身系统的0day/Nday漏洞

应急响应

应急响应的基本流程(PDCERF模型):

  1. 准备(Preparation):提前做好应急准备,包括应急预案、应急工具、人员培训等
  2. 检测(Detection):发现安全事件,确认事件真实性
  3. 遏制(Containment):控制事态发展,防止影响扩大,比如隔离受感染的服务器
  4. 根除(Eradication):清除攻击痕迹,修复漏洞,彻底解决问题
  5. 恢复(Recovery):恢复系统正常运行,逐步恢复业务
  6. 跟踪(Follow-up):事后复盘,总结经验教训,改进安全措施

持续跟进

持续改进的方式:

  • 安全事件复盘:每次安全事件后都做复盘,分析根因,改进流程
  • 漏洞根因分析:分析漏洞为什么会产生,是哪个环节没做好,从流程上改进
  • 安全度量:建立安全指标,衡量SDL的效果,比如漏洞数量变化、修复时长等
  • 定期安全评估:定期对系统做全面的安全评估,发现新的安全风险

安全左移

安全左移 = 把安全工作从”事后补救”变成”事前预防”,越早做越好

为什么安全左移?
核心原因就是:越早发现安全问题,修复成本越低

安全左移的”左”到什么程度

  • 最理想的状态:在需求阶段就把安全需求想清楚,设计阶段就把安全架构设计好,编码阶段就写出安全的代码——这样到测试阶段几乎没什么漏洞,上线后也很安全
  • 现实情况:不可能做到100%的问题都在前期发现,但能多往左移一步,就多省一份成本
  • 持续左移:安全左移是一个持续改进的过程,不断把更多的安全工作往更早的阶段推进

安全左移的实践路径

安全活动左移

安全活动传统做法左移后的做法
安全需求测试阶段才想安全需求需求阶段就明确安全需求
架构安全上线后才发现架构问题设计阶段就做威胁建模和安全设计评审
代码安全测试阶段才做安全扫描编码阶段就用IDE插件实时检测,提交时自动扫描
漏洞修复上线后才修复漏洞在开发过程中就发现并修复
安全培训出了问题才培训入职培训、定期培训、持续教育

安全责任左移

责任左移的体现:

  • 开发人员对自己写的代码的安全负责
  • 产品经理对需求中的安全要求负责
  • 测试人员对安全测试的质量负责
  • 安全团队从”救火队”变成”赋能者”,提供工具、培训和指导

安全工具左移

  • IDE阶段:IDE安全插件,写代码时实时提示安全问题
  • 代码提交阶段:Git钩子,提交代码时自动做安全检查
  • CI/CD流水线阶段:在构建、测试环节集成SAST、SCA等安全工具
  • 代码评审阶段:安全代码审查工具,辅助人工审查

DevSecOps

DevOps是一种软件开发和运维的方法论,强调开发团队和运维团队的协作,通过自动化工具和流程,实现软件的快速、可靠交付。

DevOps的核心是CI/CD(持续集成/持续交付)– 代码提交后自动创建、自动测试、自动部署,实现快速迭代和发布。在传统的DevOps流程中,安全往往是”被遗忘的环节”–发布速度越来越快,但安全还是老样子,上线前做一次安全测试,根本跟不上节奏,于是就有了DevSecOps的概念。

DevSecOps的核心概念

  • 安全即代码(Security as Code):把安全策略、安全规则都写成代码,和业务代码一起管理
  • 自动化优先:尽可能用自动化工具完成安全检测,减少人工干预
  • 持续安全:安全不是一次性的,而是持续的,每次代码提交都做安全检测
  • 全员安全:安全不只是安全团队的事,开发和运维都要承担安全责任
  • 左移+右移:不仅要安全左移(开发阶段做安全),还要安全右移(运维阶段持续监控)

SDL和DevSecOps的区别

第一步:先说联系

“SDL和DevSecOps核心理念是一致的,都强调安全左移、全生命周期安全、预防为主。DevSecOps可以看作是SDL在DevOps时代的演进和发展。”

第二步:再说区别

“但二者也有区别:SDL更偏向方法论和流程框架,强调制度和规范;DevSecOps更偏向实践和工具,强调自动化和流水线。SDL是从安全角度出发,把安全融入开发;DevSecOps是从DevOps角度出发,把安全融入DevOps流水线。”

第三步:总结升华

“二者不是对立的,而是互补的。企业应该以SDL为框架,以DevSecOps为手段,流程和工具结合,建设完善的安全开发体系。”

代码阶段安全

安全左移的最前沿,在开发人员写代码的时候就做安全检测,发现问题立即修复,成本最低。

IDE安全插件

在开发人员使用的IDE(如VS Code、IntelliJ IDEA)中安装安全插件,写代码时实时提示安全问题。

Git Hooks

Git钩子是在Git执行特定事件(如提交、推送)时自动触发的脚本。可以在代码提交时自动做安全检查,不符合安全规范的代码不允许提交。

代码评审

安全代码评审的重点:

  • 输入校验是否充分
  • 是否存在SQL注入、XSS、命令注入等漏洞
  • 认证和授权逻辑是否正确
  • 敏感数据是否加密存储和传输
  • 密码、密钥等敏感信息是否硬编码
  • 错误处理是否泄露系统信息
  • 日志是否记录了敏感信息
  • 第三方组件是否有已知漏洞

密钥与敏感信息管理

代码中硬编码密钥、密码、API Key等敏感信息,是非常常见且危险的安全问题。DevSecOps中需要建立完善的密钥管理机制:

  • 密钥扫描:在代码提交和构建时自动扫描,发现硬编码的密钥立即阻断
  • 密钥管理工具:使用专门的密钥管理工具(如HashiCorp Vault、AWS KMS、云厂商的密钥管理服务)存储和管理密钥,不要硬编码在代码或配置文件中
  • 密钥轮换:定期轮换密钥,即使泄露了也能及时失效
  • 最小权限:每个服务的密钥只给必需的最小权限

构建阶段安全

SAST竟态应用安全测试

集成方式:

  • 在CI流水线中增加SAST扫描步骤,代码提交后自动触发
  • 扫描结果生成报告,高危漏洞可以阻断构建
  • 扫描结果可以和缺陷管理系统(如Jira)联动,自动创建漏洞工单

最佳实践:

  • 增量扫描:只扫描变更的代码,提升扫描速度
  • 规则定制:根据公司的技术栈和业务特点,定制扫描规则,降低误报率
  • 误报管理:建立误报标记和反馈机制,持续优化规则
  • 质量门禁:设置安全质量门禁,高危漏洞未修复不允许进入下一阶段

SCA软件成分分析

集成方式:

  • 在构建过程中自动扫描依赖文件(如package.json、pom.xml、requirements.txt等)
  • 识别所有直接依赖和间接依赖(传递依赖)
  • 匹配漏洞数据库,发现存在已知CVE漏洞的组件
  • 分析组件许可证,发现许可证冲突和合规风险

最佳实践:

  • 建立组件白名单/黑名单制度
  • 高危漏洞组件自动阻断构建
  • 自动生成升级建议和修复PR
  • 定期扫描,及时发现新爆出的漏洞

容器镜像扫描

镜像扫描的内容:

  • 操作系统包漏洞:镜像中的操作系统(如Alpine、Ubuntu)的软件包是否有已知漏洞
  • 应用依赖漏洞:镜像中的应用依赖组件是否有已知漏洞(和SCA类似)
  • 敏感信息泄露:镜像中是否包含密钥、密码、证书等敏感信息
  • 恶意软件:镜像中是否包含恶意代码或挖矿程序
  • 配置问题:镜像是否以root用户运行、是否有不必要的特权

最佳实践:

  • 在CI流水线中,镜像构建完成后立即扫描
  • 使用最小化基础镜像(如Alpine、Distroless),减少攻击面
  • 多阶段构建,最终镜像只包含运行时必需的文件
  • 高危漏洞的镜像不允许推送到镜像仓库
  • 定期重新扫描已发布的镜像,及时发现新漏洞

构建安全

  • 构建环境安全:CI/CD服务器本身的安全,及时更新补丁,最小权限配置
  • 凭证安全:CI/CD中的凭证(如镜像仓库密码、部署密钥)要安全存储,不要明文写在流水线配置中
  • 依赖混淆防护:防止攻击者上传同名的恶意包到公共仓库,诱导构建系统下载恶意包
  • 构建产物完整性:构建产物(如Jar包、镜像)要做签名和校验,防止被篡改
  • SBOM(软件物料清单):构建时生成SBOM,记录软件的所有组件和依赖,便于漏洞追踪和供应链安全管理

测试阶段安全

DAST动态应用安全测试

集成方式:

  • 应用部署到测试环境后,自动触发DAST扫描
  • DAST工具爬虫遍历应用的所有页面和接口
  • 发送各种攻击payload,检测是否存在漏洞
  • 生成扫描报告,高危漏洞可以阻断发布

IAST交互式应用安全测试

集成方式:

  • 在测试环境的应用中植入IAST探针(Agent)
  • 运行功能测试或自动化测试时,IAST探针实时监控数据流
  • 发现漏洞时实时报告,准确率高、误报低
  • 能定位到具体的代码行,方便修复

API安全测试

API安全测试的内容:

  • 认证与授权:API是否正确做了身份认证和权限校验,是否存在越权漏洞
  • 输入校验:API是否对输入做了充分校验,是否存在注入漏洞
  • 数据泄露:API是否返回了过多的敏感数据
  • 限流与防刷:API是否有限流机制,防止暴力破解和DDoS
  • OWASP API Top 10:针对API的十大安全风险(如失效的对象级授权、失效的用户认证、过度数据暴露等)

基础架构安全测试

  • 基础设施即代码(IaC)扫描:扫描Terraform、CloudFormation、Ansible等IaC代码中的安全配置问题
  • 云配置检查:检查云服务(AWS/Azure/阿里云)的安全配置,如S3存储桶是否公开、安全组是否配置正确
  • Kubernetes安全扫描:扫描K8s的配置安全,如RBAC配置、Pod安全策略、网络策略等
  • 合规扫描:检查基础设施是否符合等保、CIS Benchmark等合规要求

部署阶段安全

部署阶段是代码上线的最后一道关口,需要有安全控制确保只有安全的代码才能上线。


安全门禁

安全门禁是DevSecOps落地的核心机制之一,在CI/CD流水线的关键节点设置安全检查阈值,只有满足安全要求的代码才能通过,不满足的自动阻断,不允许进入下一阶段。

安全门禁的核心价值是:把安全质量变成发布的硬性条件,确保带高危漏洞的代码不会上线。

安全门禁的设计原则

1. 分级设置

不同的环境、不同的项目,安全门禁的严格程度应该不同:

  • 开发环境/测试环境:门禁可以宽松一些,主要是提示和预警,不阻断开发流程
  • 预发环境/生产环境:门禁要严格,高危漏洞必须修复才能上线
  • 核心系统/重要业务:门禁更严格,要求更高
  • 非核心系统/内部工具:门禁可以适当放宽

2. 渐进式收紧

安全门禁不要一开始就设置得非常严格,否则会严重影响开发效率,导致开发团队强烈抵触。建议采用渐进式收紧的策略:

  • 第一阶段:只告警不阻断,让开发团队适应,了解有哪些漏洞
  • 第二阶段:阻断严重漏洞,严重漏洞必须修复才能上线
  • 第三阶段:阻断高危漏洞,高危漏洞也必须修复
  • 第四阶段:加入更多指标(如漏洞修复率、技术债务等),持续收紧

给开发团队一个适应和改进的过程,而不是一下子卡死。

3. 可配置、可调整

安全门禁的阈值应该是可配置的,可以根据项目特点、业务需求、安全风险等因素调整。不要”一刀切”,所有项目用同一个标准。

4. 透明、可解释

安全门禁的规则和阈值要对开发团队透明,让开发知道”为什么被阻断了”、”需要修复什么”、”怎么修复”。不要搞成”黑盒”,开发被阻断了却不知道为什么。

5. 有例外管理机制

任何规则都有例外。安全门禁要有正式的例外管理机制,对于确实无法在短期内修复的漏洞,可以申请例外,但需要审批、有时间限制、有补偿措施。

安全门禁检查的内容:

  • 严重/高危漏洞是否已修复
  • 安全扫描是否通过
  • 安全设计评审是否通过
  • 是否有未解决的安全风险
  • 合规要求是否满足

安全门禁的常见指标

指标类别具体指标示例阈值
漏洞数量严重漏洞数、高危漏洞数、中危漏洞数严重=0,高危≤2,中危≤10
漏洞修复率已修复漏洞数 / 总漏洞数高危修复率≥95%
漏洞修复时长漏洞从发现到修复的平均时间(MTTR)高危漏洞MTTR≤7天
代码质量代码覆盖率、代码重复率、代码异味数覆盖率≥80%,重复率≤3%
组件安全存在高危漏洞的组件数、组件过时率高危组件=0
镜像安全镜像中的高危漏洞数、镜像大小高危漏洞=0
合规检查合规检查失败项数严重不合规项=0

安全配置管理

  • 配置与代码分离:敏感配置(如数据库密码、API密钥)不要硬编码在代码或镜像中,通过配置中心或环境变量注入
  • 配置加密:敏感配置要加密存储和传输
  • 最小权限:应用运行账号只给必需的最小权限
  • 网络隔离:通过安全组、网络策略等控制网络访问,只开放必要的端口
  • 安全基线:服务器、容器、中间件都按照安全基线配置

安全发布策略

  • 蓝绿发布:同时运行两个环境(蓝和绿),发布时切换流量,出问题可以快速回滚
  • 金丝雀发布(灰度发布):先把新版本发布给一小部分用户,验证没问题后再逐步扩大范围,出问题影响范围小
  • 自动回滚:发布后监控关键指标,出现异常自动回滚到上一个版本
  • 发布审批:重要系统的生产发布需要审批,确保发布经过了充分的测试和验证

运行阶段安全

运行时应用自我保护(RASP)

在应用运行时植入探针,实时监控应用的行为,发现攻击行为时实时阻断。

RASP能防护的攻击:

  • SQL注入、命令注入、XSS等注入攻击
  • 越权访问
  • 恶意文件上传
  • 异常调用(如调用危险的系统命令)

持续安全监控

  • Web攻击监控:WAF日志、Web访问日志,发现SQL注入、XSS等攻击
  • 主机安全监控:主机登录日志、进程监控、文件监控,发现服务器被入侵
  • 容器安全监控:容器运行时行为监控,发现异常容器行为
  • 业务安全监控:异常登录、异常交易、批量操作等业务异常行为
  • 漏洞情报监控:新爆出的0day/Nday漏洞,及时评估是否影响自身系统
  • SIEM(安全信息和事件管理):集中收集和分析各种安全日志,发现复杂的攻击行为

应急响应与持续改进

  • 应急预案:提前制定各种安全事件的应急预案
  • 应急响应流程:发现安全事件后,按照流程快速响应、遏制、根除、恢复、复盘
  • 漏洞持续修复:运行阶段新发现的漏洞,纳入漏洞管理流程,及时修复
  • 安全事件复盘:每次安全事件后做复盘,分析根因,从流程和工具上改进,避免类似事件再次发生
  • 红蓝对抗:定期做红蓝对抗演练,检验安全防护体系的有效性

文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇