この記事はOpenChain Japan Advent Calendar 2022の12月8日分として投稿します。
https://qiita.com/advent-calendar/2022/openchainjapanwg
はじめに
syftはコンテナイメージやファイルシステムを元にSBOM (Software Bill of Materials)を生成するためのCLIツールおよびGoライブラリです。
コンテナイメージはOCIやDocker、C,C++,Java,Python,Ruby,Debian,Red Hatなどの環境に対応しています。
詳しくはsyftのGitHubをご覧ください。
https://github.com/anchore/syft
今回はsyftを使ってCentOS 7のrpmdbを元にSPDX-JSON形式のSBOMを生成してみます。
環境情報
macOS上にDockerでCentOS 7のコンテナを立ち上げて、その中で作業をします。
今回の環境情報は以下です。
コンポーネント | バージョン | 備考 |
---|---|---|
PC | M1 MacBook Pro | |
OS | macOS Ventura 13.0.1 | |
Docker | 4.15.0 | |
CentOS | 7.9.2009 | |
syft | v0.62.3 |
手順
CentOS 7のコンテナを作成
macOS上での作業です。
dockerイメージをpullし、コンテナを作成します。
$ docker pull centos:centos7
$ docker run -it -d --name centos7 centos:centos7
ログインして、バージョンを確認します。
$ docker exec -it centos7 /bin/bash
# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (AltArch)
syftをインストール
ここからはCentOS 7のコンテナで作業をしてください。
syftをインストールします。
# curl -sSfL https://raw.githubusercontent.com/anchore/syft/main/install.sh | sh -s -- -b /usr/local/bin
# ls -l /usr/local/bin/syft
-rwxr-xr-x 1 root root 55967744 Dec 4 09:50 /usr/local/bin/syft
rpmdbからSPDX-JSON形式でSBOMを生成
syft /var/lib/rpm -o spdx-json > centos7_rpm.json
生成したSPDX-JSON形式のファイルを確認
生成したSPDX-JSON形式のファイルの内容を確認してみましょう。
以下はgrepパッケージに関する情報を抜粋したものです。
パッケージ名(name)やバージョン(versionInfo)は取得できているものの、ライセンスは取得できていないようです。
{
"name": "grep",
"SPDXID": "SPDXRef-Package-rpm-grep-e4d3c9df1ae7bd18",
"versionInfo": "2.20-3.el7",
"originator": "Organization: CentOS",
"downloadLocation": "NOASSERTION",
"sourceInfo": "acquired package info from RPM DB: Packages",
"licenseConcluded": "NOASSERTION",
"licenseDeclared": "NOASSERTION",
"copyrightText": "NOASSERTION",
"externalRefs": [
{
"referenceCategory": "SECURITY",
"referenceType": "cpe23Type",
"referenceLocator": "cpe:2.3:a:centos:grep:2.20-3.el7:*:*:*:*:*:*:*",
"comment": ""
},
{
"referenceCategory": "SECURITY",
"referenceType": "cpe23Type",
"referenceLocator": "cpe:2.3:a:grep:grep:2.20-3.el7:*:*:*:*:*:*:*",
"comment": ""
},
{
"referenceCategory": "PACKAGE-MANAGER",
"referenceType": "purl",
"referenceLocator": "pkg:rpm/grep@2.20-3.el7?arch=aarch64&upstream=grep-2.20-3.el7.src.rpm",
"comment": ""
}
]
},
まとめ
syftを使ってCentOS 7のrpmdbを元にSPDX-JSON形式でSBOMを生成することができました。
ざっとソースを確認したところライセンスを取得する処理は実装されてはいるものの、v0.62.3ではうまく動作していないようです。
v0.62.3ではパッケージ名やバージョンなどの情報はSPDXーJSON形式で取得できるので、ソフトウェア管理に活用してみてはどうでしょうか。
参考情報
- syft
- SPDX
- DockerでCentOS 7のイメージを利用してみよう