DevSecOps 的第一步,往往不是多买一个安全盒子,而是把代码扫描做成像单元测试一样的流水线步骤:提交/合并时自动触发,结构化输出结果,高危问题可以终止合并或发布。本文聚焦「怎么把扫描嵌进流水线」这一环:不评具体扫描工具,也不展开试点项目怎么选。下面按「扫什么 → 放哪 → 四周怎么推」写,适合已有 CI/CD、扫描仍靠人工的团队对照实施。
一、扫什么、放哪:CI/CD 各阶段与门禁建议
代码扫描是一组能力,嵌入点不同,发现的问题也不同。下表是常见划分,具体工具能力以 POC 为准。
扫描类型 | 扫描对象 | 建议嵌入阶段 | 主要发现 | 门禁建议(针对新增) |
SAST 静态应用安全测试 | 源代码 | MR / 合并前 | 注入、XSS、不安全函数、部分逻辑缺陷 | Critical/High 阻断;Medium 告警 |
密钥与敏感信息 | 源码、配置、历史提交 | pre-commit 或 CI 最前 |
| 命中即 阻断(pre-commit 本地拦,CI 防 bypass) |
SCA 依赖成分分析 | 第三方依赖 | 构建前 / 依赖解析后 | 已知 CVE、许可证风险 | 新增依赖 高危 CVE 阻断 |
容器镜像扫描 | 构建产物 | 镜像 build 完成后 | 基础镜像与依赖漏洞、危险配置 | 严重漏洞 阻断发布;存量基线分期治理 |
DAST 动态测试 | 运行中的应用 | 部署到脱敏测试环境后 | 运行时漏洞、接口越权 | 通常告警 + 缺陷跟踪;慎对含真实数据的环境扫 |
阶段顺序示意(可按引擎改写,逻辑顺序通用):
on: pull_request
→ secret-scan(增量)
→ sast(增量,输出 SARIF/JSON)
→ quality-gate(仅判本次变更 + 新增依赖)
→ allow merge
on: push main / release tag
→ sca
→ build
→ image-scan
→ gate
→ deploy:staging(测试数据脱敏)
→ dast(可选,窗口内执行)
→ deploy:prod(人工或变更审批)GitLab 等平台的 DevSecOps 模板也大致遵循「左侧扫代码与密钥 → 中段扫依赖与镜像 → 右侧测运行态」;不必照搬某一厂商,但 MR 上就要有 SAST/密钥反馈,比 nightly 全量更有用。
二、判断是否真的落地:三件事
先记下三条验收标准,四周 rollout 推进时对照检查:
触发:扫描是否随 MR/构建自动跑,而不是发版前人工点一下?
门禁:结果是否能挡不合格合并/发布(而不只是邮件报告)?
闭环:问题是否进缺陷系统、有人修、复测后关单,而不是躺在报表里?
三条缺一条,都还算「工具已部署,DevSecOps 未落地」。

三、四周 rollout:从只告警到可阻断
不必六步齐上。下面按一周一个目标推进,误区写在对应周里,避免「门禁一步到位」把团队逼关。
Week 1:盘点 + 只上 SAST 与密钥(只告警,不阻断)
先回答:流水线哪一段是空的?团队主语言是什么?等保/行业审计是否要留扫描与门禁记录(具体条目须对照测评要求,本文不构成等保结论)?
动作: 在 MR 流水线最前加密钥扫描 + SAST 增量;规则先开高危/严重;结果出 SARIF 或 JSON,仅通知不挡合并。
常见坑: 第一天就全量扫历史仓库 → 告警爆炸。本周只关心本次 diff。

工具可以自建(如 Semgrep、SonarQube、Trivy 等组合接入 Jenkins/GitLab CI),也可以用已内置多种扫描引擎的一体化 DevOps 平台减少胶水脚本,例如 GitFox(禅道 DevOps 引擎)在流水线侧可配置 SAST/依赖/镜像等阶段,与禅道同域时后续接缺陷闭环路径更短;具体扫描类型与规则以所选版本 POC 为准,非禅道/GitFox 栈同样可用自研集成方案。
Week 2:质量门禁(只挡「新增」高危)
动作: 门禁只判本次 MR 引入的 Critical/Blocker(SAST)与新增依赖的高危 CVE;存量问题进 backlog,不阻塞新迭代。
常见坑: 用全量规则挡全库 → 开发关门禁。若 Week 1 误报多,本周先做规则降级 + 白名单,再开阻断。

quality-gate 伪逻辑:
IF 增量 sast.critical > 0 OR 新增 dep.cve.high > 0 THEN fail
ELSE passWeek 3:补 SCA + 镜像扫描
动作: 在 build 前加 SCA;镜像 push 前加 image-scan;门禁同样只对新增/本次构建产物挡严重项。
常见坑: 只出 HTML 报告、不接 gate → 等于白扫。

Week 4:缺陷闭环 + 试点度量
动作: 扫描高危项自动建缺陷单,指派提交人或模块 owner,修复后在同一 MR 或后续 MR 复测通过再关单。
若 PM 用禅道、DevOps 用 GitFox,同域数据模型下可将扫描问题直接生成禅道 Bug,关联仓库、分支与 MR,形成「扫描 → Bug → 修复 → 流水线复测 → 关单」,比邮件转发报告省一轮人工登记。若 PM 是 Jira、Azure Boards 等,用 Webhook/API 同样能接,关键是结构化结果 + 自动建单,不必绑死某一品牌。
试点指标(1~2 个核心项目): MR 扫描覆盖率、门禁拦截率(应随误报治理下降)、高危修复周期(中位数)。稳定后再推广全团队、逐步加 DAST 与中危规则。

四、选型与规则:五个问题
语言与框架:是否覆盖?
规则:能否按项目分级、维护白名单?
增量扫描:是否支持 MR 级 diff?
门禁:能否读 SARIF/JSON 并 fail pipeline?
部署:私有化、信创(如需要)是否有可核对的适配材料?
规则启用顺序:高危安全 → 密钥 → 依赖 CVE → 镜像 → 规范类;DAST 放测试环境且数据脱敏,避免扫到生产或含 PII 的库。
结语
DevSecOps 不必一步到位。把扫描嵌进 MR 与构建、门禁只守新增、问题进禅道或现有缺陷系统,四周内通常能从不阻断走到「高危不合入」;之后再扩 DAST、收紧中危、做安全度量。第一步永远是流水线自动扫 + 结果能挡 + 漏洞可闭环。
这样做的底气有数据支撑:DORA《Accelerate》及后续 State of DevOps 系列报告(如 2023 年版)一贯显示,把质量与安全内建进交付流程的团队,在变更失败率、恢复时间等指标上往往优于「安全后置救火」:左移不是牺牲速度,而是少「带病上线再返工」。


