首页
/ Trivy 对 SUSE 系列系统(openSUSE / SLES / SLE Micro)的支持详解:漏洞扫描、SBOM 与许可证识别

Trivy 对 SUSE 系列系统(openSUSE / SLES / SLE Micro)的支持详解:漏洞扫描、SBOM 与许可证识别

2026-09-08 13:55:26作者:胡唯隽

Trivy 将 SUSE 家族(openSUSE Leap、openSUSE Tumbleweed、SUSE Linux Enterprise 及 SUSE Linux Enterprise Micro)作为一类完整的 RPM 系操作系统纳入 OS 级扫描支持,本文基于 docs/guide/coverage/os/suse.md 并结合仓库内源码,系统讲解其对 SUSE 的发行版覆盖范围、SBOM 软件包枚举、基于 SUSE CVRF 安全通告的漏洞检测机制、EOL(生命周期终止)感知以及 RPM 元数据驱动的许可证识别能力。读完本文,你将明确 SUSE 各发行版在 Trivy 中支持哪些扫描器、其漏洞数据库来源与版本比对逻辑是什么、哪些功能(如无修复版本漏洞展示)暂不支持,以及如何在代码层面印证这些行为。

支持范围总览:四类发行版与其版本

SUSE 不是单一的操作系统,而是一族基于 RPM 软件包格式、面向不同场景的发行版。Trivy 支持以下四类,官方支持的版本列表维护在 docs/guide/coverage/os/index.md 的 Supported OS 表格中:

发行版 支持的版本 包管理器
openSUSE Leap 42、15 zypper/rpm
openSUSE Tumbleweed 滚动发行版(无固定版本号,表中标记 n/a) zypper/rpm
SUSE Linux Enterprise(SLE/SLES) 11、12、15 zypper/rpm
SUSE Linux Enterprise Micro(SLE Micro) 5、6 zypper/rpm

注意 Tumbleweed 是滚动发行版,因此在其版本列以 (n/a) 标注——它没有 Leap/SLES 那样的固定版本号与生命周期节点,Trivy 对其采用独立的处理逻辑(见下文"Tumbleweed 特殊处理")。

在源码层面,这四类发行版被建模为四个 scanner 类型。位于 pkg/detector/ospkg/suse/suse.go 的枚举定义如下:

type Type int

const (
	SUSEEnterpriseLinux     Type = iota // SUSE Linux Enterprise
	SUSEEnterpriseLinuxMicro            // SUSE Linux Enterprise Micro
	OpenSUSE                            // openSUSE Leap
	OpenSUSETumbleweed                  // openSUSE Tumbleweed(滚动版)
)

