Spring Boot 3.3 的 SBOM 支援

工程 | Moritz Halbritter | 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。此支援包含三個支柱:

  • 設定 CycloneDX 外掛程式,以便在建置應用程式時產生 SBOM
  • 將產生的 SBOM 檔案封裝到 uber jar 中
  • Actuator 端點,用於公開產生的 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,並將 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,以便您確切知道伺服器上正在執行的內容,這不是很好嗎?

透過 Actuator 公開 SBOM

為此,我們需要公開 SBOM Actuator 端點,預設情況下該端點未公開。不過,這非常容易。將以下內容新增至您的應用程式組態檔

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

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

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 支援的基本用法。現在讓我們看看更進階的功能。

不同格式的應用程式 SBOM

如果您不想為您的應用程式使用 CycloneDX SBOM,而是偏好不同的格式,您也可以做到。但是,您必須自行設定建立 SBOM 的外掛程式。在撰寫本文時,Spring Boot 只會自動設定 CycloneDX 外掛程式。

在您設定建置以建立 SBOM 後,您可以使用 management.endpoint.sbom.application.location 屬性將 Spring Boot 指向此 SBOM。如果引用的 SBOM 格式為 CycloneDX、SPDX 或 Syft,Spring Boot 將自動偵測其類型,該類型將用於 Actuator 回應的 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://127.0.0.1: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://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,它們都將在 Actuator 端點上公開。

可選的 SBOM

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

總結

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

如果您對這項新功能有任何想法,請告訴我們。與往常一樣,如果您發現任何問題,請隨時造訪我們的問題追蹤系統

取得 Spring 電子報

隨時掌握 Spring 電子報的最新資訊

訂閱

領先一步

VMware 提供訓練與認證,以加速您的進展。

了解更多

取得支援

Tanzu Spring 在一個簡單的訂閱中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位檔案。

了解更多

即將到來的活動

查看 Spring 社群中所有即將到來的活動。

檢視全部