# 使用微軟開源工具 sbom-tool 自動產生 SBOM軟體物料清單
## 公司忽然叫我做SBOM,我大概知道or我不想搞懂,只想趕快拿SBOM交差
如果您有這樣的需求,可以直接跳到 [安裝與操作方式](#安裝與操作方式) 這一段看實作方法。
如果您想稍微了解一下SBOM的具體內容,可以繼續往下閱讀。
## SBOM 軟體物料清單 (Software Bill of Manual, SBOM) 是什麼?
軟體物料清單 (Software Bill of Manual, SBOM)包含但不限於開源和現成軟體元件之清單 、相關軟體建置和安裝整合程序之說明。
這邊借用一下ChatGPT的回答
> SBOM代表軟體元件清單(Software Bill of Materials),也稱為軟體物料清單(Software Bill of Materials),是一份清單,其中包含構成特定軟體的所有元件、第三方庫、框架和其他軟體組件的詳細資訊。SBOM是一個組成部分的清單,可以幫助企業瞭解其使用的軟體的全貌,以及該軟體的安全性、合規性和風險。
> SBOM旨在提高軟體供應鏈的透明度,幫助企業在軟體開發和供應過程中更好地管理風險。SBOM還可以幫助企業識別和解決軟體中存在的漏洞和其他安全問題,以提高安全性。
> 最近,SBOM已經成為軟體供應鏈安全和管理的重要組件,因為許多企業越來越依賴第三方軟體元件和庫來構建其應用程序。此外,許多行業標準和規範,如美國國防工業基地(DIB)標準和歐盟開放軟體供應鏈安全(OSSC)計劃,已經開始要求企業提供SBOM。
## SBOM 有多重要? 美國總統拜登 2021年發布的行政命令
在美國拜登總統發布的 [這份行政命令](https://www.federalregister.gov/documents/2021/05/17/2021-10460/improving-the-nations-cybersecurity) 中,這一段提及
(vii) providing a purchaser a Software Bill of Materials (SBOM) for each product directly or by publishing it on a public website;
要求軟體開發者將軟體物料清單 (SBOM)直接給予購買者或在公開網站上公布出來。
當然這個行政命令是對於提供軟體給美國政府機關的承包商比較有效力,不過台灣幾乎是美國有什麼規範都會跟進,趁這機會準備起來不是壞事。
## SBOM至少需要包含哪些欄位?
依照美國商務部和國家電信暨資訊管理局的[公告](https://www.ntia.gov/files/ntia/publications/sbom_minimum_elements_report.pdf), SBOM最少要有這些欄位,因還沒找到台灣的正式翻譯,故以下附上中英文對照
* 供應商名稱 Supplier Name
The name of an entity that creates, defines, and identifies components.
創建、定義和標識元件的實體的名稱。
* 元件名稱 Component Name
Designation assigned to a unit of software defined by the original supplier.
分配給原始供應商定義的軟體單元的名稱。
* 元件的版本 Version of the Component
Identifier used by the supplier to specify a change in software from a previously identified version.
供應商用來指定軟體與先前標識的版本相比的更改的標識碼。
* 其他唯一標識碼 Other Unique Identifiers
Other identifiers that are used to identify a component, or serve as a look-up key for relevant databases.
用於標識元件或用作相關資料庫的查找鍵的其他標識碼。
* 相依關係 Dependency Relationship
Characterizing the relationship that an upstream component X is included in software Y.
表徵上游元件 X 包含在軟體 Y 中的關係。
* SBOM 的作者 Author of SBOM Data SBOM
The name of the entity that creates the SBOM data for this component.
為此元件創建 SBOM 數據的實體名稱 (可能是個人、組織、團體、企業)。
* 時間戳記 Timestamp
Record of the date and time of the SBOM data assembly.
記錄 SBOM 數據程式集的日期和時間。
## SBOM的檔案是什麼樣子?
生成的 SBOM 會是一個 json 格式的檔案,符合 [SPDX](https://spdx.dev/) 的格式規範,這裡擷取其中一部分
![](https://hackmd.io/_uploads/rJ0seHYN2.png)
## 用微軟的工具,無法自動擷取 License 欄位。 2023/05/11 檢測尚無法擷取
上面那段 SBOM 內容,應該有看到像下面這樣的字
"licenseConcluded": "NOASSERTION",
"licenseDeclared": "NOASSERTION",
"copyrightText": "NOASSERTION",
依照 [2022/08/23的官方Github討論](https://github.com/microsoft/sbom-tool/discussions/102),目前不支援自動擷取授權欄位,但相關功能未來有計畫要推出,可以期待看看
## 安裝與操作方式
安裝檔有兩種方式可以下載
1. 用瀏覽器直接下載[微軟工具sbom執行檔 exe](
https://github.com/microsoft/sbom-tool/releases/latest/download/sbom-tool-win-x64.exe)
2. 利用 Powershell 指令,在預計要下載的位置執行以下語法
```
Invoke-WebRequest -Uri "https://github.com/microsoft/sbom-tool/releases/latest/download/sbom-tool-win-x64.exe" -OutFile "sbom-tool.exe"
```
### 執行語法
* 官方範例用法如下
```
sbom-tool generate -b <drop path> -bc <build components path> -pn <package name> -pv <package version> -ps <package supplier> -nsb <namespace uri base>
```
要注意 ```<build components path>```,這邊要填寫的是有 ```*.csproj``` 或 ```package.json``` 之類包含專案檔案資訊的,所以如果是零碎的檔案而非程式專案,沒辦法自動掃描生成
* 實際指令範例
```
.\sbom-tool.exe generate -b C:\MyFolder\SBOM -bc C:\MySourceCode\RootPath -ps 供應商名稱 -pn 元件名稱 -pv 1.0 -nsb 文件前綴網址
```
* 執行結果
照這個指令執行的話,產出位置會在前面寫的 ```C:\MyFolder\SBOM\_manifest\spdx_2.2```
生成範例雖然前面貼過圖了,這邊再貼一次偏尾段的內容,如果使用上有問題也歡迎留言討論。
```
{
"name": "Microsoft.EntityFrameworkCore",
"SPDXID": "SPDXRef-Package-EE6D1A7DC4B44B14837A3E2A92944080E6197D3E7906EFD67F9FEEB4981C5DE3",
"downloadLocation": "NOASSERTION",
"filesAnalyzed": false,
"licenseConcluded": "NOASSERTION",
"licenseDeclared": "NOASSERTION",
"copyrightText": "NOASSERTION",
"versionInfo": "6.0.5",
"externalRefs": [
{
"referenceCategory": "PACKAGE-MANAGER",
"referenceType": "purl",
"referenceLocator": "pkg:nuget/Microsoft.EntityFrameworkCore@6.0.5"
}
],
"supplier": "NOASSERTION"
},
...
...
...
"spdxVersion": "SPDX-2.2",
"dataLicense": "CC0-1.0",
"SPDXID": "SPDXRef-DOCUMENT",
"name": "元件名稱 1.0",
"documentNamespace": "https://example.com/sbom/example/1.0/D1gZ5qfB7kyCfrFtI17Bog",
"creationInfo": {
"created": "2023-05-10T15:55:35Z",
"creators": [
"Organization: 供應商名稱",
"Tool: Microsoft.SBOMTool-1.1.0"
]
},
"documentDescribes": [
"SPDXRef-RootPackage"
]
```
## 不喜歡微軟? 試試另外一套 SPDX Software Bill of Materials (SBOM) Generator
單純只有一家的工具也不太好,我寫了另外一篇 使用 [SPDX Software Bill of Materials (SBOM) Generator 產生 SBOM](https://hackmd.io/@Not/spdx_sbom_generator),也可以改用另一個試試看
## SBOM 產完之後呢? 背後的目的其實是檢查是否需要修補
產完後,只是 **單純知道** 用了哪些元件而已,但到底這些清單中的元件有沒有風險,還需要進一步的檢查,請見下一篇的
[產完 SBOM 之後就沒事了? 用 OSV 開源漏洞資料庫查到底哪些元件有風險](https://hackmd.io/@Not/SBOM_Fixed)
---
## 參考來源
* Improving the Nation's Cybersecurity
https://www.federalregister.gov/documents/2021/05/17/2021-10460/improving-the-nations-cybersecurity
* SPDX
https://spdx.dev/
* microsoft/sbom-tool
https://github.com/microsoft/sbom-tool
* License fields #102
https://github.com/microsoft/sbom-tool/discussions/102
* Generating Software Bills of Materials (SBOMs) with SPDX at Microsoft
https://devblogs.microsoft.com/engineering-at-microsoft/generating-software-bills-of-materials-sboms-with-spdx-at-microsoft/
* How to Generate an SBOM With Microsoft’s Open-Source Tool
https://www.howtogeek.com/devops/how-to-generate-an-sbom-with-microsofts-open-source-tool/
* 拒絕受駭!美國推行「軟體物料清單」公開軟體組成,採購更安心
https://lab.ocf.tw/2021/09/02/sbom/
* 2021 物聯網資安趨勢 - 利用韌體掃描輕鬆解決 開源軟體安全盲點
https://www.teema.org.tw/exhibition-detail.aspx?infoid=36702
###### tags: `資安`