软件物料清单

SBOM(软件物料清单)是描述发布软件中包含的依赖项的文件或一组文件。它的目的是以可用的格式索引发布中使用的组件,例如安全团队。能够在您的软件通过 Travis CI 构建、测试并准备交付/交付后生成和交付 SBOM 有助于符合安全软件供应链策略。

Travis CI 允许为某些编程语言生成 SBOM 文件。Travis CI 从触发构建的源代码生成 SBOM。SBOM 文件可以在构建作业的特定阶段生成,用户必须通过例如在 .travis.yml 文件中提供适当的说明来将它们上传到目标位置。

或者,用户可以将特定的 SBOM 生成器下载到构建作业环境,并通过 .travis.yml 根据需要自定义 SBOM 生成过程。事实上,在特定情况下,这可能是最好的前进方向。Travis CI 为流行的构建场景提供易用性增强。

SBOM 如何工作? #

SBOM 是利用针对某些语言的 CycloneDX 插件和 Syft 生成的,它试图涵盖其余用例。它的工作原理非常简单

  1. Travis CI 用户在特定构建作业的存储库中放入 .travis.yml,该作业应该构建 SBOM
    1. 新的 addons.sbom 指令。
    2. 其他说明,例如使用 Travis CI DPLDPLv2,或自定义命令将生成的 SBOM 文件部署或移动到所需的目标位置。
  2. 构建和相应的构建作业在 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)。 了解更多