このチュートリアルでは、Cloud Build パイプラインで Binary Authorization 証明書を作成する方法について説明します。この設定により、Cloud Build のビルドプロセスでビルドされ、署名されたコンテナ イメージのみを自動的に認証し、デプロイ環境での実行を許可できます。
Cloud Build の概要
Cloud Build は、Cloud Source Repositories または別のホスト リポジトリから取得したソースコードのビルドとテストを行い、生成されたソフトウェア出力を Container Registry または Google Cloud Platform 上の別のストレージ サービスに保存します(概要は こちらをご覧ください)。
Binary Authorization の概要
Binary Authorization(概要)は、アプリケーションにデプロイ時間の制約を適用するGoogle Cloud プロダクトです。Google Kubernetes Engine(GKE)との統合により、Kubernetes クラスタにデプロイされたコンテナは、信頼できる認証局によって暗号で署名され、Binary Authorization 認証者によって検証されます。
ソースコードの場所に基づいて証明書を要求するように Binary Authorization を構成することで、未承認のソースからビルドされたコンテナ イメージのデプロイを防ぐことができます。
詳しくは、次のリソースをご覧ください。
アーキテクチャ
次の図は、Binary Authorization と Cloud Build の統合環境のコンポーネントを表しています。

このパイプラインの場合:
コンテナ イメージをビルドするためのコードが Cloud Source Repositories などのソース リポジトリに push されます。
継続的インテグレーション(CI)ツールである Cloud Build が、コンテナをビルドしてテストします。
ビルドがコンテナ イメージを Container Registry に push するか、ビルドされたイメージを格納する別のレジストリに push します。
暗号鍵ペアの鍵管理を行う Cloud Key Management Service が、コンテナ イメージに署名します。生成された署名は、新しく作成された証明書に保存されます。
デプロイ時に、認証者が鍵ペアの公開鍵を使用して証明書を検証します。Binary Authorization が、コンテナ イメージをデプロイするために署名付きの証明書を要求して、ポリシーを適用します。
Cloud Build と Cloud Key Management Service を使用して証明書を作成する
このセクションでは、上記のアーキテクチャの実装方法について説明します。Cloud Build コミュニティからオープンソースのカスタムビルド ステップを取得して使用します。カスタムビルド ステップでコンテナ イメージに署名し、証明書を作成して Binary Authorization にアップロードします。
Identity and Access Management を管理する
このビルドステップを使用するには、Cloud Build サービス アカウントに次の IAM ロールが必要です。
- Binary Authorization 認証者閲覧者
roles/binaryauthorization.attestorsViewer
- Cloud KMS 暗号鍵の署名者 / 検証者(KMS の鍵を使用して証明書に署名する場合)
roles/cloudkms.signerVerifier
- Artifact Analysis メモ添付者
roles/containeranalysis.notes.attacher
プロジェクトの Cloud Build サービス アカウントにロールを追加するには、次のコマンドを使用します。
Cloud Build を有効にします。
ターゲットの Google Cloud プロジェクトで Cloud Build API を有効にします。
プロジェクト ID を環境変数に保存します。
PROJECT_ID=PROJECT_ID
ここで、PROJECT_ID は Google Cloud プロジェクト ID です。
プロジェクトの Google Cloud CLI を設定します。
gcloud config set project ${PROJECT_ID}
プロジェクト番号を取得します。
PROJECT_NUMBER=$(gcloud projects list --filter="${PROJECT_ID}" --format="value(PROJECT_NUMBER)")
Cloud Build サービス アカウントに Binary Authorization 認証者 / 閲覧者のロールを追加します。
gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \ --role roles/binaryauthorization.attestorsViewer
Cloud KMS 暗号鍵の署名者 / 検証者ロールを Cloud Build サービス アカウントに追加します。(KMS ベースの署名)
gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \ --role roles/cloudkms.signerVerifier
Cloud Build サービス アカウントに Artifact Analysis メモ添付者のロールを追加します。
gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \ --role roles/containeranalysis.notes.attacher
Cloud Build でカスタム ビルドステップをビルドして登録する
Google Cloud ビルド コミュニティ リポジトリのクローンを作成します。
git clone https://github.com/GoogleCloudPlatform/cloud-builders-community.git
Cloud Build の Binary Authorization 署名者を構成します。
使用する前に、カスタム ビルドステップのコードをコンテナにビルドし、Cloud Build に push する必要があります。この操作を行うには、次のコマンドを実行します。
cd cloud-builders-community/binauthz-attestation gcloud builds submit . --config cloudbuild.yaml
カスタム ビルドステップが現在のプロジェクトの Google Container Registry に push され、使用可能な状態になりました。
Binary Authorization で認証者を作成する
証明書を検証する際に、Binary Authorization がデプロイ時に使用する認証者を作成します。
Binary Authorization で認証者と Cloud Key Management Service の鍵ペアを設定します。
CLI で認証者を作成するをご覧ください。
認証者が作成されたことを確認する
gcloud --project="${ATTESTOR_PROJECT_ID}" container binauthz attestors list
cloudbuild.yaml
に create-attestation ステップを追加する
binauthz-attestation
ステップを使用するには、cloudbuild.yaml
を更新して、Container Registry に push されたビルドに署名するステップを追加します。
次の 2 つの方法があります。
cloudbuild.yaml
を手動で更新します。前に設定した環境変数を使用して、サンプル パイプラインを実行します。
cloudbuild.yaml
を手動で更新する
cloudbuild.yaml
を手動で更新するには、コンテナを Container Registry にアップロードしたステップの後に以下のビルドステップを追加します。注: ATTESTOR_NAME、KMS_KEY_LOCATION、KMS_KEYRING_NAME、KMS_KEY_NAME、KMS_KEY_VERSION は、実際の値に手動で置き換えてください。- id: 'create-attestation' name: 'gcr.io/${PROJECT_ID}/binauthz-attestation:latest' args: - '--artifact-url' - 'gcr.io/${PROJECT_ID}/helloworld:latest' - '--attestor' - 'projects/${PROJECT_ID}/attestors/ATTESTOR_NAME' - '--keyversion' - 'projects/${PROJECT_ID}/locations/KMS_KEY_LOCATION/keyRings/KMS_KEYRING_NAME/cryptoKeys/KMS_KEY_NAME/cryptoKeyVersions/KMS_KEY_VERSION'
以下も有効です。
- id: 'create-attestation' name: 'gcr.io/${PROJECT_ID}/binauthz-attestation:latest' args: - '--artifact-url' - 'gcr.io/${PROJECT_ID}/helloworld:latest' - '--attestor' - 'ATTESTOR_NAME' - '--attestor-project' - '${PROJECT_ID}' - '--keyversion' - 'KEY_VERSION' - '--keyversion-project' - '${PROJECT_ID}' - '--keyversion-location' - 'KEY_LOCATION' - '--keyversion-keyring' - 'KEYRING_NAME' - '--keyversion-key' - 'KEY_NAME'
省略可: パイプラインをテストする
Cloud Build 証明書のサンプル パイプラインをテストするには、次の操作を行います。
以前に設定した環境変数を使用して
cloudbuild.yaml
ファイルを作成します。cd example cat <<EOM > cloudbuild_example.yaml steps: - id: 'build' name: 'gcr.io/cloud-builders/docker' args: - 'build' - '-t' - 'gcr.io/$PROJECT_ID/helloworld:latest' - '.' - id: 'publish' name: 'gcr.io/cloud-builders/docker' args: - 'push' - 'gcr.io/$PROJECT_ID/helloworld:latest' - id: 'create-attestation' name: 'gcr.io/$PROJECT_ID/binauthz-attestation:latest' args: - '--artifact-url' - 'gcr.io/$PROJECT_ID/helloworld:latest' - '--attestor' - 'projects/$PROJECT_ID/attestors/${ATTESTOR_NAME}' - '--keyversion' - 'projects/${PROJECT_ID}/locations/${KMS_KEY_LOCATION}/keyRings/${KMS_KEYRING_NAME}/cryptoKeys/${KMS_KEY_NAME}/cryptoKeyVersions/${KMS_KEY_VERSION}' tags: ['cloud-builders-community'] EOM
サンプルの
cloudbuild_example.yaml
を使用して Cloud Build を実行します。cloud-builders-community/binauthz-attestation/example
ディレクトリから、次のコマンドを実行します。gcloud builds submit . --config cloudbuild_example.yaml