软件物料清单
SBOM(软件物料清单)是描述发布软件中包含的依赖项的文件或一组文件。它的目的是以可用的格式索引发布中使用的组件,例如安全团队。能够在您的软件通过 Travis CI 构建、测试并准备交付/交付后生成和交付 SBOM 有助于符合安全软件供应链策略。
Travis CI 允许为某些编程语言生成 SBOM 文件。Travis CI 从触发构建的源代码生成 SBOM。SBOM 文件可以在构建作业的特定阶段生成,用户必须通过例如在 .travis.yml
文件中提供适当的说明来将它们上传到目标位置。
或者,用户可以将特定的 SBOM 生成器下载到构建作业环境,并通过 .travis.yml
根据需要自定义 SBOM 生成过程。事实上,在特定情况下,这可能是最好的前进方向。Travis CI 为流行的构建场景提供易用性增强。
SBOM 如何工作? #
SBOM 是利用针对某些语言的 CycloneDX 插件和 Syft 生成的,它试图涵盖其余用例。它的工作原理非常简单
- Travis CI 用户在特定构建作业的存储库中放入
.travis.yml
,该作业应该构建 SBOM - 构建和相应的构建作业在 Travis CI 上运行;适当的工具被下载到构建作业并根据
.travis.yml
条目运行。
SBOM 生成在 Linux 构建环境下可用(对于 Linux 构建作业)。
支持的语言和包管理器 #
目前,您可以在您的存储库中为以下编程语言生成 SBOM,假设使用了某些包管理器。
- Ruby
- Python
- Go
- Node.js / JavaScript 和 NPM
- PHP
该工具将尝试使用上述组合的相应 CycloneDX 插件。对于其余语言,Travis CI 将运行 Syft 来构建 SBOM。
SBOM 文件的默认输出是与 CycloneDX 兼容的 JSON。但是,可以请求与 CycloneDX 兼容的 XML 或 SPDX JSON。
如何在 .travis.yml 中触发 SBOM 生成? #
在现有的 addons
部分中添加了一个新节点,专门用于帮助处理 SBOM 生成指令。
最简单的调用如下所示
jobs: # existing functionality
include: # existing functionality
- os: linux
dist: focal
name: "SBOM generation example job"
addons:
sbom # new node
<other existing addons>
上述作业定义将触发一个名为“sbom”的作业,该作业将从存储库源生成 SBOM 文件。为了利用 SBOM 生成,可以使用一些额外的参数来管理 SBOM 生成过程。
jobs:
include:
- os: linux
dist: focal
addons:
sbom: # new node
on:
branch: 'branch_name_here' # branch of the repository
run_phase: 'after_success' # when SBOM generation should be executed; see below
output_format: 'cyclonedx-json' # SBOM file(s) output format
input_dir: '/sbom/ruby' # relative paths within build job environments, see below
output_dir: '/sbom/ruby'
新的 sbom
节点具有以下可用属性
on.branch
- 默认情况下,SBOM 生成器为从所有分支触发构建的提交启用。但是,这可能不是期望的状态,因此,在这里,用户可以提供一个分支名称来将 SBOM 生成限制为,例如,release 分支构建。run_phase
- 指的是构建作业阶段。 构建具有分组作业的阶段,作业具有特定阶段。默认情况下,SBOM 生成被设置为在 on_success 作业 生命周期阶段 运行(假设在单作业构建的情况下,您希望为成功构建和测试运行生成 SBOM)。允许的值是before_script
- 在脚本阶段之前script
- 通常是主要构建作业指令阶段after_success
(默认值) - 当构建作业成功时,结果在 TRAVIS_TEST_RESULT 环境变量中可用after_failure
output_format
- 定义输出文件(s) 的 SBOM 格式。默认情况下,这被设置为 cyclonedx-json。允许的值是cyclonedx-json
- CycloneDX SBOM 格式,JSON 文件cyclonedx-xml
- CycloneDX SBOM 格式,XML 文件spdx-xml
- SPDX SBOM 格式,XML 文件
input_dir
- 是一个输入源代码目录,其中包含与编程语言相对应的包管理器文件。它相对于构建作业环境。SBOM 输入的默认路径是构建输入目录 */home/travis/build/*. 但是,如果特定的软件源代码部分保存在存储库子目录中(例如,应用程序的前端或后端,或例如 */lib* 子目录),您可能希望仅在该子目录上生成 SBOM。为了做到这一点,`input_dir: / `(它将 *home/travis/build/ / * 作为输入目录)应明确提供。 output_dir
- 这是输出目录,SBOM 文件(s) 在 SBOM 生成完成后被放置在该目录中。默认的输出路径应该是 */home/travis/build//sbom- * 其中 TRAVIS_JOB_ID 是构建作业中存在的 [默认环境变量](/user/environment-variables/#default-environment-variables)。如果使用此参数,例如,提供了 `output_dir: /my_subdir`,则 SBOM 文件被放置在相对于 */home/travis/build/ * 的子目录中,例如,在 `/home/travis/build/ /my_subdir`
如何将 SBOM 文件(s) 部署到目标位置? #
Travis CI 不维护 SBOM 注册表。每个用户都可以自由地从 output_dir
位置获取生成的 SBOM 文件,并通过放置在 .travis.yml
中的适当说明将它们传输到选定的目标位置。
请注意:传输 SBOM 文件必须在 SBOM 生成之后发生的构建作业阶段中定义!
请记住,Travis CI 构建作业环境是短暂的,构建作业完成后,环境将被销毁。因此,如果要发送或部署 SBOM 文件(s),部署步骤必须在生成 SBOM 文件的同一构建作业中进行。
可以使用 Travis CI 部署 功能来使 .travis.yml
中的说明保持一致,并将 SBOM 文件(s) 与您的发布包一起部署。部署生成的 SBOM 文件的示例如下所示
jobs:
include:
- os: linux
dist: focal
name: SBOM Ruby
os: linux
language: ruby
script:
- gem build ./sbom/ruby/hello_world.gemspec
addons:
sbom:
on:
branch: 'sbom'
run_phase: 'after_success'
output_format: 'cyclonedx-json'
input_dir: '/sbom/ruby'
output_dir: '/sbom/ruby'
deploy:
- provider: releases # deploying to GitHub Releases
edge: true
file_glob: true
file: sbom/ruby/**/*
skip_cleanup: true
on:
branch: sbom
- provider: s3 # deploying to target AWS S3 Bucket
edge: true
bucket: "sbom-test"
skip_cleanup: true
local_dir: sbom/ruby
on:
branch: sbom
在我们的 测试存储库 中查看更多示例。
备注 #
如果生成了多个 SBOM 文件,请在将它们发送到目标位置之前将它们打包成一个文件。出于安全原因,如果您将 SBOM 文件(s) 的内容输出到构建作业日志,您可能希望限制对该类作业日志的访问。 了解更多。在部署包之前,请考虑签署您的发布和 SBOM 文件(s)。 了解更多。