Spring Boot 3.3 中的 SBOM 支援

工程 | 莫里茨·哈爾布里特 | 2024 年 5 月 24 日 | ...

Spring Boot 3.3.0 已釋出,其中包含對 SBOM 的支援。SBOM 代表“軟體物料清單”(Software Bill of Materials),描述了用於構建軟體工件的元件。在本博文的上下文中,那就是您的 Spring Boot 應用程式。這些 SBOM 非常有用,因為它們精確地描述了您的應用程式包含的內容。有了這些資訊,您就可以評估安全漏洞是否會影響您的應用程式,或者使用自動安全工具掃描您的應用程式並提醒您安全漏洞。

市面上存在多種 SBOM 格式,最廣泛使用的是 CycloneDXSPDXSyft。Spring Boot 3.3.0 開箱即用地支援 CycloneDX。支援包括三個支柱:

  • 在構建應用程式時生成 SBOM 的 CycloneDX 外掛配置
  • 將生成的 SBOM 檔案打包到 uber jar 中
  • 一個執行器端點,用於公開生成的 SBOM(如果已啟用)

讓我們來看看它是如何工作的

首先,在 start.spring.io 上生成一個新專案(確保選擇 Spring Boot 3.3.0),幷包含以下依賴項:

  • Spring Web
  • 執行器 (Actuator)

現在,在您的 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 buildmvn package 命令構建您的 uber jar。在構建過程中,Spring Boot 會藉助 CycloneDX 外掛生成一個 SBOM,並將其包含在 uber jar 中。如果您檢視 uber jar 的內容,會發現在 META-INF/sbom/application.cdx.json 檔案中包含了 SBOM。Spring Boot 還會在 jar 清單中新增 SBOM 的位置和格式,以便掃描工具能夠找到它。

Sbom-Location: META-INF/sbom/application.cdx.json
Sbom-Format: CycloneDX

現在,如果您能讓正在執行的應用程式告訴您 SBOM,以便您確切地知道伺服器上執行的是什麼,那不是很棒嗎?

透過執行器公開 SBOM

為此,我們需要公開 SBOM 執行器端點,該端點預設情況下未公開。不過,這很容易。在您的應用程式配置檔案中新增以下內容:

management.endpoints.web.exposure.include=health,sbom

現在重新構建應用程式並從 jar 檔案執行它。啟動完成後,您可以查詢 SBOM 執行器端點:

curl https://: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://: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 支援的基本用法。接下來,讓我們看看更高階的功能。

不同格式的應用程式 SBOM

如果您不想為應用程式使用 CycloneDX SBOM,而是傾向於使用其他格式,您也可以這樣做。但是,您需要自己配置建立 SBOM 的外掛。在撰寫本文時,Spring Boot 只會自動配置 CycloneDX 外掛。

在配置好構建以建立 SBOM 後,您可以使用 management.endpoint.sbom.application.location 屬性將此 SBOM 指向 Spring Boot。如果引用的 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 中。

包含其他 SBOM

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://:8080/actuator/sbom

HTTP/1.1 200
Content-Type: application/vnd.spring-boot.actuator.v3+json

{"ids":["application","jvm"]}

現在,端點返回兩個 SBOM:applicationjvm。您可以使用以下 curl 命令訪問 jvm SBOM:

curl -i https://:8080/actuator/sbom/jvm

HTTP/1.1 200
Content-Type: application/spdx+json
Content-Length: 48739

<content of the jvm SBOM>

您可以包含任意數量的 SBOM,它們都將透過執行器端點公開。

可選 SBOM

請注意,配置中引用的 SBOM 檔案或資源必須存在,否則啟動會失敗。您可以在 SBOM 位置前加上 optional: 字首,以防止啟動失敗——如果檔案不存在,Spring Boot 將會忽略它。

總結

我們希望您喜歡這個功能,並且它能幫助您保護您的軟體供應鏈。

請告訴我們您對這個新功能的看法,並且一如既往,如果您發現任何問題,請隨時 訪問我們的問題跟蹤器

獲取 Spring 新聞通訊

透過 Spring 新聞通訊保持聯絡

訂閱

領先一步

VMware 提供培訓和認證,助您加速進步。

瞭解更多

獲得支援

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案,只需一份簡單的訂閱。

瞭解更多

即將舉行的活動

檢視 Spring 社群所有即將舉行的活動。

檢視所有