安全なイメージ パイプラインを作成する

このページでは、ベースコンテナ イメージの生成を自動化する安全なイメージ パイプラインの設定方法について説明します。

概要

安全なイメージ パイプラインは、Google Cloud のプロジェクト、リソース、GitHub リポジトリのフレームワークを設定するオープンソース ツールです。これを使用して、カスタム イメージの作成と維持を行い、ベースイメージを保護します。Google Cloud プロジェクトのイメージを使用できます。

次の図は、安全なイメージ パイプラインによって作成されるリソースのフレームワークを示しています。

安全なイメージ パイプライン

パイプラインを設定すると、次のリソースが作成されます。

  • コンテナ イメージのソースコードをホストする GitHub リポジトリ。

  • 3 つの Google Cloud プロジェクト: ビルド プロジェクトステージング プロジェクト検証済みプロジェクト。イメージ リポジトリでイメージが更新されるたびに、ビルド プロジェクト内の Cloud Build トリガーで、更新されたイメージのビルドと署名を行い、ステージング プロジェクトの Artifact Registry リポジトリに push します。ステージング プロジェクトのイメージが手動で検証されると、パイプラインによってイメージが検証済みプロジェクトに push されます。

費用

安全なイメージ パイプラインでは、次の Google Cloud プロダクトが使用されます。

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを出すことができます。

始める前に

必要な IAM 権限

安全なイメージ パイプラインを設定するユーザーには、Google Cloud 組織の roles/organization.adminroles/billing.admin の Identity and Access Management ロールが必要です。IAM のロールの付与については、アクセス権の付与、変更、取り消しをご覧ください。

安全なイメージ パイプラインを設定する

安全なイメージ パイプライン GitHub リポジトリには、ベースイメージの生成を自動化するスクリプトが含まれています。

安全なイメージ パイプラインを設定するには:

  1. 安全なイメージ パイプラインの GitHub リポジトリのクローンをローカルマシンに作成します。

    git clone https://github.com/GoogleCloudPlatform/secure-image-pipeline
    
  2. secure-image-pipeline ディレクトリに移動します。

    cd secure-image-pipeline/
    
  3. env.sh.tmplenv.sh にコピーします。

    cp env.sh.tmpl env.sh
    
  4. 任意のエディタで env.sh を開きます。

  5. 次の値を編集します。

    • PARENT_ORGANIZATION: Google Cloud 組織の ID を入力します。 安全なイメージ パイプライン スクリプトは、この組織を使用して Google Cloud プロジェクトとベースイメージを生成します。
    • BASEIMGFCT_PROJECT: スクリプトが作成するプロジェクトのプロジェクトIDを構成するための文字列を入力します。この文字列は、小文字、数字、ハイフンで構成される 6~30 文字の文字列にする必要があります。また、必ずアルファベットで始まる必要があり、末尾にハイフンを使用することはできません。たとえば、foo を指定すると、foo-builderfoo-stagefoo-verified の ID を持つ 3 つのプロジェクトがスクリプトによって作成されます。
    • BASEIMGFCT_BUCKET: スクリプトが Terraform 自動化コードを保存するために作成する Cloud Storage バケットの名前を入力します。名前がバケットの命名要件を満たしていることを確認します。
    • BASEIMGFCT_REGION: 使用するリージョンの名前を入力するか、またはデフォルト値を使用します。
    • BILLING_ACCOUNT: 組織に関連付けられている請求先アカウントを入力します。
    • GITHUB_TOKEN: GitHub 個人アクセス トークンを入力します。 スクリプトはこのトークンを使用して、ベースイメージのソースコードを含む GitHub リポジトリを作成します。
  6. 設定スクリプトを実行する

    ./setup.sh
    
  7. プロンプトが表示されたら、次の GitHub アカウント情報を入力します。

    1. GitHub 組織の名前。

    2. GitHub メールアドレス

    3. GitHub のユーザー名。

    4. ベースイメージを保存するための新しいプロジェクトを作成する権限をスクリプトに付与します。

    5. 「y」と入力します。

    この処理が完了するまでに数分かかります。完了すると、「GitHub のリポジトリをリンクし、いずれかのキーを押して次に進みます」というメッセージが表示されます。

  8. 続行するには、いずれかのキーを押してください。

    このスクリプトは、新しい Google Cloud コンソール ブラウザ ウィンドウを開き、GitHub リポジトリと Google Cloud プロジェクトをリンクさせます。

  9. Google Cloud コンソールのブラウザ ウィンドウに切り替えます。

  10. [GitHub アプリのインストールの管理] ポップアップで、GitHub アカウントを選択します。

  11. [別のプロジェクトを追加] をクリックします。

  12. [プロジェクトを選択] プルダウンで、YOUR_PROJECT_NAMEビルダー形式のプロジェクトを選択します。

  13. 同意のチェックボックスをオンにして、[次へ] をクリックします。

  14. リポジトリのリストで、[baseimgfact-[some number]-containers] という名前のリポジトリを選択し、[Connect (1) repositories] をクリックします。

  15. [push トリガーの作成] ページで、[スキップ] をクリックします。スクリプトにより、push トリガーが自動的に作成されます。

  16. [完了] をクリックします。

  17. ターミナルに戻ります。

  18. 続行するには、いずれかのキーを押してください。

