Laravel 專案用 Syft 產生 SBOM 實作筆記

最近在做原始碼掃描,掃自己寫的程式碼部分還好處理,但第三方套件要另外整理成 SBOM(Software Bill of Materials,軟體物料清單)才能提交,這才去找有沒有工具可以自動產出。

Laravel 專案一個裝下來光 vendor/ 資料夾就幾百個套件,靠人工列表根本不現實,找到 Anchore 的 Syft 之後發現就是這個——裝好一行指令掃完,不需要改專案任何設定。


什麼是 SBOM

SBOM 就是一份列出所有軟體元件(套件、函式庫、依賴)的清單,包含名稱、版本、授權條款、來源等資訊。概念類似製造業的物料清單(BOM),讓你清楚知道軟體是由哪些「零件」組成的。

主要標準有兩種:

標準維護單位常見格式
CycloneDXOWASPJSON、XML
SPDXLinux FoundationJSON、tag-value

兩種格式的工具鏈都很完整,選一個你的 CI/CD 流程支援的就好。


安裝 Syft

Syft 是 Anchore 出的開源 CLI 工具,支援 28+ 種語言生態系,掃 Laravel 專案不需要額外設定。

curl -sSfL https://get.anchore.io/syft | sudo sh -s -- -b /usr/local/bin

驗證安裝:

syft version

掃描 Laravel 專案目錄

在專案根目錄執行,Syft 會自動掃 composer.lockvendor/ 裡的套件:

syft .

預設輸出是 table 格式,你會看到類似這樣的結果:

NAME                             VERSION   TYPE
amphp/amp                        v2.6.4    php-composer
amphp/byte-stream                v1.8.2    php-composer
brick/math                       0.12.1    php-composer
carbonphp/carbon-doctrine-types  3.2.0     php-composer
doctrine/inflector                2.0.10   php-composer
...(通常超過 100 行)

輸出 SBOM 檔案

輸出 CycloneDX JSON(最常見的格式):

syft . -o cyclonedx-json=./sbom.json

輸出 SPDX JSON:

syft . -o spdx-json=./sbom-spdx.json

同時輸出多個格式:

syft . -o cyclonedx-json=./sbom-cdx.json -o spdx-json=./sbom-spdx.json

指定只用 PHP Composer cataloger,加快掃描速度:

syft . --catalogers php-composer-installed-cataloger -o cyclonedx-json=./sbom.json
TIP — 掃描 Docker Image

如果 Laravel 專案有容器化,也可以直接掃 Image,不用進入容器:

syft your-laravel-app:latest -o cyclonedx-json=./sbom.json

容器掃描通常更完整,因為連系統層的套件(openssl、glibc 等)都會包含進去。


用 Grype 接著做漏洞掃描

有了 SBOM 之後,最直接的用途是拿去跑漏洞掃描。Grype 同樣是 Anchore 出的工具,可以直接吃 Syft 產的 SBOM 檔案:

安裝 Grype

curl -sSfL https://raw.githubusercontent.com/anchore/grype/main/install.sh | sh -s -- -b /usr/local/bin

掃描 SBOM

grype sbom:./sbom.json

輸出範例:

NAME               INSTALLED  FIXED-IN  TYPE          VULNERABILITY    SEVERITY
guzzlehttp/guzzle  7.4.2      7.4.3     php-composer  CVE-2022-XXXXX   High
symfony/http-kernel 5.4.10   5.4.11     php-composer  CVE-2022-YYYYY   Medium
WARNING — Grype 的 PHP 掃描精準度

Grype 對 PHP 套件的漏洞資料庫相對不完整(主要強項是容器/OS 層漏洞),建議同時跑 composer audit 互補,它直接查 Packagist 的安全公告資料庫,對 PHP 套件漏洞更準確:

composer audit

CI/CD 整合

把 SBOM 產生加進 CI Pipeline(以 GitHub Actions 為例):

- name: Generate SBOM
  run: |
    curl -sSfL https://get.anchore.io/syft | sudo sh -s -- -b /usr/local/bin
    syft . -o cyclonedx-json=./sbom.json

- name: Upload SBOM artifact
  uses: actions/upload-artifact@v4
  with:
    name: sbom
    path: sbom.json

- name: Vulnerability scan
  run: |
    curl -sSfL https://raw.githubusercontent.com/anchore/grype/main/install.sh | sh -s -- -b /usr/local/bin
    grype sbom:./sbom.json --fail-on high

--fail-on high 會讓 CI 在發現 High 以上嚴重度的漏洞時直接失敗,強制修復後才能合併。


小結

Laravel 依賴這麼多,SBOM 應該列進標準流程,尤其現在 EU Cyber Resilience Act 和不少客戶合約開始要求軟體供應鏈透明度。Syft 不需要改任何專案設定,裝好就能跑,是目前最省事的選擇。


資料來源

留言