YoctoでSPDX形式のSBOMを作ったりCVEチェックを行ってみる
昨今セキュリティやらライセンスに関するコンプライアンスやらでSBOMとか脆弱性チェックが必要とされるようになってきました。Yoctoでは自動でSPDX形式のSBOMやCVEチェックが行えるようなので、実際に試してみました。
Yocto 5.1(Styhead)にて確認しました。
SBOMの作成
local.confに以下の内容を追記してbitbakeします。5.1ではSPDX Ver 3形式で出力されます。
詳細な説明は公式ドキュメントに記述があります。
#
# added for SBOM
# required. enable to generate spdx files.
INHERIT += "create-spdx"
# optional. if "1", output spdx files will be formatted.
SPDX_PRETTY = "1"
# optional. if "1", output spdx files includes [file-information section](https://spdx.github.io/spdx-spec/v2.3/file-information/).
SPDX_INCLUDE_SOURCES = "1"
# optional. if "1", bitbake will create source files archive for each package.
SPDX_ARCHIVE_SOURCES = "1"
# optional. if "1", bitbake will create output binary archive for each package.
SPDX_ARCHIVE_PACKAGED = "1"
デフォルトではSBOMは生成されないため、構成ファイルからcreate-spdxクラスを継承する必要があります。 その指定はINHERIT += "create-spdx"
で行います。
そのほかに以下の設定が行えます。
-
SPDX_PRETTY
1を設定することで、出力されるjsonファイルをより読みやすくフォーマットします。 -
SPDX_ARCHIVE_PACKAGED
1を設定すると生成されたターゲットパッケージにファイルの圧縮アーカイブを設定します。 -
SPDX_INCLUDE_SOURCES
1を設定するとホストツールとターゲットパッケージの生成に使用されるソースファイルの説明を追加します。 -
SPDX_ARCHIVE_SOURCES
1を設定するとこれらのソース ファイル自体のアーカイブを追加します。
生成されたSPDX形式のSBOMはtmp/deploy/spdx
以下に格納されます。
CVE-CHECKの実行
Yoctoではlocal.confに設定を追記するとビルド時にCVEの脆弱性チェックを行う機能があります。この機能は実行前にNISTが提供するNVDからAPIを使って脆弱性データベースを取得します。APIを利用する際にアクセスキーがなくても実行できるとドキュメントには記述がありますが、遅いので登録してAPIキーを取得します。
APIの取得は以下のページから登録します。
登録するとNISTからメールが届きます。そこに記載されているURLをクリックするとAPIキーが表示されるので保存しておきます・
次にlocal.confを修正します。以下の内容を追記します。
# for CVE Check
INHERIT += "cve-check"
NVDCVE_API_KEY = "取得したAP~Iキー"
CVE_DB_UPDATE_ATTEMPTS = "20"
include conf/distro/include/cve-extra-exclusions.inc
指定するパラメータは以下の通りとなります。
- `INHERIT += "cve-check"
CVEチェックを実行するように指定します。 -
NVDCVE_API_KEY
先ほど取得したAPIキーを記述します。指定するとビルドシステムはこのキーを用いてNVDのAPIをアクセスし、脆弱性情報を取得します。 -
CVE_DB_UPDATE_ATTEMPTS
タイムアウト時のリトライ回数を指定します。デフォルトは5ですが、サーバが不安定なのでなるべく多めに指定しておくのが良いと思います。
最後のinclude conf/distro/include/cve-extra-exclusions.inc
を指定すると、不要なレシピのチェックを飛ばすので時間短縮に効果があります。
この設定を追記し、bitbakeでビルドを行うと自動でチェックを行ってくれます。
CVEに対して修正がされているかの判断はバージョンとCVEで始まるセキュリティパッチが適用されているかで判断されるようです。
結果はtmp/cve
以下にjson形式で格納されます。
これで脆弱性に対する対応状況の確認が行えます。
Discussion