Spring Boot 3.3.0 已经发布,它包含了对 SBOM 的支持。SBOM 代表 "软件材料清单",它描述了构建软件工件所使用的组件。在这篇博客文章的背景下,它指的是您的 Spring Boot 应用程序。这些 SBOM 非常有用,因为它们准确地描述了您的应用程序包含的内容。
有了这些信息,您可以评估安全漏洞是否影响您的应用程序,或者使用自动化安全工具扫描您的应用程序并在发现安全漏洞时发出警报。
目前有多种 SBOM 格式,最广泛使用的是 CycloneDX、SPDX 和 Syft。Spring Boot 3.3.0原生支持 CycloneDX。支持包括三个支柱:
配置 CycloneDX插件以在构建应用程序时生成 SBOM将生成的 SBOM 文件打包到 uber jar 中如果启用,通过执行器端点暴露生成的 SBOM让我们看看这在实际操作中是如何工作的:
首先,在 start.spring.io上生成一个新项目(确保选择 Spring Boot 3.3.0),并包括以下依赖项:
Spring WebActuator现在在您的 IDE 中打开生成的项目,如果您使用的是 Gradle,请在 build.gradle 中添加以下内容:
plugins { id 'org.cyclonedx.bom' version '1.8.2'}这将应用 CycloneDX Gradle 插件到您的构建中。Spring Boot 会检测到这一点并自动配置插件,您不需要再做任何更改。
如果您使用的是 Maven,请在 pom.xml 中添加以下内容:
<plugins> <plugin> <groupId>org.cyclonedx</groupId> <artifactId>cyclonedx-maven-plugin</artifactId> </plugin></plugins>这将添加 CycloneDX Maven 插件到您的构建中。Spring Boot 通过其父项目自动管理此插件的版本,并且也会自动配置插件。
现在使用 gradle build 或 mvn package 构建您的 uber jar。在构建过程中,Spring Boot 通过 CycloneDX 插件的帮助生成 SBOM 并将其包含在 uber jar 中。如果您查看 uber jar 的内容,您会在 META-INF/sbom/application.cdx.json 中找到 SBOM。Spring Boot 还将位置和格式添加到 jar 清单中,以便扫描工具可以找到它:
Sbom-Location: META-INF/sbom/application.cdx.jsonSbom-Format: CycloneDX现在,如果您可以要求运行中的应用程序提供 SBOM,以便您确切知道服务器上运行的是什么,那不是很好吗?
二、通过执行器永久链接暴露 SBOM为此,我们需要暴露 SBOM 执行器端点,默认情况下它不是暴露的。不过这相当容易。将以下内容添加到您的应用程序配置文件中:
management.endpoints.web.exposure.include=health,sbom现在重新构建应用程序,并从 jar 文件运行它。启动完成后,您可以查询 SBOM 执行器端点:
curl http://localhost:8080/actuator/sbomHTTP/1.1 200Content-Type: application/vnd.spring-boot.actuator.v3+json{"ids": ["application"]}这将返回一些包含所有 SBOM ID 的 JSON。可以有多个 SBOM:一个描述您的应用程序,一个描述您的 JVM,一个描述您的操作系统等。默认情况下,只有一个名为 application 的 SBOM,描述您的 Spring Boot 应用程序。
看看 application SBOM:
curl -i http://localhost:8080/actuator/sbom/applicationHTTP/1.1 200Content-Type: application/vnd.cyclonedx+jsonContent-Length: 161738{ "bomFormat" : "CycloneDX", "specVersion" : "1.5", "serialNumber" : "urn:uuid:3842be09-b12e-45ed-8038-babb72a53750", "version" : 1, ...这将返回一个描述您应用程序内容的大型 JSON 文档。它包含有关应用程序所有依赖项的信息,包括它们的哈希和许可证,网站和问题跟踪器 URL 等。它还包含有关您的应用程序的数据,例如版本号,SBOM 生成的时间等。有了这些信息,您将确切知道服务器上运行的是什么。
这涵盖了 SBOM 支持的基本使用。现在让我们看看更高级的功能。
三、应用程序 SBOM 采用不同的格式如果您不想为您的应用程序使用 CycloneDX SBOM,而更倾向于使用不同的格式,您也可以这样做。但是,您必须自己配置创建 SBOM 的插件。在撰写本文时,Spring Boot 只自动配置 CycloneDX 插件。
在您配置了构建以创建 SBOM 之后,您可以使用 management.endpoint.sbom.application.location 属性指向 Spring Boot 的这个 SBOM。如果引用的 SBOM 是 CycloneDX、SPDX 或 Syft 格式,Spring Boot 将自动检测其类型,这将用于执行器响应的 Content-Type 头。如果您使用不同的格式,您可以使用 management.endpoint.sbom.application.media-type 属性显式指定 SBOM 的媒体类型。以下示例展示了如何使用 SPDX 格式的 SBOM:
management.endpoint.sbom.application.location=classpath:/sbom/application.spdx.json为此工作,SPDX SBOM 必须存储在 src/main/resources/sbom/application.spdx.json 中。
四、包括额外的 SBOMsSpring Boot 支持每个应用程序有多个 SBOM。如果您想包括额外的 SBOM,您可以使用 management.endpoint.sbom.additional 下的配置属性。例如,添加一个名为 jvm 的 SBOM 如下所示:
management.endpoint.sbom.additional.jvm.location=file:/path/to/sbom.json这个 jvm SBOM 存储在文件系统中的 /path/to/sbom.json。您需要自己生成此 SBOM,或者您的 JVM 供应商需要提供一个。
与应用程序 SBOM 一样,如果引用的 SBOM 是 CycloneDX、SPDX 或 Syft 格式,Spring Boot 将自动检测其类型。否则,您可以使用以下属性自己设置媒体类型:
management.endpoint.sbom.additional.jvm.media-type=application/json使用此配置启动应用程序后,您可以再次运行以下 curl 命令:
curl -i http://localhost:8080/actuator/sbomHTTP/1.1 200Content-Type: application/vnd.spring-boot.actuator.v3+json{"ids": ["application","jvm"]}现在端点返回两个 SBOM:application 和 jvm。您可以使用此 curl 命令访问 jvm SBOM:
curl -i http://localhost:8080/actuator/sbom/jvmHTTP/1.1 200Content-Type: application/spdx+jsonContent-Length: 48739<content of the jvm SBOM>您可以包括任意多的 SBOM,它们都将在执行器端点上暴露。
五、可选的 SBOMs请注意,从配置中引用的 SBOM 文件或资源必须存在,否则启动将失败。您可以通过在 SBOM 位置前缀 optional: 来防止启动失败 - 如果文件不存在,Spring Boot 将仅忽略它。
六、总结我们希望您喜欢这个功能,并希望它能帮助您保护您的软件供应链。