GitHub Actionsのアーティファクトがあなた而不是攻撃者によってビルドされたものであることを確認する方法
サプライチェーン攻撃は、長い間理論から厳しい現実へと変化しています。ユーザーがGitHubのReleasesセクションからビルド済みのバイナリをダウンロードするとします。そのファイルが、特定のコミットのソースコードからCIサーバーによって実際にビルドされたものであり、 개발자 계정에 접근한 해커가 업로드한 것이 아닌 것을 어떻게 확인할 수 있을까요?
この問題を解決するために、GitHubは特別なアクション actions/attest-build-provenance を導入しました。この仕組み、Sigstore署名の必要性、そして新しいパイプラインを作成する際に異なるツールが必要になる理由について、詳しく見ていきましょう。
どこで署名を紐付けるか
Provenance署名の本質は非常にシンプルです。すべての完成ファイルにはデジタルパスポートが必要です。このドキュメントは、特定のハッシュを持つアーティファクトが、特定のリポジトリ、特定のパイプラインでビルドされたことを証明します。
このツールは、in-toto標準とSLSA(Supply-chain Levels for Software Artifacts)仕様に基づいてマニフェストを生成します。そして、最も興味深い部分であるこのマニフェストへの署名が行われます。
開発者にPGP鍵を生成してリポジトリのシークレットに保存させる代わりに、Sigstoreアーキテクチャが使用されます。アクションはGitHub Actionsから一時的なOIDCトークンを要求し、短期有効な署名証明書と交換します。
パブリックリポジトリの場合、署名はパブリックのSigstoreサービスを介して生成され、データは透明性のあるRekorログに保存されます。リポジトリがプライベートな場合、GitHubは独自のプライベートSigstoreインスタンスを使用します(この機能はEnterprise Cloudプランで利用可能です)。
ドキュメントにおける小さな驚き
プロジェクトの公式リポジトリを開くと、READMEの冒頭に重要な注記があります。
バージョン4以降、 actions/attest-build-provenance はベースアクション actions/attest の単純なラッパーになりました。GitHub開発者は明確に述べています:古いパイプラインを維持している場合は、そのままにしておくことができます。しかし、新しいプロジェクトでは、最初から actions/attest を使用する必要があります。
なぜGitHubは余分な層を追加したのでしょうか?最初は、ビルドアーティファクト専用の狭いツールを構築していました。その後、バイナリだけでなく、SBOM(依存関係リスト)や脆弱性スキャン結果にも署名したいという要望が生まれました。これにより、より汎用的な actions/attest が登場し、古いアクションは同義語として廃止されました。
設定の姿
アクションの古いバージョンでは、 .github/workflows/build.yml のロジックはアーティファクトビルドステップの後に数行に凝縮されていました。
ここで重要なのは、パーミッション id-token: write と attestations: write です。最初のオプションがなければ、パイプラインはSigstore経由のパスワードレス署名用のOIDCトークンを取得できず、2番目のオプションがなければ、結果をGitHub Attestations APIにアップロードできません。
アーティファクトの真正性を確認する方法
アテステーションが作成されリポジトリに紐付けられると、任意のユーザーまたは検証スクリプトがローカルでファイルを確認できます。これには、公式のGitHub CLIユーティリティを使用します。
検証コマンドは以下のようになります:
gh attestation verify app.sh --owner my-organization
ファイルが変更されておらず、指定された組織でビルドされた場合、CLIはコミットと署名証明書に関する情報を出力します。ただし、ファイルが最小限でも変更されている場合は、検証がエラーで失敗します。
実装する価値はあるか
オープンソースのライブラリやCLIツールを開発している場合、アテステーションを生成することで、ユーザーがリリースのセキュリティを確認而易い方法を提供できます。
一方、厳格なサプライチェーンセキュリティ要件がない小規模な内部プロジェクトの場合、CIに余分なステップを追加するのはオーバースペックかもしれません。
新しいパイプラインでは、 actions/attest-build-provenance ではなく直接 actions/attest を使用してください。コア機能は同じままですが、廃止されたラッパーがない最新のツールを使用することになります。
関連プロジェクト