さくらのクラウド & MIRACLE LINUX8.4でコンテナイメージのSBOMアテステーションをやってみた

**こんリナ～🐧**
Linux系Vtuberの熊ヶ谷 リナです！
今回はコンテナイメージのSBOMアテステーションに挑戦してみます！
<iframe width="560" height="315" src="https://www.youtube.com/embed/QfcIG82wyT4" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

# 🐧SBOMアテステーションってなんだ？🐧
あまり聞き慣れないコンテナイメージのSBOMアテステーションという言葉ですが
ざっくり3行で説明すると
- コンテナのパッケージ情報をSBOM(ソフトウェア部品表)をつかって管理する方法がある
- 例えば脆弱性が出たらSBOMだけ確認すれば良い。ただSBOMが間違っていると意味ない。
- なのでSBOMに署名して誰でも検証できるようにする(=SBOMアテステーション)

というお話です！(間違ってたらこっそり教えてください...)

SBOMというキーワード、私はOpenChain等のOSSコンプライアンス界隈でよく耳にしていましたが、最近は脆弱性やセキュリティの話題でも耳にするようになったのでこれから流行っていくかもですね～

コンテナ＋SBOMのメリットについてはは以下の記事がとっても参考になりました。

https://qiita.com/hmachi/items/8c7c4caf90ad8188a0d9


# 🐧どうやるの？🐧
コンテナイメージのSBOMアテステーションは具体的なやり方がCNCFのブログ記事に取り上げられていました

https://www.cncf.io/blog/2022/03/30/trusting-sboms-in-the-software-supply-chain-syft-now-creates-attestations-using-sigstore/?utm_content=bufferdc7a0&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer

Syft(SBOMを生成するツール)でコンテナイメージのSBOMを生成しつつ秘密鍵で署名。署名したSBOMをCosign(コンテナイメージの署名/検証を提供するツール)でコンテナレジストリ上のイメージにattachすれば、公開鍵をつかって誰でも検証可能になるようです。けっこう簡単そうですね！

今回はこの方法をさくらのクラウド上に環境を作ってやってみます！


## 🐧実際にやってみる！🐧
### 0. 作業環境用意
今回の作業環境として、以下の記事を参考にMIRACLE LINUX8.4でサーバーをさくっと建てます。

https://knowledge.sakura.ad.jp/30168/

サーバーにログインしたら下記コマンドで今回必要なパッケージ諸々をインストールしていきます。
```console:諸々インストール
podmanのインストール
# dnf install -y podman
# podman -v
podman version 3.4.2

syftのインストール
# curl -sSfL https://raw.githubusercontent.com/anchore/syft/main/install.sh | sh -s -- -b /usr/local/bin
# syft –version
syft 0.44.1

sigstore cosinのインストール
# wget "https://github.com/sigstore/cosign/releases/download/v1.8.0/cosign-1.8.0.x86_64.rpm"
# dnf install -y cosign-1.8.0.x86_64.rpm
# cosign version
  ______   ______        _______. __    _______ .__   __.
 /      | /  __  \      /       ||  |  /  _____||  \ |  |
|  ,----'|  |  |  |    |   (----`|  | |  |  __  |   \|  |
|  |     |  |  |  |     \   \    |  | |  | |_ | |  . `  |
|  `----.|  `--'  | .----)   |   |  | |  |__| | |  |\   |
 \______| \______/  |_______/    |__|  \______| |__| \__|
cosign: A tool for Container Signing, Verification and Storage in an OCI registry.

GitVersion:    v1.8.0
GitCommit:     9ef6b207218572b3257a5b4251418d75569baaae
GitTreeState:  clean
BuildDate:     2022-04-27T13:40:34Z
GoVersion:     go1.17.9
Compiler:      gc
Platform:      linux/amd64
```

サーバーに加えて、コンテナレジストリが必要なので用意しておきます。DockerHubやローカルに建ててもいいですが、さくらのクラウドでもコンテナレジストリのサービスが提供されているので使ってみます。レジストリ自体の設定は以下の記事に従ってさくらのクラウドのコンソールをポチポチして完了。

https://manual.sakura.ad.jp/cloud/appliance/container-registry/

