Cloud Build パイプラインで Binary Authorization 証明書を作成する

このチュートリアルでは、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 Build と Binary Authorization による認証パイプライン。
図 1. Binary Authorization 証明書を作成する Cloud Build パイプライン。

このパイプラインの場合:

  1. コンテナ イメージをビルドするためのコードが Cloud Source Repositories などのソース リポジトリに push されます。

  2. 継続的インテグレーション(CI)ツールである Cloud Build が、コンテナをビルドしてテストします。

  3. ビルドがコンテナ イメージを Container Registry に push するか、ビルドされたイメージを格納する別のレジストリに push します。

  4. 暗号鍵ペアの鍵管理を行う Cloud Key Management Service が、コンテナ イメージに署名します。生成された署名は、新しく作成された証明書に保存されます。

  5. デプロイ時に、認証者が鍵ペアの公開鍵を使用して証明書を検証します。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 サービス アカウントにロールを追加するには、次のコマンドを使用します。

  1. Cloud Build を有効にします。

    ターゲットの Google Cloud プロジェクトで Cloud Build API を有効にします

  2. プロジェクト ID を環境変数に保存します。

    PROJECT_ID=PROJECT_ID
    

    ここで、PROJECT_ID は Google Cloud プロジェクト ID です。

  3. プロジェクトの Google Cloud CLI を設定します。

    gcloud config set project ${PROJECT_ID}
    
  4. プロジェクト番号を取得します。

    PROJECT_NUMBER=$(gcloud projects list --filter="${PROJECT_ID}" --format="value(PROJECT_NUMBER)")
    
  5. Cloud Build サービス アカウントに Binary Authorization 認証者 / 閲覧者のロールを追加します。

    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
      --member serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
      --role roles/binaryauthorization.attestorsViewer
    
  6. Cloud KMS 暗号鍵の署名者 / 検証者ロールを Cloud Build サービス アカウントに追加します。(KMS ベースの署名)

    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
      --member serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
      --role roles/cloudkms.signerVerifier
    
  7. 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 でカスタム ビルドステップをビルドして登録する

  1. Google Cloud ビルド コミュニティ リポジトリのクローンを作成します。

    git clone https://github.com/GoogleCloudPlatform/cloud-builders-community.git
    
  2. 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 を手動で更新する

  1. 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 証明書のサンプル パイプラインをテストするには、次の操作を行います。

  1. 以前に設定した環境変数を使用して 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
    
  2. サンプルの cloudbuild_example.yaml を使用して Cloud Build を実行します。

    cloud-builders-community/binauthz-attestation/example ディレクトリから、次のコマンドを実行します。

    gcloud builds submit . --config cloudbuild_example.yaml
    

次のステップ