刚性阻断需配置trivy的--exit-code 1与--severity critical组合,配合gitlab容器扫描模板或自定义job生成gl-container-scanning-report.json,并在ci设置中启用“fail pipeline on container scanning vulnerabilities”,确保critical漏洞导致流水线失败、阻止部署。

要在 GitLab CI/CD 中实现对发布期制品镜像的代码级漏洞刚性阻断,关键不是“扫描完出报告”,而是让高危漏洞触发流水线失败、阻止镜像入库或部署。Trivy 的 --exit-code 和 --severity 组合是实现刚性控制的核心机制,配合 GitLab 原生安全报告集成,可形成闭环防护。
明确阻断目标与策略分级
刚性阻断不等于扫到所有漏洞都失败。应按 CVSS 评分和实际利用条件设定分层策略:
-
CRITICAL 级别必须阻断:对应 CVSS ≥ 9.0,如远程代码执行类漏洞(Log4Shell、ProxyShell),配置
--exit-code 1 --severity CRITICAL -
HIGH 级别建议人工评审:CVSS 7.0–8.9,可设为警告但不中断流水线,例如用
--exit-code 0 --severity HIGH+ 单独解析报告生成 MR 评论 -
忽略无补丁漏洞(可选):添加
--ignore-unfixed,避免因上游未修复导致误阻断,尤其适用于 Alpine 或长期支持发行版
使用 GitLab 官方模板快速启用(推荐新手)
GitLab 15.0+ 内置 Container Scanning 模板,无需手动维护 Trivy 版本或缓存逻辑,开箱即得结构化报告和 Security Dashboard 支持:
- 在
.gitlab-ci.yml中直接引入:include:- template: Security/Container-Scanning.gitlab-ci.yml - 该模板默认扫描
$CI_REGISTRY_IMAGE:$CI_COMMIT_TAG或$CI_REGISTRY_IMAGE:latest,自动上传gl-container-scanning-report.json - 若需强制阻断,可在项目 Settings → CI/CD → General pipelines 中勾选 “Fail pipeline on container scanning vulnerabilities” 并设置严重级别
自定义高级配置(适合私有 Registry 或精细控制)
当需要对接私有镜像仓库、复用构建缓存、或集成 SBOM 输出时,建议手动配置 job:
- 指定稳定版本镜像(避免 latest 漂移):
image: aquasec/trivy:0.45.0 - 启用本地缓存加速重复扫描:
variables:TRIVY_CACHE_DIR: ".trivycache" - 完整阻断脚本示例:
script:- trivy image \--exit-code 1 \--severity CRITICAL \--ignore-unfixed \--format template \--template "@contrib/gitlab.tpl" \--output gl-container-scanning-report.json \$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA - 确保报告被识别:
artifacts:reports:container_scanning: gl-container-scanning-report.json
补充刚性保障措施
仅靠扫描 job 失败还不够,需防止绕过:
-
锁定 stage 执行顺序:将扫描 job 放在
securitystage,且置于build后、deploy前,用needs:显式依赖构建结果 - 禁用跳过权限:在项目 CI/CD 设置中关闭 “Allow pipelines to be run manually” 或限制特定角色才能重试安全阶段
-
漏洞豁免需审批流程:通过
.trivyignore文件管理例外,但该文件变更应触发额外的安全评审 MR,不可直接合并 -
验证镜像真实性:结合 Cosign 对扫描通过的镜像签名,在后续 deploy 阶段用
cosign verify校验,防篡改