コンテナレジストリを建てたら忘れない内にサーバー側の設定をしておきます。
```console:コンテナレジストリの設定
# podman login rina-registry.sakuracr.jp
Username: [ユーザ名]
Password: [パスワード]
Login Succeeded

# cosign login rina-registry.sakuracr.jp -u [ユーザー名] -p [パスワード]
```

### 1. コンテナイメージを用意する。
使用するコンテナイメージはなんでもいいですが、今回はMIRACLE LINUXの移行ツールでCentOS8をMIRACLE LINUX8.4に転生させたコンテナイメージを自作してみました。移行ツールについては下記記事に詳しく書かれているので、興味があれば読んでみて下さい。

https://miraclelinux.hatenablog.com/entry/2021/10/08/120830

```console:コンテナイメージのビルド
# curl -OL https://repo.dist.miraclelinux.net/miraclelinux/migration-tool/migrate2ml.sh
# chmod 755 migrate2ml.sh

# vi Dockerfile
FROM registry.centos.org/centos
MAINTAINER kumagaya_rina
ADD migrate2ml.sh /
RUN bash migrate2ml.sh --minimal

# podman build -t images:censto2ml -f Dockerfile .

# podman images
REPOSITORY                  TAG         IMAGE ID      CREATED             SIZE
localhost/images            censto2ml   dc19d6fb59eb  About a minute ago  227 MB
registry.centos.org/centos  latest      2f3766df23b6  16 months ago       217 MB
```

コンテナイメージができたらコンテナレジストリにpushしておきます。
```console:コンテナレジストリへpush
# podman tag localhost/images:censto2ml rina-registry.sakuracr.jp/images:latest
# podman push rina-registry.sakuracr.jp/images:latest
```

### 2. コンテナイメージのSBOM作成＆署名
コンテナイメージを用意できたらSyftをつかってSBOMの作成&署名を行います。
署名につかうキーペアをCosignで生成したらあとはコマンド一発でOK。-oで指定しているspdx-jsonはSBOMのフォーマットです。SBOMのフォーマットはいくつか存在しますが、個人的にSPDXがいろんなSBOM管理系のツールで採用されている印象があるので指定しています。(SBOM管理系ツールも色々あるので今後紹介していきたいですね～）
```console:SBOM作成&署名
# cosign generate-key-pair
Enter password for private key:[パスワード]
Enter password for private key again:[パスワード]
Private key written to cosign.key
Public key written to cosign.pub

# syft attest --key ./cosign.key rina-registry.sakuracr.jp/images:latest -o spdx-json > ./centos2ml-sbom.att.json
Enter password for private key:[パスワード]
 ? Parsed image
 ? Cataloged packages      [176 packages]
```

### 3. コンテナイメージにSBOMをattach＆検証
最後にCosignをつかってレジストリ上のコンテナイメージとSBOMを紐づけます。
ちなみにcosign verify-attestationが成功するとメッセージと共にSBOMの中身が表示されますが、Syftで生成したSBOMはbase64でエンコードされている＆結構な量が出力されてびっくりするので下記ではデコードしてファイル出力しています。
```console:
# cosign attach attestation rina-registry.sakuracr.jp/images:latest --attestation ./centos2ml-sbom.att.json
# cosign verify-attestation --key ./cosign.pub rina-registry.sakuracr.jp/images:latest | jq -r .payload | base64 -d | jq .predicate > result_sbom.json
Verification for rina-registry.sakuracr.jp/images:latest --
The following checks were performed on each of these signatures:
  - The cosign claims were validated
  - The signatures were verified against the specified public key
```
これでSBOMアテステーションができるようになりました！コンテナレジストリを外に公開する際にSBOMアテステーションで使用した公開鍵をあわせて公開してあげれば、レジストリからpullする前に誰でもSBOMの検証と中身の確認ができます。

## 🐧おわりに🐧
というわけで今回はSBOMアテステーションを実際にやってみました！お試しするだけならとっても簡単でしたね！しかし、これを実際のデリバリや運用にどう落とし込んでいくかはまだまだこれから、といったところでしょうか？

私のYoutubeチャンネルでは今回のような内容からもっとゆるいネタまで
どんどん動画で紹介していこうと思うので、よかったらチャンネル登録もお願いします！
それでは、乙リナでした～🐧

http://www.youtube.com/channel/UCzOD8UtniTEmbf3UgemAnxQ?sub_confirmation=1