4. Trivy 高级扫描:SBOM 生成与解析、依赖关系分析、License 合规检查

在掌握了 Trivy 的基础漏洞扫描后,本章将深入其高级功能:SBOM(软件物料清单)的生成与解析、依赖关系分析以及License 合规检查。这些能力是构建完整云原生安全基线、实现精细化水位管理和自动化巡检的关键技术支柱。

4.1 SBOM 生成与解析

SBOM 是软件供应链安全的基石。Trivy 不仅支持从容器镜像、文件系统、Git 仓库等来源生成 SBOM,还能解析第三方 SBOM 文件进行深度扫描。

4.1.1 生成 SBOM(CycloneDX / SPDX)

Trivy 支持两种主流标准格式:CycloneDX 和 SPDX。通过 trivy image --format 命令即可输出。

核心命令示例:
# 生成 CycloneDX 格式的 SBOM
trivy image --format cyclonedx --output result.cdx.json alpine:3.18

# 生成 SPDX 格式的 SBOM
trivy image --format spdx-json --output result.spdx.json alpine:3.18

# 仅生成 SBOM,不进行漏洞扫描(更快)
trivy image --format cyclonedx --scanners sbom --output sbom-only.cdx.json alpine:3.18

4.1.2 解析与扫描已有 SBOM

当您从供应商或构建系统获取到 SBOM 文件后,Trivy 可以直接解析并对其进行漏洞、密钥和 License 扫描。

# 解析并扫描 CycloneDX SBOM
trivy sbom path/to/result.cdx.json

# 解析并扫描 SPDX SBOM
trivy sbom path/to/result.spdx.json
最佳实践:在 CI/CD 流水线中,建议在构建阶段生成 SBOM 并归档。后续的巡检、准入检查直接使用该 SBOM 进行扫描,避免重复解包镜像,显著提升扫描效率。

4.2 依赖关系分析

Trivy 能够深入分析项目依赖树,识别直接依赖与间接依赖(传递依赖)中的漏洞。这对于评估漏洞的实际影响范围至关重要。

4.2.1 依赖树可视化

通过 --dependency-tree 参数,Trivy 可以输出依赖关系树,帮助您快速定位漏洞的引入路径。

trivy fs --dependency-tree ./node_project

输出示例:

node_project (npm)
└── express@4.18.2
    ├── accepts@1.3.8
    │   └── mime-types@2.1.35
    │       └── mime-db@1.52.0
    ├── body-parser@1.20.1
    │   └── raw-body@2.5.1
    │       └── iconv-lite@0.4.24
    └── qs@6.11.0
        └── side-channel@1.0.4
            └── get-intrinsic@1.2.1
                └── has-symbols@1.0.3 (CVE-2023-XXXXX)

4.2.2 依赖关系分析场景

场景 说明 Trivy 命令/参数
识别间接依赖漏洞 发现通过传递依赖引入的漏洞 trivy fs --dependency-tree
定位漏洞引入路径 从根依赖追踪到具体漏洞包 trivy fs --dependency-tree --severity HIGH,CRITICAL
评估修复影响 分析升级某个直接依赖是否会破坏其他依赖 结合 --dependency-tree 输出人工分析
注意:依赖树分析功能目前主要支持 trivy fs(文件系统扫描)模式,且对包管理器的支持程度不同(npm、Maven、Go Modules 等支持较好)。

4.3 License 合规检查

License 合规是 DevSecOps 准入检查的重要一环。Trivy 内置了丰富的 License 数据库,可以扫描项目依赖中的开源许可证,并支持自定义策略。

4.3.1 启用 License 扫描

通过 --scanners license 参数启用 License 扫描器。

# 扫描镜像中的 License
trivy image --scanners license alpine:3.18

# 扫描文件系统中的 License
trivy fs --scanners license ./my_project

# 输出为表格格式
trivy fs --scanners license --format table ./my_project

4.3.2 License 分类与风险等级

Trivy 将 License 分为三类,便于制定合规策略:

分类 风险等级 常见 License 示例 合规要求
Permissive 低 MIT, Apache-2.0, BSD 通常允许商业使用,需保留版权声明
Weak Copyleft 中 LGPL, MPL 修改后的库文件需开源,动态链接通常不受限
Strong Copyleft 高 GPL, AGPL 衍生作品必须使用相同 License 开源

4.3.3 自定义 License 策略

通过 Trivy 配置文件(trivy.yaml 或 --license-config),您可以定义允许/禁止的 License 列表,实现自动化合规准入。

# trivy.yaml 配置示例
license:
  allow:
    - "MIT"
    - "Apache-2.0"
    - "BSD-2-Clause"
    - "BSD-3-Clause"
  deny:
    - "GPL-3.0"
    - "AGPL-3.0"
    - "BUSL-1.1"
# 使用配置文件扫描
trivy fs --scanners license --config trivy.yaml ./my_project
灰度发布准入场景:在准入检查脚本中,如果扫描到 deny 列表中的 License,直接阻断发布并输出合规报告。

4.4 综合流程:SBOM + 依赖分析 + License 合规

以下 SVG 图展示了在 CI/CD 流水线中,如何将 SBOM 生成、依赖关系分析和 License 合规检查整合为一个完整的扫描阶段。

Trivy 高级扫描综合流程 Trivy 高级扫描综合流程 构建产物 / 镜像 阶段 1:SBOM 生成 (CycloneDX/SPDX) 阶段 2a:依赖关系分析 阶段 2b:License 合规检查 阶段 3:结果聚合与策略评估 输出:综合报告 / 准入决策 说明:SBOM 生成后,依赖分析与 License 检查可并行执行,提升流水线效率。

4.5 实战:在灰度发布准入检查中集成高级扫描

以下是一个完整的准入检查脚本片段,集成了 SBOM 解析、依赖分析和 License 策略:

#!/bin/bash
# 灰度发布准入检查脚本

IMAGE_NAME="my-app:canary-${BUILD_NUMBER}"
SBOM_FILE="sbom-${BUILD_NUMBER}.cdx.json"
POLICY_FILE="trivy.yaml"

# 1. 生成 SBOM
echo "[INFO] 生成 SBOM..."
trivy image --format cyclonedx --scanners sbom --output ${SBOM_FILE} ${IMAGE_NAME}

# 2. 基于 SBOM 进行高级扫描(依赖分析 + License + 漏洞)
echo "[INFO] 执行高级扫描..."
trivy sbom --dependency-tree --scanners vuln,license,secret --config ${POLICY_FILE} ${SBOM_FILE}

# 3. 检查退出码
if [ $? -ne 0 ]; then
  echo "[BLOCK] 准入检查失败:存在高危漏洞、禁止的 License 或密钥泄露"
  exit 1
else
  echo "[PASS] 准入检查通过"
  exit 0
fi
水位管理建议:将 SBOM 文件作为构建产物归档到制品仓库。在后续的巡检任务中,直接使用归档的 SBOM 进行扫描,避免重复拉取镜像,降低网络开销和扫描时间。