Open15

SLSA について学ぶ

Shunsuke SuzukiShunsuke Suzuki

https://thinkit.co.jp/article/19403

Supply-chain Levels for Software Artifacts

ソフトウェア開発から本番環境でのデプロイメントまでのステップ全体を攻撃者から守るためのフレームワーク、もしくは準拠するべきガイドライン

コードを開発するデベロッパーによるビルドのプロセスを経てパッケージ化された成果物が、
最終的に利用されるまでに8つのポイントで攻撃が行われる可能性があるとして、
すべてのプロセスにおいて成果物を攻撃から守る必要がある

makefileに対してサプライチェーンとして必要な情報を追加する設定ファイル、SLSAでは「レイアウト」と呼ばれるコメント付きのJSON記述による設定を解説している。

  • Provenance(来歴): 成果物がどのように生成されたのかを確認すること
  • Attestation(証明): シグネチャーなどで認証した結果
  • すべての段階でデジタルシグネチャーによる証書を要求

https://in-toto.io/

Shunsuke SuzukiShunsuke Suzuki
  • 対象の artifact の SLSA の Level を判断する
    • 何が出来ていて、何が出来ていないか判断する (spread sheet が作れそうな気もする)
  • 目標を設定し、何が出来ればよいか判断する
Shunsuke SuzukiShunsuke Suzuki

試しに ci-info で判断してみる

https://github.com/suzuki-shunsuke/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 の生成には以下のツールがある

https://github.com/slsa-framework/slsa-github-generator

Shunsuke SuzukiShunsuke Suzuki

https://github.com/suzuki-shunsuke/test-slsa-goreleaser

https://github.com/suzuki-shunsuke/test-slsa-goreleaser/pull/1

https://github.com/suzuki-shunsuke/test-slsa-goreleaser/actions/runs/3258865128

失敗した

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

https://github.com/slsa-framework/slsa-github-generator/blob/bdd89e60dc5387d8f819bebc702987956bcd4913/.github/actions/generate-builder/builder-fetch.sh#L76-L80

https://github.com/slsa-framework/slsa-github-generator/blob/bdd89e60dc5387d8f819bebc702987956bcd4913/.github/actions/generate-builder/action.yml#L53

https://github.com/slsa-framework/slsa-github-generator/blob/bdd89e60dc5387d8f819bebc702987956bcd4913/.github/actions/generate-builder/action.yml#L43-L62

https://github.com/slsa-framework/slsa-github-generator/blob/bdd89e60dc5387d8f819bebc702987956bcd4913/.github/actions/generate-builder/generate-builder.sh#L19-L22

https://cli.github.com/manual/gh_release_download

https://github.com/slsa-framework/slsa-github-generator/blob/bdd89e60dc5387d8f819bebc702987956bcd4913/.github/actions/generate-builder/builder-fetch.sh#L68

このリポジトリの GitHub Releases から slsa-verifier をダウンロードしている

https://github.com/slsa-framework/slsa-verifier

v1.1.1 をダウンロードしている

https://github.com/slsa-framework/slsa-verifier/releases/tag/v1.1.1

verifier hash verification has passed
FAILED: SLSA verification failed: could not find a matching valid signature entry

https://github.com/slsa-framework/slsa-verifier/blob/76a59d8413f27259b97298da91bbb6511fc775d1/pkg/provenance.go#L74

https://github.com/slsa-framework/slsa-verifier/blob/76a59d8413f27259b97298da91bbb6511fc775d1/pkg/provenance.go#L460

https://github.com/slsa-framework/slsa-verifier/blob/76a59d8413f27259b97298da91bbb6511fc775d1/main.go#L122-L127

https://github.com/slsa-framework/slsa-verifier/blob/76a59d8413f27259b97298da91bbb6511fc775d1/pkg/provenance.go#L396-L400

https://github.com/slsa-framework/slsa-verifier/blob/76a59d8413f27259b97298da91bbb6511fc775d1/main.go#L31-L44

https://github.com/slsa-framework/slsa-verifier/blob/76a59d8413f27259b97298da91bbb6511fc775d1/main.go#L166-L169

Shunsuke SuzukiShunsuke Suzuki

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%

https://github.com/slsa-framework/slsa-github-generator/blob/10d3fbf01ceab6616758480b573e7769285e78b2/internal/builders/go/pkg/build.go#L196-L207

https://github.com/slsa-framework/slsa-github-generator/blob/10d3fbf01ceab6616758480b573e7769285e78b2/.github/workflows/builder_go_slsa3.yml#L227-L229

Shunsuke SuzukiShunsuke Suzuki

OUTPUT_BINARY を set して build したところ、 binary しか生成されない。
provenance は provenance コマンドでビルドするからか。

https://github.com/slsa-framework/slsa-github-generator/blob/10d3fbf01ceab6616758480b573e7769285e78b2/.github/workflows/builder_go_slsa3.yml#L278-L285

では go build でビルドされたものと何が違うのか

build の設定を YAML で記述できる以上の違いがよくわからない。
build 時の設定を set-output で出力しているくらい?

Shunsuke SuzukiShunsuke Suzuki

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