當前位置: 妍妍網 > 碼農

Spring Boot 3.3 | SBOM 功能介紹

2024-05-28碼農

一、簡介

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 將僅忽略它。

    六、總結

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