一、簡介
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 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 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.json
Sbom-Format: CycloneDX
現在,如果您可以要求執行中的應用程式提供 SBOM,以便您確切知道伺服器上執行的是什麽,那不是很好嗎?
二、透過執行器永久連結暴露 SBOM
為此,我們需要暴露 SBOM 執行器端點,預設情況下它不是暴露的。不過這相當容易。將以下內容添加到您的應用程式配置檔中:
management.endpoints.web.exposure.include=health,sbom
現在重新構建應用程式,並從 jar 檔執行它。啟動完成後,您可以查詢 SBOM 執行器端點:
curl http://localhost: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 http://localhost: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 將自動檢測其型別,這將用於執行器響應的
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
中。
四、包括額外的 SBOMs
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 http://localhost: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 http://localhost:8080/actuator/sbom/jvm
HTTP/1.1 200
Content-Type: application/spdx+json
Content-Length: 48739
<content of the jvm SBOM>
您可以包括任意多的 SBOM,它們都將在執行器端點上暴露。
五、可選的 SBOMs
請註意,從配置中參照的 SBOM 檔或資源必須存在,否則啟動將失敗。您可以透過在 SBOM 位置字首
optional:
來防止啟動失敗 - 如果檔不存在,Spring Boot 將僅忽略它。
六、總結
我們希望您喜歡這個功能,並希望它能幫助您保護您的軟體供應鏈。