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

发布时间:2026/8/21 17:16:18
一招搞定依赖盘点:用 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/world、package-lock.json、go.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:表示直接从镜像仓库拉取不依赖本机 Dockerdocker-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-json2.2CycloneDX 也支持类似的多格式输出例如-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/新手最容易踩的五个坑这些坑都是真实发生过、并且能现场复现的提前知道能省不少时间。坑一把scan和convert混为一谈。scan是从镜像或目录生成 SBOMconvert是拿现成的 SBOM 文件做格式转换输入完全不是一回事。想转换先得有 SBOM 文件。坑二默认只扫描最终可见的软件。Syft 默认的--scope是squashed只扫最终镜像里可见的层构建过程中被删除的包不会被记录。要覆盖全部镜像层显式指定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两小时的要求五分钟就能交差而且格式标准、内容完整、可直接归档。所以给你的行动建议很具体今晚就对最常用的那个镜像执行一次syft scan 镜像 -o syft-json./sbom.json在发版脚本里加上dir:目录扫描把 SBOM 作为构建产物之一如果还没有漏洞扫描环节把生成的 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),仅供参考