syftとgrypeで脆弱性診断!

例によって備忘録だよ。勢いに任せていろいろ設定してきたが、そろそろ引き返せなくなってきている。
ことの発端はセキュリティ関係でいろいろ調べ事していたら、「SBOM」てのが出てきて、SBOM生成するツール探して、そしたらSBOM使って脆弱性診断できると言われて色んなツールインストールしてしまったところだよ。明日になったら何をインストールしたか覚えていないと思う。
そういう訳で、ツールの設定中心にログ残していくよ。

# 1.scoopをインストールする

syftにしてもgrypeにしても、ググるだけだとWindowsへのインストール方法が出てこない。Windowsのバイナリあるって書いてあるのに！って思っていたら、今時はパッケージ管理ソフトでインストールするんだね。そういうのはLinuxだけの話かと思っていたよ。Windowsだって、やればできる子なんだ。
そういう訳で、Windows向けパッケージ管理ソフト「scoop」をインストールするよ。
やり方はとっても簡単。Powershellを立ち上げて、次の二つのコマンドを入力するだけ。

```cmd
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
```

```cmd
Invoke-RestMethod -Uri https://get.scoop.sh | Invoke-Expression
```

[公式サイト](https://scoop.sh/)に上記コマンドが続けて書いてあるから、PONなおいらはそのままコピペしてしまってコマンドがエラーになってしまったよ。てへ。
1行ずつ入れてはenterしてね。そうするとするっとインストール出来るよ。
pathも何も設定しないでも使えるようになっているよ。便利だね。
基本的なコマンドは以下の通り。

```cmd
scoop install [パッケージ名]
```
アンインストールも同様。
```cmd
scoop uninstall [パッケージ名]
```
自分でパッケージ作ったりもできるので、気になる人は個別に調べてね。
GithubなんかでWindows用の別のパッケージ管理ソフトchocolateyやMac向けパッケージ管理ソフトHomebrewを使えるような記述があるなら、scoopも多分使える。使えなかったらごめんなさい。保証しません。

# 2.syftをインストールして使ってみる
syftの情報は[Github](https://github.com/anchore/syft)にインストール方法や使い方なんかが書いてあるよ。
さっそくsyftをインストールしてみよう。
さっき入れたscoopを使えばあっちゅう間さ。

```cmd
scoop install syft
```
ほら。簡単に入った。動かすのも楽ちんだよ。
画面上に依存関係のバージョン情報を表示するときは、単に情報を取得したいフォルダ名を指定するだけでいい。
```cmd
syft [SBOMを作成したいフォルダ]
```
Githubの説明だと「syft <image>」て書いてあるから、imageを指定しないといけないような気がするが、そんなことはない。プロジェクトのフォルダなんかを指定しても、ちゃんとその中で依存関係をリストにしてくれる。
このコマンドで表示しているデータはsyftのフォーマットのデータなので、これをSBOMのフォーマットで出力するには、次のコマンドで出力したいフォーマットを指定する。
```cmd
syft [SBOMを作成したいフォルダ] -o [フォーマット]
```
[フォーマット]の主なものは下記の通り。
cyclonedx-json：Cyclone-DX形式のデータをJSON形式で表示
spdx-json：SPDX形式のデータをJSON形式で表示

このままだと画面に表示されるだけなので、標準出力から出力先のファイルをリダイレクトで指定すれば、指定したファイルに出力される。
```cmd
syft [SBOMを作成したいフォルダ] -o [フォーマット] > [出力先フォルダ/ファイル名]
```
次に出てくるgrypeで脆弱性診断をするなら、Cyclone-DX形式でファイルに出力しておく。

# 3.grypeをインストールして使ってみる
SBOMファイルを作成出来たら、grypeで診断してみる。
インストール方法はsyftと同様、scoopを使えばよい。
```cmd
scoop install grype
```
ちなみに[grypeのGithub](https://github.com/anchore/grype)にはscoopを使ったインストールの例は出ていなかったけど、やったらできたっぽいのでやってみて。

grypeは独自の脆弱性データベース（grypeDB）を持っていて、それを持ってこないと使えない。最新のgrypeDBの場所は、grypeで以下のコマンドを打てば表示される。
```cmd
grype db list
```
こんな内容が表示されるよ。
```cmd
Built:    2025-01-16 01:30:59 +0000 UTC
URL:      https://grype.anchore.io/databases/vulnerability-db_v5_2025-01-16T01:30:59Z_1737001316.tar.gz
Checksum: sha256:c00873e1a2ddc6fb560815a823c98e85edc459843b1cd12b68cb722faf2d11f3

Built:    2025-01-15 09:45:46 +0000 UTC
URL:      https://grype.anchore.io/databases/vulnerability-db_v5_2025-01-15T09:45:46Z_1736937125.tar.gz
Checksum: sha256:641fd0f154cc9b67970e3d031165f35258f5a260c58b6f473548fab6955c3001

Built:    2025-01-14 01:30:52 +0000 UTC
URL:      https://grype.anchore.io/databases/vulnerability-db_v5_2025-01-14T01:30:52Z_1736828525.tar.gz
Checksum: sha256:4983055af296db29b51d2ea2367b045a52a4184f474849dcefa5befad7b7ad7e

Built:    2025-01-13 01:31:43 +0000 UTC
URL:      https://grype.anchore.io/databases/vulnerability-db_v5_2025-01-13T01:31:43Z_1736742143.tar.gz
Checksum: sha256:9a55b71f2f547274cb1d4c5a0d4c2dc150f40c80ab81f69e31e882b04d022021

4 databases available for schema 5
```
grypeDBは毎日最新の情報で更新されるので、最新のgrypeDBをダウンロードする。
ダウンロードはwgetみたいなコマンドでもできるが、URLをブラウザに入力すれば、ダウンロードしてくれるよ。
grypeDBをダウンロードしたら、grypeにimportするよ。
```cmd
grype db import [ダウンロードしたgrypeDB]
```
grypeDBは圧縮したままでいいよ。
実行すると、少々時間がかかって（何にもメッセージが出ないので不安になるが、待つ）、終了すると「Vulnerability database imported」というメッセージが出るよ。
DBをimport出来たら、いよいよ脆弱性のチェックだ。
以下のコマンドで入れられるよ。
```cmd
grype sbom:[SBOMファイル] -o table=[結果出力ファイル]
```
出力項目は下記の通り。

|項目名 |説明 |
|:-|:-|
|NAME|名称|
|INSTALLED|バージョン|
|FIXED-IN|セキュリティパッチされたバージョン|
|TYPE|パッケージのタイプ|
|VULNERABILITY|識別子|
|SEVERITY|脆弱性のレベル。高い順にCritical, High, Medium, Low, Negligibleで表示される|

例えば、INSTALLEDに表示されているバージョンとFIXED-INに表示されているバージョンが異なる場合、インストールされているバージョンが古いものなので、FIXED-INに表示されたバージョンを取り込むように修正すると、この行が表示されなくなる。
脆弱性が全くない場合は「No vulnerabilities found」と出力される。
開発が終わってしばらくしてから最新の状態にしなきゃならないって時に、何が古いかわかるからいいね。

とりあえず今回はこんなところで。
もっといろいろ活用方法がわかったらまたなんか書くかも。書かないかも。
どっちにしてもまた今度ねー。