news 2026/8/21 17:16:00

一招搞定依赖盘点:用 Syft 扫描工具快速生成 SBOM 清单

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
一招搞定依赖盘点:用 Syft 扫描工具快速生成 SBOM 清单

一招搞定依赖盘点:用 Syft 扫描工具快速生成 SBOM 清单

【免费下载链接】syftCLI tool and library for generating a Software Bill of Materials from container images and filesystems项目地址: https://gitcode.com/GitHub_Trending/sy/syft

深夜的生产告警把团队拉回工位:一个被广泛使用的第三方库刚曝出高危漏洞,老板要求两小时内给出完整的依赖清单。对着几百个包逐个翻配置文件显然不现实,而 Syft 扫描工具正是为这种时刻准备的——一条命令,就能从容器镜像或文件系统里生成标准的 SBOM(软件物料清单)。

一次事故的复盘:依赖清单到底该从哪里来

那晚我们的排查方式大概是这样:先docker inspect看镜像元数据,再进容器逐个翻/etc/apk/worldpackage-lock.jsongo.mod,最后还要人工汇总成 Excel。三个小时过去,清单不仅不完整,还把测试环境的包也混了进去。

事后反思,问题出在"盘点依赖"这件事本身没有工具化。容器镜像里的软件包分散在各层的包管理数据库、锁文件、归档文件中,靠人眼识别既慢又漏。而 SBOM 恰恰解决的就是"一个镜像/目录里到底有什么"这个问题的标准化答案,Syft 就是生成这份答案的专用扫描工具。

认识主角:Syft 帮你做什么、不做什么

Syft 是一个用于从容器镜像和文件系统生成 SBOM 的 CLI 工具与 Go 库,核心能力可以概括为三句话:

  • 识别:自动发现镜像或目录中的操作系统包(apk、dpkg、rpm)与各语言生态包(Python、Java、JavaScript、Go、Rust、Ruby、PHP、.NET 等)
  • 输出:把结果序列化为 Syft JSON、CycloneDX、SPDX 等主流 SBOM 格式
  • 转换:在不同 SBOM 格式之间互相转换,便于对接不同工具链

它不做的事同样重要:Syft 只负责"有什么",不负责"有没有漏洞"。漏洞比对通常交给 Grype 这类扫描器去完成,两者配合使用是社区里的常见组合。

三分钟完成首次安装

安装最省事的路径是官方安装脚本,一条命令即可:

curl -sSfL https://get.anchore.io/syft | sudo sh -s -- -b /usr/local/bin

这段命令解决的是"快速获得可执行文件"的问题。装好后验证版本:

syft version

如果你更习惯从源码构建,也可以把仓库克隆到本地后自行编译:

git clone https://gitcode.com/GitHub_Trending/sy/syft cd syft && go build -o syft ./cmd/syft

关键点:源码方式对 Go 环境版本有要求,遇到编译报错先检查go.mod里声明的 Go 版本;日常使用还是推荐官方脚本,五分钟内就能跑起来。

第一次实战:给线上镜像生成一份合规 SBOM

场景是这样的:安全团队要求所有上生产的镜像都必须附一份 SPDX 格式的 SBOM 存档。手动整理是不可能的,Syft 一条命令就能搞定。

第一步:确认数据源写法

先扫描镜像,看看到底能识别出什么:

syft scan nginx:latest

默认走 Docker 守护进程,输出的是人眼友好的包摘要表格。如果想强制走某一种数据源,显式写出 scheme 更稳妥:

syft scan registry:nginx:latest syft scan docker:nginx:latest syft scan docker-archive:./nginx.tar syft scan oci-archive:./nginx.oci.tar syft scan dir:./my-app syft scan file:./single.jar

这段命令解决的是"明确告诉 Syft 从哪读数据"的问题。registry:表示直接从镜像仓库拉取(不依赖本机 Docker),docker-archive:对应docker save导出的 tar 包,dir:file:则用于扫描普通目录与单个文件。

关键点:不加 scheme 时,Syft 会自行推断;但显式声明可以让行为完全可预期,这在 CI 脚本里尤其重要。

第二步:输出合规格式并存档

syft scan registry:nginx:latest -o spdx-json=./nginx.spdx.json

这段命令解决的是"生成 SPDX JSON 格式的 SBOM 文件"的问题。-o 格式=文件路径的写法会把结果写入文件,而不是刷屏标准输出。

关键点:SPDX 有两个大版本(2.2 与 2.3),需要指定旧版本时写作-o spdx-json@2.2;CycloneDX 也支持类似的多格式输出,例如-o cyclonedx-json=./nginx.cdx.json

第三步:检查生成结果

syft convert nginx.spdx.json -o cyclonedx-json

这段命令解决的是"验证 SBOM 可被解析、并顺手转成另一种格式"的问题。能转换成功,说明这份文件结构完整,可以被下游工具消费。

预期结果:SPDX 文件里能看到 nginx 镜像的操作系统包(如 alpine 的 apk 包)以及各语言依赖的完整清单,含名称、版本、许可证、来源文件路径等信息。

第二次实战:把目录扫描接进 CI 流水线

第二个场景来自日常开发:每次发版前,想自动生成项目的依赖清单,并排除掉无关目录。

syft scan dir:./backend -o syft-json=./backend.sbom.json --exclude node_modules --exclude .git

