SLSA Provenance
各イメージには、SLSA 形式の Provenance ステートメントが、署名付き attestation として付属します。 これは、ビルドに使った入力、つまりどのソースリビジョンを、どのワークフローの実行でビルドしたかを記録したものです。 そのため検証では、イメージの中身だけでなく、それがどこから来たビルドなのかも確認できます。
Takumi Images は現在ベータ版です。 仕様や挙動が予告なく変更される可能性があります。
記録する内容
predicate に は、ビルドの呼び出しと、その入力になった materials(ビルドに使ったソースリビジョンなど)、そしてビルドを実行した builder の identity(ワークフローのパスと ref)が記録されます。
predicate type は SLSA v1 の slsaprovenance1 です。
これらはすべて、リリースワークフローが実行時に持っていた情報そのものであり、後から書き加えたものではありません。
構造は次のとおりです(一部を省略しています)。
{
"_type": "https://in-toto.io/Statement/v1",
"subject": [
{
"name": "takumi/curl",
"digest": { "sha256": "<イメージ tar の sha256>" }
}
],
"predicateType": "https://slsa.dev/provenance/v1",
"predicate": {
"buildDefinition": {
"externalParameters": {
"image": "takumi/curl",
"arch": "arm64",
"nixpkgs": {
"uri": "https://github.com/NixOS/nixpkgs/archive/<rev>.tar.gz",
"sha256": "<sha256>"
}
},
"resolvedDependencies": ["(イメージの直接入力になった導出の一覧)"]
}
}
}
subject の digest は、リリース時に検証している非圧縮 tar のハッシュです。
externalParameters には、ビルドを完全に決める pin(nixpkgs のリビジョンとハッシュ)が入ります。
つまりこの predicate は、「どの入力とどのワークフローから、このハッシュのイメージが作られたか」を後から確認するための記録です。
再現可能ビルドとの関係
Provenance が記す入力は、それだけでは主張にとどまります。 この記述を裏づけているのが、再現可能ビルドです。 各イメージは、宣言した入力だけで結果が決まる Nix の式としてビルドしており、同じ入力から同じイメージをビルドし直すと、ビット単位で一致することを CI が検証しています。 利用者は、この Provenance と署名を検証することで、公開されたイメージがどの入力とリリースワークフローに紐づくものかを確認できます。 ビルドがどのように再現可能な結果を生んでいるかは、ビルドパイプラインの概要を参照してください。
検証方法
Provenance はアーキテクチャごとに内容が変わるので、SBOM と同じく、アーキテクチャごとのイメージに添付します。
まず index から目的のアーキテクチャの子 digest を取り出し、その Provenance を --type slsaprovenance1 で検証します。
CHILD_DIGEST=$(crane manifest images.flatt.tech/takumi/busybox:latest \
| jq -r '.manifests[] | select(.platform.architecture=="amd64").digest')
cosign verify-attestation \
--certificate-oidc-issuer=https://token.actions.githubusercontent.com \
--certificate-identity-regexp 'https://github.com/flatt-security/takumi-images/.github/workflows/release.yml@.*' \
--type slsaprovenance1 \
"images.flatt.tech/takumi/busybox@${CHILD_DIGEST}" \
| jq -r '.payload' | base64 -d | jq '.predicate'
この attestation を信頼できるものにしている署名の仕組みは、Attestation を参照してください。