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
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 合规检查整合为一个完整的扫描阶段。
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