4. SBOM 核验触发场景:CI/CD 流水线触发、定时扫描触发、事件驱动触发(镜像推送/部署)
SBOM 核验并非一次性动作,而是需要嵌入到容器镜像与应用的整个生命周期中。根据核验的自动化程度与触发时机,主要分为三类触发场景:CI/CD 流水线触发、定时扫描触发 与 事件驱动触发。理解这三类场景的差异与适用条件,是构建有效核验策略的基础。
4.1 三类触发场景对比
| 触发类型 | 触发时机 | 核验目标 | 典型工具/机制 | 失败影响范围 |
|---|---|---|---|---|
| CI/CD 流水线触发 | 代码提交、构建完成、制品生成 | 阻止含高危漏洞/许可证违规的镜像进入制品库 | Jenkins/GitLab CI/GitHub Actions + Trivy/Grype | 阻断当前流水线,阻止制品发布 |
| 定时扫描触发 | 按固定周期(每日/每周) | 发现已存储镜像中的新漏洞(CVE 库更新后) | CronJob + Clair/Trivy Server | 生成告警,触发重新评估或修复流水线 |
| 事件驱动触发 | 镜像推送至仓库、部署至集群 | 在运行时环境入口处执行准入控制 | Admission Webhook + OPA/Kyverno + Sigstore | 拒绝不合规镜像的拉取或部署 |
4.2 CI/CD 流水线触发:左移核验
这是最关键的“左移”安全实践。在开发者提交代码或构建镜像时,自动触发 SBOM 生成与核验,将安全问题暴露在最早阶段。
核验策略要点:
- 门禁策略: 设定漏洞严重性阈值(如:阻断 CVSS >= 7.0 的漏洞),核验不通过则流水线失败。
- SBOM 生成时机: 在镜像构建完成后、推送至仓库前,生成 SPDX 或 CycloneDX 格式的 SBOM。
- 证据留存: 将核验报告(含通过/阻断状态、漏洞列表、许可证信息)作为流水线产物归档。
# GitLab CI 示例:在构建阶段后执行 SBOM 核验
build:
stage: build
script:
- docker build -t ${CI_REGISTRY_IMAGE}:${CI_COMMIT_SHORT_SHA} .
- trivy image --format cyclonedx --output sbom.cdx.json ${CI_REGISTRY_IMAGE}:${CI_COMMIT_SHORT_SHA}
- trivy image --severity CRITICAL,HIGH --exit-code 1 ${CI_REGISTRY_IMAGE}:${CI_COMMIT_SHORT_SHA}
artifacts:
paths:
- sbom.cdx.json
reports:
cyclonedx: sbom.cdx.json
4.3 定时扫描触发:持续监控与合规漂移检测
即使通过了 CI/CD 核验,已存储的镜像仍可能因新公开的漏洞(如 Log4j)而变得不安全。定时扫描用于检测这种“安全漂移”。
常见误区: 仅依赖 CI/CD 核验而忽略定时扫描。新漏洞在镜像构建完成后的任何时间都可能被发现,定时扫描是 CI/CD 核验的必要补充。
定时扫描通常以 Kubernetes CronJob 或独立调度器形式运行,扫描范围包括所有已批准的镜像仓库。核验结果应写入安全事件数据库,并与告警系统联动。
# Kubernetes CronJob 示例:每日凌晨 2 点扫描仓库
apiVersion: batch/v1
kind: CronJob
metadata:
name: sbom-scan-cron
spec:
schedule: "0 2 * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: scanner
image: aquasec/trivy:latest
command:
- trivy
- image
- --severity
- CRITICAL,HIGH
- --ignore-unfixed
- registry.example.com/app:latest
restartPolicy: OnFailure
4.4 事件驱动触发:运行时准入控制
在 Kubernetes 环境中,事件驱动触发通常通过 Admission Webhook 实现。当有镜像被推送或部署请求时,Webhook 拦截请求,提取镜像的 SBOM 或签名信息进行核验。
推荐实践: 结合 Sigstore(Cosign)进行镜像签名验证。事件驱动核验不仅检查 SBOM 中的漏洞,还验证镜像的完整性与发布者身份。
下图展示了事件驱动触发在镜像推送与部署两个关键节点的核验流程:
4.5 三类触发场景的协同与证据链
在实际生产环境中,这三类触发场景并非孤立运行,而是构成一个完整的核验证据链:
- CI/CD 触发 生成初始 SBOM 与核验报告,作为“构建时证据”。
- 定时扫描 持续更新镜像的安全状态,生成“运行时监控证据”。
- 事件驱动触发 在每次部署时执行准入控制,生成“部署准入证据”。
证据留存建议:
- 所有核验结果(通过/阻断)均需记录时间戳、触发事件 ID、镜像摘要(digest)、核验工具版本。
- 将 SBOM 文件与核验报告一同归档至不可篡改的存储(如对象存储 + 数字签名)。
- 对于阻断事件,保留完整的请求上下文(如流水线 ID、部署命名空间、触发用户)。
下表总结了不同触发场景下的证据留存关键字段:
| 触发场景 | 证据 ID | 核心留存字段 | 存储位置 |
|---|---|---|---|
| CI/CD 流水线 | Pipeline ID + Job ID | 提交 SHA、构建时间、SBOM 路径、核验结果 | CI/CD 系统制品库 + 对象存储 |
| 定时扫描 | 扫描任务 ID + 时间戳 | 扫描范围、新发现漏洞列表、严重性分布 | 安全事件数据库 (ES/Splunk) |
| 事件驱动 | Webhook UID + 请求 ID | 镜像 digest、命名空间、准入决策、策略名称 | Kubernetes Audit Log + 安全存储 |