Shogo's Blog

Jun 30, 2024 - 2 minute read - github

GitHub Artifact Attestations を試してみた

GitHub Artifact Attestations が正式リリースされました。

ベータ公開 から2カ月足らずでの正式リリースです。 早いですね。それだけ力を入れているということでしょうか。

なんか難しい単語(attestations とか provenanceとか)が並んでいて正直良くわからんのですが、とりあえず試してみましょう。

署名してみる

S3からファイルを落とすだけのツールを作った」で作成した、 s3cli-mini で試してみます。

s3cli-miniのリリース処理は GitHub Actions 上で実行しています。 ビルドしたバイナリーは以下のリンクからダウンロード可能です。

しかしこのバイナリーは本当に GitHub Actions 上でビルドしたものでしょうか? リリースバイナリーはあとから差し替えも可能です。僕が悪意のあるコードを密かに忍ばせ、再ビルドし、上書きしているかもしれません。 僕に悪意がなくとも、僕がうっかりクレデンシャルを流出させてしまい、悪意のある第三者によって上書きされるかもしれません。

そんな心配を解決するのが Artifact Attestations です。

使い方は簡単で、リリースのワークフローに actions/attest-build-provenance を呼ぶステップを追加するだけです。

diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index b5b65f4..31f2d6c 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -10,6 +10,7 @@ jobs:
     permissions:
       contents: write
       id-token: write
+      attestations: write
 
     runs-on: ubuntu-latest
     steps:
@@ -35,3 +36,14 @@ jobs:
           args: release --clean
         env:
           GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+
+      - name: Generate artifact attestation
+        uses: actions/attest-build-provenance@v1
+        with:
+          subject-path: |
+            dist/*.tar.gz
+            dist/*.apk
+            dist/*.deb
+            dist/*.rpm
+            dist/*.zip
+            dist/checksums.txt

s3cli-miniのビルドには GoReleaser を使っています。 GoReleaser が ./dist/ に実行バイナリーを吐くので、それらを subject-path に指定します。

また、attestations: writeid-token: write の権限が必要なので、忘れずに付与しておきましょう。

検証してみる

検証は GitHub CLI で行います。 まずは実行バイナリーをダウンロードしてきましょう。

% curl -sSL -O https://github.com/shogo82148/s3cli-mini/releases/download/v0.0.15/s3cli-mini_0.0.15_darwin_arm64.tar.gz

gh attestation verify サブコマンドを使って検証を行います。

% gh attestation verify s3cli-mini_0.0.15_darwin_arm64.tar.gz -R shogo82148/s3cli-mini
Loaded digest sha256:7452a6cd31d8a5588919c8806f425e37ad95752a4c148f2247e91d4451a91021 for file://s3cli-mini_0.0.15_darwin_arm64.tar.gz
Loaded 1 attestation from GitHub API
✓ Verification succeeded!

sha256:7452a6cd31d8a5588919c8806f425e37ad95752a4c148f2247e91d4451a91021 was attested by:
REPO                   PREDICATE_TYPE                  WORKFLOW
shogo82148/s3cli-mini  https://slsa.dev/provenance/v1  .github/workflows/release.yml@refs/tags/v0.0.15

検証に成功しました! これでダウンロードしてきたバイナリーは、GitHub Actions上でビルドされたものだと証明できました。

署名された記録は GitHub や Sigstore にも記録されており、以下のリンクから確認可能です。

注意

gh attestation verify サブコマンドで検証できるのは、あくまでも 「リリースがGitHub Actions上で行われた」という事実確認 です。 バイナリーが安全であることの保証にはなりません。 レポジトリに悪意のあるコードが混入していれば、当然ながらそのバイナリーを使うのは危険です。 検証結果を盲目的に信じないよう注意してください。

まとめ

GitHub Artifact Attestations を試してみました。 この機能を使うと、バイナリーがGitHub Actions上でビルドされたことの証明が簡単にできます。 導入は簡単なので、ツールの開発者はぜひ利用してみてください。

コードの森に新たな光が
🌟アーティファクト証明がもたらされた🍀
ビルドの正しさ、守られる道
冒険の終わりに、証明は道しるべ🌈
ラビットの力で、未来へ翔ける💫

by CodeRabbit

参考