领先一步
VMware 提供培训和认证,以加快您的进度。
了解更多Spring Boot 3.3.0 已发布,它包含对 SBOM 的支持。 SBOM 代表“软件物料清单”,它描述了用于构建软件工件的组件。在本博文中,指的是您的 Spring Boot 应用程序。这些 SBOM 很有用,因为它们准确地描述了您的应用程序包含的内容。通过这些信息,您可以评估安全漏洞是否会影响您的应用程序,或者使用自动化安全工具扫描您的应用程序并提醒您注意安全漏洞。
存在多种 SBOM 格式,最广泛使用的是 CycloneDX、SPDX 和 Syft。Spring Boot 3.3.0 原生支持 CycloneDX。该支持包含三个支柱:
让我们看看它是如何工作的
首先,在 start.spring.io 上生成一个新项目(确保选择 Spring Boot 3.3.0),并包含以下依赖项:
现在在您的 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,并将 SBOM 包含在 uber jar 中。如果您查看 uber jar 的内容,您会在META-INF/sbom/application.cdx.json
中找到 SBOM。Spring Boot 还将位置和格式添加到 jar 清单中,以便扫描工具可以找到它。
Sbom-Location: META-INF/sbom/application.cdx.json
Sbom-Format: CycloneDX
现在,如果您能要求正在运行的应用程序提供 SBOM,以便您确切地知道服务器上运行的内容,那不是很好吗?
为此,我们需要公开 SBOM 执行器端点,默认情况下该端点未公开。但这很容易。将以下内容添加到您的应用程序配置文件中:
management.endpoints.web.exposure.include=health,sbom
现在重新构建应用程序并从 jar 文件运行它。启动完成后,您可以查询 SBOM 执行器端点:
curl https://127.0.0.1:8080/actuator/sbom
HTTP/1.1 200
Content-Type: application/vnd.spring-boot.actuator.v3+json
{"ids":["application"]}
这将返回一些 JSON,其中包含所有 SBOM 的 ID。可能有多个 SBOM:一个描述您的应用程序,一个描述您的 JVM,一个描述您的操作系统等。默认情况下,只有一个名为application
的 SBOM,描述您的 Spring Boot 应用程序。
查看application
SBOM:
curl -i https://127.0.0.1:8080/actuator/sbom/application
HTTP/1.1 200
Content-Type: application/vnd.cyclonedx+json
Content-Length: 161738
{
"bomFormat" : "CycloneDX",
"specVersion" : "1.5",
"serialNumber" : "urn:uuid:3842be09-b12e-45ed-8038-babb72a53750",
"version" : 1,
...
这将返回一个大型 JSON 文档,描述您的应用程序的内容。它包含有关应用程序所有依赖项及其哈希值和许可证、网站和问题跟踪器 URL 等信息。它还包含有关您的应用程序的数据,例如版本号、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
中。
Spring 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 https://127.0.0.1:8080/actuator/sbom
HTTP/1.1 200
Content-Type: application/vnd.spring-boot.actuator.v3+json
{"ids":["application","jvm"]}
现在端点返回两个 SBOM:application
和jvm
。您可以使用此 curl 命令访问jvm
SBOM:
curl -i https://127.0.0.1:8080/actuator/sbom/jvm
HTTP/1.1 200
Content-Type: application/spdx+json
Content-Length: 48739
<content of the jvm SBOM>
您可以包含任意数量的 SBOM,它们都将在执行器端点上公开。
请注意,配置中引用的 SBOM 文件或资源必须存在,否则启动将失败。您可以使用optional:
作为 SBOM 位置的前缀来防止启动失败 - 如果文件不存在,Spring Boot 将忽略它。
我们希望您喜欢此功能,并希望它能帮助您保护软件供应链的安全。
请告诉我们您对这个新功能的看法,并且像往常一样,如果您发现任何问题,请随时 访问我们的问题跟踪器。