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

このチュートリアルでは、Cloud Build パイプラインで Binary Authorization 証明書を作成する方法について説明します。この設定により、Cloud Build のビルドプロセスでビルドされ、署名されたコンテナ イメージのみを自動的に認証し、デプロイ環境での実行を許可できます。

Cloud Build の概要

Cloud Build は、ホスト リポジトリから取得したソースコードのビルドとテストを行い、生成されたソフトウェア出力を、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. コンテナ イメージをビルドするためのコードがソース リポジトリに 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. \
      --role roles/binaryauthorization.attestorsViewer
    
  6. Cloud KMS 暗号鍵の署名者 / 検証者ロールを Cloud Build サービス アカウントに追加します。(KMS ベースの署名)

    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
      --member serviceAccount:${PROJECT_NUMBER}@cloudbuild. \
      --role roles/cloudkms.signerVerifier
    
  7. Cloud Build サービス アカウントに Artifact Analysis メモ添付者のロールを追加します。

    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
      --member serviceAccount:${PROJECT_NUMBER}@cloudbuild. \
      --role roles/containeranalysis.notes.attacher
    

Cloud Build でカスタム ビルドステップをビルドして登録する

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

    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
    

次のステップ