SLSA について学ぶ
Supply-chain Levels for Software Artifacts
ソフトウェア開発から本番環境でのデプロイメントまでのステップ全体を攻撃者から守るためのフレームワーク、もしくは準拠するべきガイドライン
コードを開発するデベロッパーによるビルドのプロセスを経てパッケージ化された成果物が、
最終的に利用されるまでに8つのポイントで攻撃が行われる可能性があるとして、
すべてのプロセスにおいて成果物を攻撃から守る必要がある
makefileに対してサプライチェーンとして必要な情報を追加する設定ファイル、SLSAでは「レイアウト」と呼ばれるコメント付きのJSON記述による設定を解説している。
- Provenance(来歴): 成果物がどのように生成されたのかを確認すること
- Attestation(証明): シグネチャーなどで認証した結果
- すべての段階でデジタルシグネチャーによる証書を要求
- 対象の artifact の SLSA の Level を判断する
- 何が出来ていて、何が出来ていないか判断する (spread sheet が作れそうな気もする)
- 目標を設定し、何が出来ればよいか判断する
試しに ci-info で判断してみる
SLSA 1
The build process must be fully scripted/automated and generate provenance.
Provenance is metadata about how an artifact was built, including the build process, top-level source, and dependencies.
Knowing the provenance allows software consumers to make risk-based security decisions.
Provenance at SLSA 1 does not protect against tampering, but it offers a basic level of code source identification and can aid in vulnerability management.
provenance の生成ができているとは言えない。
provenance の生成には以下のツールがある
失敗した
FAILED: SLSA verification failed: error searching rekor entries: no matching entries found
action が古かったので update したものの再びエラー
verifier hash verification has passed
FAILED: SLSA verification failed: could not find a matching valid signature entry
このリポジトリの GitHub Releases から slsa-verifier をダウンロードしている
v1.1.1 をダウンロードしている
verifier hash verification has passed
FAILED: SLSA verification failed: could not find a matching valid signature entry
slsa-verify は内部で
を使っている
builder と verifier をダウンロードして、 verifier を使って builder を検証している
Builder の実行
slsa-builder-go を build し、 https://github.com/suzuki-shunsuke/test-slsa-goreleaser を build してみる
slsa-builder-go build -dry .slsa-goreleaser.yml "COMMIT_DATE:2022-10-18, COMMIT:$(git rev-parse HEAD), VERSION:v0.1.0-2"
&{linux amd64 0x1400081a670 <nil> map[CGO_ENABLED:0 GO111MODULE:on] [-trimpath -tags=netgo] [-X main.Version={{ .Env.VERSION }} -X main.Commit={{ .Env.COMMIT }} -X main.CommitDate={{ .Env.COMMIT_DATE }}] hello-{{ .Os }}-{{ .Arch }}}
arg env: COMMIT_DATE:2022-10-18
arg env: COMMIT:4fc8cc46fa0251d029fb14692077753deef3105b
arg env: VERSION:v0.1.0-2
::set-output name=go-binary-name::hello-linux-amd64
::set-output name=go-command::WyIvVXNlcnMvcy1iLXN1enVraS8ubG9jYWwvc2hhcmUvYXF1YXByb2otYXF1YS9iaW4vZ28iLCJidWlsZCIsIi1tb2Q9dmVuZG9yIiwiLXRyaW1wYXRoIiwiLXRhZ3M9bmV0Z28iLCItbGRmbGFncz0tWCBtYWluLlZlcnNpb249djAuMS4wLTIgLVggbWFpbi5Db21taXQ9NGZjOGNjNDZmYTAyNTFkMDI5ZmIxNDY5MjA3Nzc1M2RlZWYzMTA1YiAtWCBtYWluLkNvbW1pdERhdGU9MjAyMi0xMC0xOCIsIi1vIiwiaGVsbG8tbGludXgtYW1kNjQiLCIuL2NtZC9oZWxsbyJd
::set-output name=go-env::WyJHT09TPWxpbnV4IiwiR09BUkNIPWFtZDY0IiwiR08xMTFNT0RVTEU9b24iLCJDR09fRU5BQkxFRD0wIl0=
::set-output name=go-working-dir::/Users/shunsukesuzuki/repos/src/github.com/suzuki-shunsuke/test-slsa-goreleaser
- GitHub Actions 上で実行することを想定しているのか、
set-output
が出力される。これはGITHUB_OUTPUT
に移行すべき - 構造体がそのまま出力されている。 debug 用途だと思うが修正すべき
dry を外して build したところ、 OUTPUT_BINARY が必要だと言われる
$ slsa-builder-go build .slsa-goreleaser.yml "COMMIT_DATE:2022-10-18, COMMIT:$(git rev-parse HEAD), VERSION:v0.1.0-2"
&{linux amd64 0x140003a2c90 <nil> map[CGO_ENABLED:0 GO111MODULE:on] [-trimpath -tags=netgo] [-X main.Version={{ .Env.VERSION }} -X main.Commit={{ .Env.COMMIT }} -X main.CommitDate={{ .Env.COMMIT_DATE }}] hello-{{ .Os }}-{{ .Arch }}}
arg env: COMMIT_DATE:2022-10-18
arg env: COMMIT:4fc8cc46fa0251d029fb14692077753deef3105b
arg env: VERSION:v0.1.0-2
invalid filename: OUTPUT_BINARY not defined%
OUTPUT_BINARY を set して build したところ、 binary しか生成されない。
provenance は provenance コマンドでビルドするからか。
では go build でビルドされたものと何が違うのか
build の設定を YAML で記述できる以上の違いがよくわからない。
build 時の設定を set-output で出力しているくらい?
issue がすでにあった。
ビルドできた
local で verifiy もできた
$ slsa-verifier --artifact-path hello-linux-amd64 -provenance hello-linux-amd64.intoto.jsonl -source github.com/suzuki-shunsuke/test-slsa-goreleaser
Verified signature against tlog entry index 5339992 at URL: https://rekor.sigstore.dev/api/v1/log/entries/24296fb24b8ad77a381e3e665fb2dd0f6567b4e218be0bbb7de988d08ddfcbc7e3a5e4b8fea22af9
Verified build using builder https://github.com/slsa-framework/slsa-github-generator/.github/workflows/builder_go_slsa3.yml@refs/tags/v1.2.1 at commit c9a89c1276e977874c2c0441a78bfef7e972f570
PASSED: Verified SLSA provenance
in-toto の Go の実装があって、 SLSA の幾つかの実装はこれに依存している。
SLSA の実装は sigstore の Cosign や rekor にも依存している