系统识别同样建立在 SUSE 系列独特的 os-release ID 之上。pkg/fanal/analyzer/os/release/release.go 中维护的 ID 到 OS Family 映射包含:

  • opensuse-leapopensuse(分别对应 Leap 15、Leap 42 的 ID 写法)→ OpenSUSELeap
  • opensuse-tumbleweedOpenSUSETumbleweed
  • slesSLES
  • sle-microsl-microsle-micro-rancherSLEMicro(源码注释特别说明:SLE Micro 6.0 曾短暂更名 "SL Micro",另有 "SLE Micro for Rancher" 品牌,均统一归入 SLEMicro,对应镜像如 slemicro-rancher 的测试数据位于 pkg/fanal/analyzer/os/release/testdata

解析器读取目标文件系统中的 etc/os-release / usr/lib/os-release,取 IDVERSION_ID(再结合 NAME 字段做细粒度修正),从而把容器或主机镜像正确地归类为 SUSE 家族的某个成员。

三类扫描能力与功能矩阵

针对 SUSE 发行版,Trivy 支持下列三种 OS 包扫描器,覆盖"从软件包解析到安全结果产出"的完整链路:

扫描器 支持情况
SBOM
Vulnerability(漏洞)
License(许可证)

除扫描器外,原文档还给出了功能特性矩阵,用于说明基于这些扫描器能够进一步提供的能力边界:

功能特性 支持情况
Unfixed vulnerabilities(展示无修复版本的漏洞) -(不支持)
Dependency graph(依赖来源图)
End of life awareness(EOL 生命周期感知)

其中三项特性在仓库中均有对应实现或佐证:

  • Dependency graph:指报告阶段"显示漏洞依赖来源(Origins)"的能力,其行为由 docs/guide/configuration/reporting.md 描述,对 SUSE 场景同样适用;
  • End of life awareness:由 pkg/detector/ospkg/suse/suse.goIsSupportedVersion 依据硬编码的 EOL 日期表判断(下文专节展开);
  • Unfixed vulnerabilities 不支持:Trivy 从 SUSE CVRF 通告中取得的是"修复后版本"信息,若某漏洞当前没有已发布的修复版本,则无法像 Debian/Ubuntu/RHEL 等(基于 OVAL/更新源)那样输出"unfixed"状态的漏洞条目,因此该列标记为 -

SBOM:从 RPM 数据库中枚举软件包

SUSE 家族使用 zypper/rpm 管理软件包,所有已装软件包都会以 RPM 头信息的形式记录在系统 RPM 数据库中。Trivy 的 SBOM 扫描正是通过解析这一层数据,枚举"经由 RPM 生态包管理器(dnfyumzypper 等)安装的软件包",并据此生成或转换为 CycloneDX/SPDX 等格式的 SBOM(通用 SBOM 能力详见 docs/guide/supply-chain/sbom.md)。

在具体实现上,RPM 包解析器位于 pkg/fanal/analyzer/pkg/rpm,其中 archive.go 会逐个读取 RPM 头中的字符串标签(例如通过 rpmutils.LICENSE 标签获取许可证信息),将其组装为 types.Package 结构;rpm.go 则覆盖从已安装数据库 / rpm 命令输出的场景。也就是说,SBOM 阶段解析出的每个软件包都携带了名称、版本、release、源码包名与许可证元数据,这些字段会继续作为漏洞匹配与许可证判定的输入。仓库中 opensuse-leapslemicro 等目录(pkg/fanal/analyzer/os/release/testdata)的夹具即为验证该解析链而存在。

Vulnerability:基于 SUSE CVRF 通告的漏洞检测

数据来源

SUSE 官方发布自己的安全通告,Trivy 仅消费这些厂商级通告数据源来对 openSUSE/SLE 进行漏洞匹配。官方数据源清单汇总在 docs/guide/scanner/vulnerability.md,其中 openSUSE/SLES 对应的数据源为 SUSE CVRF(数据源 ID 为 suse-cvrfdata-source 测试夹具见 pkg/detector/ospkg/suse/testdata/fixtures/data-source.yaml)。

这一点很关键:根据 docs/guide/scanner/vulnerability.md 中的"Data Source Selection"原则,由 zypper/rpm 安装的系统包只会与 SUSE 自家通告匹配,而不会与上游 GitHub/GitLab 漏洞库交叉匹配,从而避免"上游已修复、厂商尚未 backport"造成的误报;同时漏洞的严重级别也以厂商标注为准。

扫描器构造与检测主流程

pkg/detector/ospkg/suse/suse.go 的工厂方法 NewScanner 将上文四个发行版类型分别绑定到 trivy-db 中对应的 CVRF 数据源客户端:

func NewScanner(t Type) *Scanner {
	switch t {
	case SUSEEnterpriseLinux:
		return &Scanner{vs: susecvrf.NewVulnSrc(susecvrf.SUSEEnterpriseLinux)}
	case SUSEEnterpriseLinuxMicro:
		return &Scanner{vs: susecvrf.NewVulnSrc(susecvrf.SUSEEnterpriseLinuxMicro)}
	case OpenSUSE:
		return &Scanner{vs: susecvrf.NewVulnSrc(susecvrf.OpenSUSE)}
	case OpenSUSETumbleweed:
		return &Scanner{vs: susecvrf.NewVulnSrc(susecvrf.OpenSUSETumbleweed)}
	}
	return nil
}

核心匹配逻辑在 Detectsuse.go)中完成,其流程可概括为:

  1. 遍历 SBOM/OS 解析阶段得到的每个软件包;
  2. Release=osVer(如 15.3)与 PkgName=包名 为参数,从 CVRF 数据源查询该包涉及的所有通告(advisory);
  3. 使用 RPM 语义的版本比较库(go-rpm-version)比较"已安装版本"与通告中的"修复版本";
  4. 仅当 installedVersion < fixedVersion 时,将漏洞记录(含 VulnerabilityID、安装版本、修复版本、所在镜像层 LayerDataSource)加入结果;否则视为已修复或无关。

由于采用了 RPM 生态的版本比较(而非语义化版本比较),像 SUSE 特有的 release 字段(例如 150200.11.47.1 这类按 build 计数递增的版本)也能被正确排序比较。

单测与典型场景验证

pkg/detector/ospkg/suse/suse_test.go 中的 TestScanner_Detect 用四类发行版各验证了一个端到端"能检出漏洞"的用例,可作为理解上述机制的最佳佐证:

发行版类型 osVer 软件包 检出漏洞 ID 版本变化
OpenSUSE 15.3 postgresql 13-4.6.6 SUSE-SU-2021:0175-1 修复于 13-4.6.7
OpenSUSETumbleweed (滚动版,空版本号) singularity-ce 4.1.3-1.0 openSUSE-SU-2024:14059-1 修复于 4.1.3-1.1
SUSEEnterpriseLinux 15.3 libopenssl1_1 1.1.1d-150200.11.47.1 SUSE-SU-2022:2251-1 修复于 1.1.1d-150200.11.48.1
SUSEEnterpriseLinuxMicro 5.3 libopenssl1_1 1.1.1l-150400.7.21.1 SUSE-SU-2023:0311-1 修复于 1.1.1l-150400.7.22.1

