このチュートリアルでは、Cloud Build パイプラインで Binary Authorization 証明書を作成する方法について説明します。この設定により、Cloud Build のビルドプロセスでビルドされ、署名されたコンテナ イメージのみを自動的に認証し、デプロイ環境での実行を許可できます。
Cloud Build ビルド パイプラインで Artifact Analysis の脆弱性スキャンを使用する方法については、Voucher で証明書を作成するまたは Kritis Signer で証明書を作成するをご覧ください。
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
次のステップ
- Kritis Signer または Voucher を使用して、イメージの脆弱性を確認した後で証明書を作成する。
- カスタムの Cloud Build ステップを作成し、Binary Authorization 証明書に署名して GitHub にアップロードする。