/ci-test

Primary LanguageDockerfileCreative Commons Zero v1.0 UniversalCC0-1.0

これなに?

Git のコミット署名周りや Github Actions でのコンテナ作成に関する調査・動作確認用のリポジトリです。

以下、覚書。

Git の署名周り

Git でコミット署名を行う手順

  • 事前に利用する鍵の登録が必要

  • 署名の確認

    • Git: コマンドで署名を確認する
      $ git log -n1 --show-signature
      commit 86781f418c487ed7a13bfd23e22fae5d4d96dedc (HEAD -> main, origin/main, origin/HEAD)
      gpg: 2023年07月17日 23時19分28秒 JSTに施された署名
      gpg:                RSA鍵65799582A83EB09DBF65C79C06CB0E740C9B8978を使用
      gpg: "Tomoya Tanjo <ttanjo@gmail.com>"からの正しい署名 [究極]
      Author: Tomoya Tanjo <ttanjo@gmail.com>
      Date:   Mon Jul 17 23:19:28 2023 +0900
      
          Fix sample
    • Github: Web UI 上で署名を確認する
      • コミットメッセージをクリック
      • 署名済みなら "Verified" のマークが付与される
      • 簡単に調べたところ、Gitlab でも Web UI 上で署名確認ができる

Github Actions でのコンテナのビルド・GHCR への push

懸念点

  • docker build 時の環境の表示はユーザー任せ
    • アプリをコンテナ化して配布する場合、CI runner の開発環境は通常使われない
  • ビジネス用途だと distroless の方が使われる場合もありそう
    • distroless: https://github.com/GoogleContainerTools/distroless
    • Alpine Linux などよりも更に尖っており、シェルやパッケージ管理システム等もなし
    • ポリシー上 latest タグしか提供していない
      • 「タグ固定して古いのを使うな。セキュリティのために常に latest を使え」という方針
  • 鍵を使って署名する場合、秘密鍵をどうやって Actions に渡す?
    • Secrets などに設定はできるが…
    • cosign と同様に OIDC token を使う方法を採用できるか?

開発者がコミットを作成・Github に push したときに何が起きるのか

  • リポジトリの開発者は、GPG, SSH, X509 のいずれかの鍵を用いて署名付きコミットを行う
    • 署名付きコミットにより、コミットが第三者によるものではないことを検証可能にできる
  • 開発者はコミットを Github に push する
  • リポジトリへの push をトリガーにして Github Actions (Github 提供の CI/CD の機構) が実行される
    • push 以外をトリガーにした Actions 実行も存在するが、今回は省略
    • Github Actions の実行は Github hosted runnerself hosted runner のいずれかで行われる
      • runner の管理者についてはきちんと前提を置く必要がある
  • Github Actions はコミットに含まれる設定ファイルに従って、ソースからバイナリ (or コンテナ) へのビルドおよび生成されたバイナリのバイナリリポジトリへのアップロードを行う
    • 例: docker-publish.yml
    • 設定ファイルは本質的には bash スクリプト列
    • ビルド環境の構築 (e.g., コンパイラのデプロイ)、ビルド、バイナリへの署名およびバイナリと署名のアップロードを行うように設定ファイルに記述しておく必要がある
    • ビルドログ中に、対応するリポジトリのコミット番号およびバイナリのハッシュ値(or コンテナイメージID)を出力するように設定ファイルを記述する必要がある
      • ビルドログの例
      • Github 上のビルドログは一定期間 (デフォルトは三ヶ月) で消去されるので注意が必要

ソースコードとバイナリの紐づけの確認方法・検証方法