这段命令解决的是"扫描项目目录但跳过无关大目录"的问题。--exclude支持多次指定,node_modules.git这类目录既拖慢扫描又毫无信息量,排除后速度立竿见影。

如果只想关注特定类型的包,用--select-catalogers收窄范围:

syft scan dir:./backend --select-catalogers python-package-cataloger,java-archive-cataloger -o syft-json

这段命令解决的是"只让关心的目录器干活"的问题。先运行syft cataloger list查看全部可用目录器及其名称,再按需挑选,扫描时间和噪音都会显著下降。

关键点:--select-catalogers接收的是目录器名称列表,名称可以带通配符;写错名称时 Syft 会给出明确的表达式错误提示,把正确写法列出来。

进阶玩法:从能用走向好用

多格式一次输出

一次扫描同时产出多份 SBOM,省去重复扫描:

syft scan alpine:latest -o syft-json=./a.json -o spdx-json=./b.json -o cyclonedx-json=./c.json

用模板定制自己的报告

内置格式不够贴合团队习惯时,可以写一个 Go 模板文件,用-t指定:

syft scan alpine:latest -o template -t my_report.tmpl

用平台参数避免多架构踩坑

多架构环境下,显式指定目标平台,避免扫到错误的架构层:

syft scan alpine:latest --platform linux/arm64

把扫描写进脚本时记得加日志

排查问题时-vv能输出详细调试信息;自动化脚本里建议配合超时控制,防止镜像拉取卡死整个流水线。

这些能力分别对应源码中的命令实现,想深入研究可以看这几个模块:

  • 扫描命令实现:cmd/syft/internal/commands/scan.go
  • 格式转换实现:cmd/syft/internal/commands/convert.go
  • 目录器列表实现:cmd/syft/internal/commands/cataloger_list.go
  • 各语言包目录器:syft/pkg/cataloger/

新手最容易踩的五个坑

这些坑都是真实发生过、并且能现场复现的,提前知道能省不少时间。

坑一:把scanconvert混为一谈。scan是从镜像或目录生成 SBOM,convert是拿现成的 SBOM 文件做格式转换,输入完全不是一回事。想转换先得有 SBOM 文件。

坑二:默认只扫描最终可见的软件。Syft 默认的--scopesquashed(只扫最终镜像里可见的层),构建过程中被删除的包不会被记录。要覆盖全部镜像层,显式指定:

syft scan <image> --scope all-layers

坑三:格式参数写错却不自知。常见的错误是把-o spdx-json写成-o spdx或反过来。spdx是 Tag-Value 格式,spdx-json是 JSON 格式,两者差异很大,消费方认错格式会直接解析失败。

坑四:不加 scheme 导致镜像源混乱。本机没装 Docker 时,裸写镜像名会走 registry 拉取;装了 Docker 时默认走守护进程。两种路径拿到的层数据可能不一样,脚本里请显式写registry:docker:

坑五:目录器全开导致扫描极慢。大型项目上默认全量目录器可能要扫很久,先用syft cataloger list摸清范围,再用--select-catalogers收窄,是提速最有效的一招。

下一步:今晚就给自己造一份 SBOM

回到开头那场事故:如果当时流水线里已经留了一份 SBOM,两小时的要求五分钟就能交差,而且格式标准、内容完整、可直接归档。

所以给你的行动建议很具体:

  1. 今晚就对最常用的那个镜像执行一次syft scan <镜像> -o syft-json=./sbom.json
  2. 在发版脚本里加上dir:目录扫描,把 SBOM 作为构建产物之一
  3. 如果还没有漏洞扫描环节,把生成的 SBOM 喂给 Grype 这类漏洞扫描工具,让"有什么"和"有没有洞"真正闭环

依赖盘点不该靠加班,一次配置,长期受益。现在就可以在终端里敲下第一条syft scan命令,把那份属于你项目的软件物料清单跑出来。

【免费下载链接】syftCLI tool and library for generating a Software Bill of Materials from container images and filesystems项目地址: https://gitcode.com/GitHub_Trending/sy/syft

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/21 17:11:40

BetterNCM 指南:三步启用网易云音乐插件管理

BetterNCM 指南&#xff1a;三步启用网易云音乐插件管理 【免费下载链接】chromatic Universal modifier for Chromium/V8 | 广谱注入 Chromium/V8 的通用修改器 项目地址: https://gitcode.com/gh_mirrors/be/chromatic BetterNCM 网易云音乐插件管理器&#xff0c;是面…

作者头像 李华
网站建设 2026/8/21 17:08:57

一首歌不用手动下:NeteaseCloudMusicFlac无损音乐FLAC批量下载完整指南

一首歌不用手动下&#xff1a;NeteaseCloudMusicFlac无损音乐FLAC批量下载完整指南 【免费下载链接】NeteaseCloudMusicFlac 根据网易云音乐的歌单, 下载flac无损音乐到本地.。 项目地址: https://gitcode.com/gh_mirrors/nete/NeteaseCloudMusicFlac 你有没有想过把一整…

作者头像 李华
网站建设 2026/8/21 17:06:38

Claude Desktop for Linux网络连接排查指南:5步从现象定位到根因

Claude Desktop for Linux网络连接排查指南&#xff1a;5步从现象定位到根因 【免费下载链接】claude-desktop-debian Claude Desktop for Linux 项目地址: https://gitcode.com/GitHub_Trending/cl/claude-desktop-debian Claude Desktop for Linux 是面向 Linux 桌面的…

作者头像 李华