软件物料清单 (SBOM)¶
警告
此功能为实验性功能,可能会有破坏性更改。更多信息请参阅Conan 稳定性部分。
软件物料清单 (SBOM) 是一份文档,其中列出了构成特定软件的所有组件、库、依赖项以及其他元素。与制造中的物料清单(详细说明构建产品所使用的零件和材料)类似,SBOM 提供了有关应用程序或软件系统“内部”包含内容的透明度。
Conan 允许您通过使用解析后的依赖关系图原生生成 SBOM。这样,您就可以在构建程序的同时为其创建 SBOM。
此功能仅支持 CycloneDX 版本 1.4 和 1.6。如果您需要不同的标准、其他版本,或者遇到任何潜在的改进,请随时在我们 的 GitHub 上提交 issue。我们非常乐意听取您的反馈!
CycloneDX¶
Conan 开箱即支持 CycloneDX,这是 SBOM 使用最广泛的标准之一。
CycloneDX 工具位于 conan.tools.sbom
模块中。它提供了 cyclonedx_1_4
和 cyclonedx_1_6
函数,这些函数接收一个 conanfile
并返回一个以 CycloneDX JSON 格式包含 SBOM 数据的字典。
使用此功能就像在客户端实现一个 hook 来使用此工具创建 SBOM 并将其存储在适当的位置一样简单。
使用示例¶
让我们看两个例子
第一个例子中,我们希望在创建应用程序时,在 package 方法之后生成 SBOM。这对于 跟踪构建我们软件所使用的组件和依赖项 非常 有用。在示例中,我们将生成的 sbom 保存在 package 元数据文件夹中,以保持项目整洁。
import json
import os
from conan.api.output import ConanOutput
from conan.tools.sbom import cyclonedx_1_6
def post_package(conanfile, **kwargs):
sbom_cyclonedx_1_6 = cyclonedx_1_6(conanfile)
metadata_folder = conanfile.package_metadata_folder
file_name = "sbom.cdx.json"
with open(os.path.join(metadata_folder, file_name), 'w') as f:
json.dump(sbom_cyclonedx_1_6, f, indent=4)
ConanOutput().success(f"CYCLONEDX CREATED - {conanfile.package_metadata_folder}")
另请参阅
第二个例子中,我们在 generate 方法之后生成 SBOM。这使我们能够在安装 Conan 的依赖项时生成 SBOM。这对于生成不同版本依赖项的 SBOM 非常有用。请注意,这次我们将 SBOM 保存在 generators 文件夹中,以便安装依赖项的用户可以轻松访问 SBOM。
import json
import os
from conan.api.output import ConanOutput
from conan.tools.sbom import cyclonedx_1_6
def post_generate(conanfile, **kwargs):
sbom_cyclonedx_1_6 = cyclonedx_1_6(conanfile)
generators_folder = conanfile.generators_folder
file_name = "sbom.cdx.json"
os.mkdir(os.path.join(generators_folder, "sbom"))
with open(os.path.join(generators_folder, "sbom", file_name), 'w') as f:
json.dump(sbom_cyclonedx_1_6, f, indent=4)
ConanOutput().success(f"CYCLONEDX CREATED - {conanfile.generators_folder}")
这两个 hook 可以共存,这样我们就可以分别生成应用程序及其依赖项的 SBOM。这可以极大地帮助我们对开发过程进行持续分析,并确保软件质量。
另请参阅
生成基于 Conan 的 SBOM¶
与使用标准格式不同,我们可以采取“基于 Conan 的方法”。利用 conanfile.subgraph.serialize()
函数,我们可以直接获取有关我们包依赖项的信息。在下面的示例中,我们可以看到一个 hook,它通过序列化子图来生成简化的 SBOM,该子图包含 Conan 拥有的关于特定依赖项的所有数据。请注意,此序列化 不是标准的 SBOM 格式,也不是以任何方式标准化的。这些信息与 conan graph info ... --format=json 命令提供的信息类似。
import json
import os
from conan.api.output import ConanOutput
def post_package(conanfile, **kwargs):
metadata_folder = conanfile.package_metadata_folder
file_name = "sbom.conan.json"
with open(os.path.join(metadata_folder, file_name), 'w') as f:
json.dump(conanfile.subgraph.serialize(), f, indent=2)
ConanOutput().success(f"CONAN SBOM CREATED - {conanfile.package_metadata_folder}")
Artifactory Build Info¶
使用 Conan,您还可以选择创建 “build info”,它提供有关您的 Artifactory 中生成的构建的详细信息。它允许您查看(除其他外)创建构建所需的版本、构件、模块和依赖项的历史记录。
这是一个专注于 Artifactory 本身内部流程的 SBOM,非常适合维护二进制文件生命周期的可追溯性。
遗憾的是,它并非在 Conan 中原生可用,因此需要从 conan-extensions
安装该命令。您可以在下面的链接中找到更多信息。