Spring Boot 3.3 中的 SBOM 支援

工程 | Moritz Halbritter | 2024 年 5 月 24 日 | ...

Spring Boot 3.3.0 已經發布,其中包含對 SBOM 的支援。SBOM 代表“軟體物料清單”(Software Bill of Materials),它描述了用於構建軟體製品(artifact)的元件。在本部落格文章中,製品即指您的 Spring Boot 應用。這些 SBOM 非常有用,因為它們準確地描述了您的應用包含的內容。有了這些資訊,您可以評估安全漏洞是否影響您的應用,或者使用自動化安全工具掃描您的應用並提醒您安全漏洞。

目前存在多種 SBOM 格式,最廣泛使用的包括 CycloneDXSPDXSyft。Spring Boot 3.3.0 開箱即用地支援 CycloneDX。該支援由三個主要部分構成:

  • 配置 CycloneDX 外掛,以便在構建應用時生成 SBOM
  • 將生成的 SBOM 檔案打包到 uber jar 中
  • 一個用於暴露生成的 SBOM(如果啟用)的 actuator 端點

讓我們看看這是如何工作的

首先,在 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 還會將 SBOM 的位置和格式新增到 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://:8080/actuator/sbom

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

{"ids":["application"]}

這將返回包含所有 SBOM ID 的 JSON。可以有多個 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 屬性將 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://: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,它們都將透過 actuator 端點暴露。

可選的 SBOM

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

總結

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

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

訂閱 Spring 新聞稿

訂閱 Spring 新聞稿,保持聯絡

訂閱

保持領先

VMware 提供培訓和認證,助您快速提升。

瞭解更多

獲取支援

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

瞭解更多

即將舉行的活動

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

檢視全部