最近何かと話題のSBOMですが、日頃扱っているOSやアプリもまた、SBOMを作成するとそこに記載されることになります。
一体どのように記載されるのでしょうか?導入から試してみました。
なお、SBOMの利用背景については、経済産業省の資料を参照するのが良いと思われます。
(参照先:https://www.meti.go.jp/press/2023/07/20230728004/20230728004.html)
SBOM自体はテキストファイルです。SBOMスキャニングソフトで作成することができます。
今回は、OSSのSyftをLinuxへ導入し、コンテナイメージのSBOMを作成したいと思います。
スキャニングに使うソフトウエアによりますが、ローカルのコンテナイメージだけでなく、レジストリにあるもの、OVAファイルなどいろいろなファイル・形態をスキャンできるようです。
SBOMには形式があります。CycloneDX、SPDX、SWIDタグの3種類です。
IBM ConcertではCycloneDX形式が取り込み可能なので、CycloneDX形式の出力を確認します。
Syftはgithub上で管理されています。(URL:https://github.com/anchore/syft)
各種OSに対応し、さまざまな導入方法が用意されています。
今回はLinuxのディストリビューションの1つのUbuntu22.04に導入します。
インストールは以下のコマンドを投入します。
/usr/local/binに配置することから、作業はルート権限が必要です。
curl -sSfL https://raw.githubusercontent.com/anchore/syft/main/install.sh | sh -s -- -b /usr/local/bin
数分で完了します。導入作業が完了したか確認するためバージョンを確認してみましょう。
# syft version
Application: syft
Version: 1.13.0
BuildDate: 2024-09-24T13:28:58Z
GitCommit: 01de99b25304ec95197c00b21d698f127b31a887
GitDescription: v1.13.0
Platform: linux/amd64
GoVersion: go1.22.7
Compiler: gc
上記では、コマンドはエラーなく実行され、バージョンは1.13.0と表示されています。正常に導入ができました。
それでは確認したいところですが、検査対象のコンテナイメージが欲しいところです。
古いOSイメージをダウンロードして試します。
# docker pull ubuntu:18.04
18.04: Pulling from library/ubuntu
Digest: sha256:152dc042452c496007f07ca9127571cb9c29697f42acbfad72324b2bb2e43c98
Status: Image is up to date for ubuntu:18.04
docker.io/library/ubuntu:18.04
イメージの確認をします。
# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
test_c1 latest 3ac657ab9c41 3 hours ago 1.59GB
example latest f334ab72bb96 4 weeks ago 78.1MB
ubuntu 18.04 f9a80a55f492 16 months ago 63.2MB <ーこれ
無事取り寄せたので、早速スキャンしてみます。コマンドの実行により結果が画面に表示されるためファイルにリダイレクトします。
# syft ubuntu:18.04 -o cyclonedx-json | jq . > sbom-ubuntu1804.json
✔ Loaded image ubuntu:18.04
✔ Parsed image sha256:f9a80a55f492e823bf5d51f1bd5f87ea3eed1cb31788686aa99a2fb61a27af6a
✔ Cataloged contents 184daa6f5f3284ec38c2de7eb29b6bd52b62c1cfb8abfd650f4961e183aab6cb
├── ✔ Packages [89 packages]
├── ✔ File digests [1,903 files]
├── ✔ File metadata [1,903 locations]
└── ✔ Executables [723 executables]
上記のように表示されると実行は終了です。
パッケージは89個、ファイルは1,903個あると示しています。無事にスキャンができたようです。
オプションは-oが表示形式の指定となります。
jqはオプションでありませんが、今回、人間に見やすい表示にパースすべくパイプしています。
では保存したsbom-ubuntu1804.jsonを確認してみます(まずは先頭から)
------------
{
"$schema": "http://cyclonedx.org/schema/bom-1.6.schema.json",
"bomFormat": "CycloneDX",
"specVersion": "1.6",
"serialNumber": "urn:uuid:f19ee265-3f35-481c-be8b-6ba083232a46",
"version": 1,
"metadata": {
"timestamp": "2024-09-30T13:17:02+09:00",
"tools": {
"components": [
{
"type": "application",
"author": "anchore",
"name": "syft",
"version": "1.13.0"
}
]
},
"component": {
"bom-ref": "4615e4019267979e",
"type": "container",
"name": "ubuntu",
"version": "18.04"
},
"properties": [
{
"name": "syft:image:labels:org.opencontainers.image.ref.name",
"value": "ubuntu"
},
{
"name": "syft:image:labels:org.opencontainers.image.version",
"value": "18.04"
・
・
(以下略)
------------
gcc部分をみてみます。
先頭の行番号はvi上で設定たものでSBOM形式には入りません。
バージョンやライセンスの情報が記載されています。
これにてSBOMの作成は終了となります。
他にもスキャンツールはいろいろありますので試して理解を深めていただければと思います。
さて、SBOMが作成され、モジュールの一覧が洗い出されました。すると次に気になることがありませんか?
どの程度、脆弱性を有しているか確認しておこうと思いますね。
syftを提供しているところがgrypeというOSSを提供しています。
grypeもまたgithub上で管理されています。(URL:https://github.com/anchore/grype)
syft同様に各種OSに対応し、さまざまな導入方法が用意されています。
今回もLinuxのディストリビューションの1つのUbuntu22.04に導入します。
インストールは以下のコマンドを投入します。
/usr/local/binに配置することから、作業はルート権限が必要です。
インストール作業:
curl -sSfL https://raw.githubusercontent.com/anchore/grype/main/install.sh | sh -s -- -b /usr/local/bin
数分で完了します。導入作業が正常に完了したか確認するためバージョンを確認してみましょう。
# grype version
Application: grype
Version: 0.81.0
BuildDate: 2024-09-25T16:57:40Z
GitCommit: 641982ff47fcb8d56b9555e5f0dad23afa7bc690
GitDescription: v0.81.0
Platform: linux/amd64
GoVersion: go1.23.1
Compiler: gc
Syft Version: v1.13.0
Supported DB Schema: 5
コマンドも実行でき、バージョン情報も表示されていることから正常にインストールは完了したとします。
次にDBをダウンロードします。脆弱性情報の数は多いのでデータベースが必要です。
grype DBのダウンロードコマンドは以下の通りとなります。
# grype db list
Built: 2024-09-29 01:31:46 +0000 UTC
URL: https://grype.anchore.io/databases/vuldnerability-db_v5_2024-09-29T01:31:46Z_1727583622.tar.gz
Checksum: sha256:f0e806e34054183df0905703bc9544084f36db7a81a9698bdfc7bf7dcc11bdfa
Built: 2024-09-28 01:32:22 +0000 UTC
URL: https://grype.anchore.io/databases/vulnerability-db_v5_2024-09-28T01:32:22Z_1727497250.tar.gz
Checksum: sha256:fcf9552fe9673132beba32d94e7984d4ab19a2c27a6206567104f1212984c303
Built: 2024-09-27 01:31:56 +0000 UTC
URL: https://grype.anchore.io/databases/vulnerability-db_v5_2024-09-27T01:31:56Z_1727410820.tar.gz
Checksum: sha256:7cbf8a171c3ecddce6b5ccc990760bd916d3b5034e558e210a49ca20fb1b1114
Built: 2024-09-26 01:32:09 +0000 UTC
URL: https://grype.anchore.io/databases/vulnerability-db_v5_2024-09-26T01:32:09Z_1727324424.tar.gz
Checksum: sha256:19fdfca30765e4b472860d800070744f477f9976eb17c72d4082e39a7070c2c1
4 databases available for schema 5
4つのデータベースが利用可能で、当日を含め4日分あることがわかります。
導入にあたりまずDBファイルをダウンロード、次にgrypeのDBに読み込ませます。
ファイルサイズは200MB弱のようです。
今回は導入テストということもあり最新のものを使用します。
# wget https://grype.anchore.io/databases/vulnerability-db_v5_2024-09-29T01:31:46Z_1727583622.tar.gz
2024-09-30 14:37:21 (91.5 MB/s) - ‘vulnerability-db_v5_2024-09-29T01:31:46Z_1727583622.tar.gz’ saved [189867986/189867986]
# grpye db import ./ vulnerability-db_v5_2024-09-29T01:31:46Z_1727583622.tar.gz
終了するまで数分かかる場合があります。
SBOMからの脆弱性スキャンの実行
syftで作成したSBOMを使用します。
古いOSとはいえ、どれだけ脆弱性があるのでしょうか?
# grype sbom:./sbom-ubuntu1804.json -o table=sbom-ubuntu1804-20240930.txt
✔ Vulnerability DB [no update available]
✔ Scanned for vulnerabilities [130 vulnerability matches]
├── by severity: 0 critical, 2 high, 68 medium, 51 low, 9 negligible
└── by status: 0 fixed, 130 not-fixed, 0 ignored
作業完了し、メッセージからクリティカルはゼロ、高程度が2個、中程度が68個云々と言った結果になりました。
作成された結果を見てみます。
# less sbom-ubuntu1804-20240930.txt
NAME INSTALLED FIXED-IN TYPE VULNERABILITY SEVERITY
apt 2.6.1 deb CVE-2011-3374 Negligible
binutils 2.40-2 deb CVE-2023-1972 Negligible
binutils 2.40-2 deb CVE-2021-32256 Negligible
binutils 2.40-2 deb CVE-2018-9996 Negligible
・
・
(略)
・
・
imagemagick-6.q16 8:6.9.11.60+dfsg-1.6+deb12u2 deb CVE-2005-0406 Negligible
krb5-multidev 1.20.1-2+deb12u2 (won't fix) deb CVE-2024-26461 High
krb5-multidev 1.20.1-2+deb12u2 deb CVE-2018-5709 Negligible
krb5-multidev 1.20.1-2+deb12u2 (won't fix) deb CVE-2024-26462 Unknown
krb5-multidev 1.20.1-2+deb12u2 (won't fix) deb CVE-2024-26458 Unknown
libaom3 3.6.0-1+deb12u1 (won't fix) deb CVE-2023-6879 Critical
libaom3 3.6.0-1+deb12u1 (won't fix) deb CVE-2023-39616 High
libapr1 1.7.2-3 (won't fix) deb CVE-2023-49582 Medium
libapt-pkg6.0 2.6.1 deb CVE-2011-3374 Negligible
libasan8 12.2.0-14 (won't fix) deb CVE-2023-4039 Medium
libasan8 12.2.0-14 deb CVE-2022-27943 Negligible
・
・
(略)
このような形でチェックすることができます。
SBOMを作成できれば、簡単に脆弱性が洗い出せるとは良い時代になったものです。
アップロードされたSBOMを使い、SBOMを管理し脆弱性やコンプライアンスの管理をすることができるのも弊社製品IBM Concertの1つの機能となります。
参考になりましたでしょうか?
そういえば、syftとgrypeにはマスコットキャラクターがあるんですね。