このページでは、ベースコンテナ イメージの生成を自動化する安全なイメージ パイプラインの設定方法について説明します。
概要
安全なイメージ パイプラインは、Google Cloud のプロジェクト、リソース、GitHub リポジトリのフレームワークを設定するオープンソース ツールです。これを使用して、カスタム イメージの作成と維持を行い、ベースイメージを保護します。Google Cloud プロジェクトのイメージを使用できます。
次の図は、安全なイメージ パイプラインによって作成されるリソースのフレームワークを示しています。
パイプラインを設定すると、次のリソースが作成されます。
コンテナ イメージのソースコードをホストする GitHub リポジトリ。
3 つの Google Cloud プロジェクト: ビルド プロジェクト、ステージング プロジェクト、検証済みプロジェクト。イメージ リポジトリでイメージが更新されるたびに、ビルド プロジェクト内の Cloud Build トリガーで、更新されたイメージのビルドと署名を行い、ステージング プロジェクトの Artifact Registry リポジトリに push します。ステージング プロジェクトのイメージが手動で検証されると、パイプラインによってイメージが検証済みプロジェクトに push されます。
費用
安全なイメージ パイプラインでは、次の Google Cloud プロダクトが使用されます。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを出すことができます。
始める前に
安全なイメージ パイプラインを使用するには、Google Cloud の組織が必要です。 Google Workspace と Cloud Identity のお客様は、Google Cloud 組織を作成できます。
- Google Workspace: Google ワークスペースに登録します。
- Cloud Identity: Cloud Identity に登録します。
Google Cloud 組織の詳細については、組織を使用したクイックスタートをご覧ください。
Terraform 0.14.10 をインストールする。
まだインストールしていない場合は、GitHub でアカウントを作成してください。
- GitHub で 2 要素認証を設定している場合は、コマンドラインで GitHub パスワードの代わりに使用する個人用のアクセス トークンを作成します。
必要な IAM 権限
安全なイメージ パイプラインを設定するユーザーには、Google Cloud 組織の roles/organization.admin
と roles/billing.admin
の Identity and Access Management ロールが必要です。IAM のロールの付与については、アクセス権の付与、変更、取り消しをご覧ください。
安全なイメージ パイプラインを設定する
安全なイメージ パイプライン GitHub リポジトリには、ベースイメージの生成を自動化するスクリプトが含まれています。
安全なイメージ パイプラインを設定するには:
安全なイメージ パイプラインの GitHub リポジトリのクローンをローカルマシンに作成します。
git clone https://github.com/GoogleCloudPlatform/secure-image-pipeline
secure-image-pipeline
ディレクトリに移動します。cd secure-image-pipeline/
env.sh.tmpl
をenv.sh
にコピーします。cp env.sh.tmpl env.sh
任意のエディタで
env.sh
を開きます。次の値を編集します。
- PARENT_ORGANIZATION: Google Cloud 組織の ID を入力します。 安全なイメージ パイプライン スクリプトは、この組織を使用して Google Cloud プロジェクトとベースイメージを生成します。
- BASEIMGFCT_PROJECT: スクリプトが作成するプロジェクトのプロジェクトIDを構成するための文字列を入力します。この文字列は、小文字、数字、ハイフンで構成される 6~30 文字の文字列にする必要があります。また、必ずアルファベットで始まる必要があり、末尾にハイフンを使用することはできません。たとえば、
foo
を指定すると、foo-builder
、foo-stage
、foo-verified
の ID を持つ 3 つのプロジェクトがスクリプトによって作成されます。 - BASEIMGFCT_BUCKET: スクリプトが Terraform 自動化コードを保存するために作成する Cloud Storage バケットの名前を入力します。名前がバケットの命名要件を満たしていることを確認します。
- BASEIMGFCT_REGION: 使用するリージョンの名前を入力するか、またはデフォルト値を使用します。
- BILLING_ACCOUNT: 組織に関連付けられている請求先アカウントを入力します。
- GITHUB_TOKEN: GitHub 個人アクセス トークンを入力します。 スクリプトはこのトークンを使用して、ベースイメージのソースコードを含む GitHub リポジトリを作成します。
設定スクリプトを実行する
./setup.sh
プロンプトが表示されたら、次の GitHub アカウント情報を入力します。
GitHub 組織の名前。
GitHub メールアドレス
GitHub のユーザー名。
ベースイメージを保存するための新しいプロジェクトを作成する権限をスクリプトに付与します。
「y」と入力します。
この処理が完了するまでに数分かかります。完了すると、「GitHub のリポジトリをリンクし、いずれかのキーを押して次に進みます」というメッセージが表示されます。
続行するには、いずれかのキーを押してください。
このスクリプトは、新しい Google Cloud コンソール ブラウザ ウィンドウを開き、GitHub リポジトリと Google Cloud プロジェクトをリンクさせます。
Google Cloud コンソールのブラウザ ウィンドウに切り替えます。
[GitHub アプリのインストールの管理] ポップアップで、GitHub アカウントを選択します。
[別のプロジェクトを追加] をクリックします。
[プロジェクトを選択] プルダウンで、YOUR_PROJECT_NAMEビルダー形式のプロジェクトを選択します。
同意のチェックボックスをオンにして、[次へ] をクリックします。
リポジトリのリストで、[baseimgfact-[some number]-containers] という名前のリポジトリを選択し、[Connect (1) repositories] をクリックします。
[push トリガーの作成] ページで、[スキップ] をクリックします。スクリプトにより、push トリガーが自動的に作成されます。
[完了] をクリックします。
ターミナルに戻ります。
続行するには、いずれかのキーを押してください。
スクリプトの実行が完了するまで数分かかります。
安全なイメージ パイプラインによって作成されたリソース
セットアップ スクリプトの実行が完了すると、次のリソースが作成されます。
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 プロジェクト。このプロジェクトには、個別に審査された最終的な署名付きイメージが含まれます。
次のステップ
- ベースイメージ パイプラインの使用方法を学習する。
- カスタマイズされたセキュリティ ポリシーを指定する方法を学習する。