スクリプトの実行が完了するまで数分かかります。

安全なイメージ パイプラインによって作成されたリソース

セットアップ スクリプトの実行が完了すると、次のリソースが作成されます。

GitHub:

  • コンテナ イメージの作成に使用されるソースコードを含む baseimgfct-[some number]-containers という名前のリポジトリ。setup スクリプトは、一般的な Linux ディストリビューションごとに 1 つずつ、簡単な Dockerfile でこのリポジトリにシードを設定します。
  • キーのデプロイ - リポジトリ向けに書き込みアクセスのデプロイキーを分離します。

Google Cloud プロジェクト:

  • YOUR_PROJECT_NAME-builder という名前の Google Cloud プロジェクトで、GitHub リポジトリでソースコードが更新されるたびに、イメージをビルドしてステージング プロジェクトに push するリソースを含みます。

    このプロジェクトには、baseimgfct-[some number]-containers のメインブランチで pull リクエストまたはマージが実行されるときにビルドを呼び出す Cloud Build トリガーが含まれています。pull リクエストにより、イメージがビルドされ、ステージング プロジェクトに push されます。マージにより、イメージがビルドされ、検証済みプロジェクトにプッシュされます。

    YOUR_PROJECT_NAME-builder の IAM 権限: パイプラインを変更する予定のチームメンバーのみに、このプロジェクトへのアクセス権を付与することをおすすめします。プロジェクトへのアクセス権を付与する手順については、アクセス権の付与、変更、取り消しをご覧ください。

  • YOUR_PROJECT_NAME-stage という名前の Google Cloud プロジェクト。これは、イメージが検証済みプロジェクトにリリースされる前に、イメージを手動審査のためにステージングするために使用されます。このプロジェクトには次のリソースが含まれています。

    • ビルドされたコンテナ イメージを含む Artifact Registry Docker リポジトリ。
    • プロジェクト内のイメージごとに Cloud Run 関数が作成されます。これにより、既知の脆弱性に対する新しい修正が見つかるたびに、イメージの再構築がトリガーされます。
    • Cloud Run 関数の実行に使用される Pub/Sub トピック。
    • Cloud Run デプロイとして実行される Voucher サーバーのインスタンス。Voucher サーバーは、セキュリティ ポリシーの要件のリストを使用してイメージをチェックします。パイプラインに付属するデフォルトのポリシー要件を使用するか、カスタマイズされたセキュリティ ポリシーを指定します。セキュリティ チェックに合格すると、Voucher サーバーが Binary Authorization を使用してイメージの証明書を作成します。この証明済みイメージは署名付きイメージとも呼ばれ、検証済みプロジェクトに push されます。

    YOUR_PROJECT_NAME-stage の IAM 権限: Artifact Registry からステージングされたイメージの読み取りが許可されているデベロッパーのみに、このプロジェクトへのアクセス権を付与することをおすすめします。プロジェクトへのアクセス権を付与する手順については、アクセス権の付与、変更、取り消しをご覧ください。

  • YOUR_PROJECT_NAME-verified という名前の Google Cloud プロジェクト。このプロジェクトには、個別に審査された最終的な署名付きイメージが含まれます。

次のステップ