37 创建软件物料清单
能够为项目构建镜像、确认所有软件组件的许可证(见 “处理许可证”)并应用漏洞修复(见 “检查漏洞”)后, OpenEmbedded 构建系统可以生成一份说明,列出使用的所有组件、许可证、依赖、 源码、应用的变更以及已修复的已知漏洞。
这份说明以 软件物料清单 ( SBOM )的形式生成,采用 SPDX 标准。
发布软件时,这是提供软件镜像和 SDK 软件供应链信息的最标准方式。 SBOM 工具常用于确保开源许可证合规:它提供产品所用的许可证文本, 使法务部门和最终用户能够以标准格式阅读。
SBOM 列出了软件供应链使用的全部组件,因此对于评估漏洞暴露情况也 十分重要。
OpenEmbedded 构建系统默认生成这些信息,即在 INHERIT_DISTRO 中 继承 create-spdx 类。
如果需要,可以在 configuration file 中禁用:
INHERIT_DISTRO:remove = "create-spdx"
有两种生成 SBOM 元数据的方式:
构建镜像后,可在 Build Directory 的
tmp/deploy/images/MACHINE/中获得 JSON 格式的 SPDX 输出,文件名为IMAGE-MACHINE.spdx.json。仅使用配方元数据生成 SBOM 文档:
$ bitbake <recipe> -c create_recipe_sbom
镜像 SBOM 文档也包含配方 SBOM,但仅限参与该镜像构建的配方。
create-spdx 类提供了以下选项,以便在输出的 SPDX 数据中包含更多信息:
设置 SPDX_PRETTY,使 JSON 文件更便于阅读。
添加用于生成主机工具和目标软件包的源文件说明( SPDX_INCLUDE_SOURCES )。
添加用于生成主机工具和目标软件包的 已编译 源文件说明 ( SPDX_INCLUDE_COMPILED_SOURCES )。
将 Linux 内核配置(
CONFIG_*参数)导出到 SPDX 文档 ( SPDX_INCLUDE_KERNEL_CONFIG )。将配方的
PACKAGECONFIG功能启用或禁用状态导出到 SPDX 文档 ( SPDX_INCLUDE_PACKAGECONFIG )。使用 Python 正则表达式从 SPDX 输出中排除特定文件 ( SPDX_FILE_EXCLUDE_PATTERNS )。
向镜像 SBOM、SDK SBOM 或单个软件包附加供应商信息 ( SPDX_IMAGE_SUPPLIER、SPDX_SDK_SUPPLIER、 SPDX_PACKAGE_SUPPLIER )。
为源码下载补充对应生态系统的软件包 URL(PURL)。通过 cargo_common、go-mod、 pypi、npm 和 cpan* 类,自动填充相应语言生态系统的 PURL 标识符。
记录由哪个代理发起构建,以及代表谁执行,使 SBOM 支持 CI/CD 可追溯性 ( SPDX_INCLUDE_BITBAKE_PARENT_BUILD、SPDX_INVOKED_BY、 SPDX_ON_BEHALF_OF )。
另见 SPDX_CUSTOM_ANNOTATION_VARS 变量,它允许为配方关联自定义注释。 SPDX 项目网站的 工具页面 列出了可读取和转换 OpenEmbedded 构建系统所生成 SPDX 数据的工具。
更多信息见 Yocto Project 参考手册词汇表 中
以 SPDX_ 开头的变量定义。
还可观看 Joshua Watt 在 FOSDEM 2023 的演讲 使用 OpenEmbedded 和 Yocto Project 自动生成 SBoM, 以及 FOSDEM 2024 的演讲 Yocto Project 中的 SPDX。