可以观察到:openSUSE/SLE 的通告编号前缀有 SUSE-SU-...openSUSE-SU-... 之分,且修复版本同时包含"软件版本 + RPM release"两段,这正是 Detect 必须使用 RPM 语义版本比较的原因。测试还覆盖了异常路径(broken bucket 用例,通告查询失败时返回 failed to get SUSE advisory 错误)。

支持版本判定与 End of Life 感知

Trivy 对 SUSE 是否继续扫描某一版本,取决于当前时间是否已越过该版本的生命周期终点(EOL)。这些 EOL 日期被硬编码在 pkg/detector/ospkg/suse/suse.go 的三张映射表中,分别对应 SLES(slesEolDates)、SLE Micro(slemicroEolDates)与 openSUSE Leap(opensuseEolDates),数据均以 SUSE 官方生命周期页面为来源。例如其中可以查到 SLES 12.5 的 EOL 为 2024-10-31、SUSE Linux Enterprise 15.7 为 2031-07-31、SLE Micro 5.5 为 2027-10-31 等条目。

判定逻辑集中在 IsSupportedVersionsuse.go):

  • SLES、SLE Micro、openSUSE Leap 分别用各自 EOL 表调用通用判定函数;
  • 底层通用实现位于 pkg/detector/ospkg/version/version.go:若某版本号不在 EOL 表中,会打印一条告警并默认返回 true(按"可能为最新版本"处理),否则比较当前时间是否早于 EOL 时间点;
  • Tumbleweed 特殊处理:因为它是滚动发行版、没有版本号也没有 EOL,代码直接返回 true(注释明确写道 "tumbleweed is a rolling release, it has no version and no eol")。

pkg/detector/ospkg/suse/suse_test.goTestScanner_IsSupportedVersion 验证了:以 2019-05-31 为时间锚点时,opensuse-leap 42.3 仍受支持,而 sles 12.3 已不再支持;同时 Tumbleweed 在任何时间点都返回受支持,未知新版本(如 999.0)也被视为受支持。当检测到某版本已 EOL 时,Trivy 会在报告层面对结果进行标注(即前面功能矩阵中的 "End of life awareness")。

License:读取 RPM 元数据识别许可证

SUSE 软件的许可证识别并不依赖外部网络查询,而是直接解析 RPM 包头中携带的许可证(LICENSE)元数据字段。这正是原文档"Trivy identifies licenses by examining the metadata of RPM packages"的含义。

从代码看,pkg/fanal/analyzer/pkg/rpm/archive.go 在解包/读取 RPM 头时通过 rpmutils.LICENSE 标签取出许可证字符串并写入 types.Package.Licensesrpm.go 亦在另一条解析路径中做同样的处理。这些许可证信息随后交给许可证扫描器(总体机制见 docs/guide/scanner/license.md)做归一化与检测,例如区分 SPDX 表达式、识别自定义许可证等,最终出现在报告中的 License 结果里。RPM 归档解析的对应单测(archive_test.go)也验证了 Licenses 字段能被正确填充。

由于该链路完全依赖 RPM 头元数据,SUSE 系发行版无需额外配置即可获得软件包级许可证结果;其覆盖的完整程度取决于各软件包在打包时是否规范填写了许可证字段。

实操:在 SUSE 系统上运行扫描

将以上机制落到实际使用中,即可对 SUSE 系的容器镜像或主机文件系统直接发起扫描,例如:

# 扫描 openSUSE Leap / Tumbleweed 镜像
trivy image opensuse/leap:15.6
trivy image opensuse/tumbleweed

# 扫描本地 SUSE 系统的文件系统与运行中的 SBOM 生成
trivy fs /
trivy image --format cyclonedx --output sle15.cdx.json registry.suse.com/suse/sle15:15.6

执行时 Trivy 会依次完成:识别 OS 为 SUSE 家族(依据 os-release)→ 解析 RPM 包数据库得到软件包清单(SBOM 来源)→ 读取 RPM 许可证元数据 → 依据 SUSE CVRF 通告匹配漏洞(必要时结合 EOL 判定提示系统版本状态)。不同发行版/版本所走的 scanner 分支,则取决于上文介绍的 NewScanner 类型映射。

需要留意两点限制:其一,SUSE 场景不支持 "Unfixed vulnerabilities" 的输出,报告中只会呈现通告中已给出修复版本的漏洞;其二,如果发行版/版本已超过仓库内置 EOL 日期表所记录的生命周期终点,Trivy 会给出相应提示。若你希望查看漏洞的依赖来源(Dependency graph)或按状态过滤结果,可参考 docs/guide/configuration/reporting.mddocs/guide/configuration/filtering.md

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.14 K
2.75 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
857
1.35 K
docsdocs
暂无描述
Markdown
898
5.82 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
531
596
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
921
1.84 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.8 K
1.02 K
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.36 K
1.46 K
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
1.02 K
519
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
548
391