Laravel 專案用 Syft 產生 SBOM 實作筆記
最近在做原始碼掃描,掃自己寫的程式碼部分還好處理,但第三方套件要另外整理成 SBOM(Software Bill of Materials,軟體物料清單)才能提交,這才去找有沒有工具可以自動產出。
Laravel 專案一個裝下來光 vendor/ 資料夾就幾百個套件,靠人工列表根本不現實,找到 Anchore 的 Syft 之後發現就是這個——裝好一行指令掃完,不需要改專案任何設定。
什麼是 SBOM
SBOM 就是一份列出所有軟體元件(套件、函式庫、依賴)的清單,包含名稱、版本、授權條款、來源等資訊。概念類似製造業的物料清單(BOM),讓你清楚知道軟體是由哪些「零件」組成的。
主要標準有兩種:
| 標準 | 維護單位 | 常見格式 |
|---|---|---|
| CycloneDX | OWASP | JSON、XML |
| SPDX | Linux Foundation | JSON、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.lock 和 vendor/ 裡的套件:
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
如果 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
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 不需要改任何專案設定,裝好就能跑,是目前最省事的選擇。
留言