VPC Service Controls を使用する

VPC Service Controls は、Google Cloud の機能で、データ漏洩を防ぐためのセキュアな境界を設定できます。このページでは、Cloud Build プライベート プールで VPC Service Controls を使用してビルドのセキュリティを高める方法について説明します。

制限事項

VPC Service Controls の保護は、プライベート プールで実行されるビルドでのみ使用できます。VPC Service Controls は、デフォルトのプールで実行されるビルドでは使用できません。

始める前に

  • このガイドのコマンドラインの例を使用するには、Google Cloud CLI をインストールして構成します。

  • Virtual Private Cloud ネットワークとプライベート プールがある VPC ネットワークとの間にプライベート接続を設定します。手順については、プライベート プールを作成するための環境を設定するをご覧ください。

VPC Service Controls の境界にプライベート プールを設定する

VPC Service Controls を Cloud Build で使用するには、まず、組織レベルでサービス境界を作成して構成する必要があります。この設定により、Cloud Build を使用するときに VPC Service Controls のチェックが適用され、デベロッパーは VPC Service Controls に準拠するビルドのみを実行できるようになります。

VPC Service Controls の境界を作成する

Identity and Access Management の権限: サービス境界を設定するには、組織閲覧者ロールとAccess Context Manager 編集者ロールが必要です。これらのロールを付与する方法については、Cloud Build リソースへのアクセスの構成をご覧ください。

VPC Service Controls の境界を作成する手順は、次のとおりです。

VPC Service Controls クイックスタートに従って次の操作を行います。

  1. サービス境界を作成する。
  2. プライベート プールを作成する予定のプロジェクトを境界に追加する。

  3. Cloud Build API を制限する。

サービス境界を設定すると、Cloud Build API のすべての呼び出しが同じ境界内で発生しているか確認されます。

Cloud Build サービス アカウントに VPC Service Controls の境界へのアクセスを許可する

Cloud Build は、Cloud Build サービス アカウントまたはユーザー指定のサービス アカウントを使用して、ユーザーの代わりにビルドを実行します。次の場合は、境界内のリソースにビルドがアクセスできるよう、サービス アカウントに VPC Service Controls の境界へのアクセス権を付与する必要があります。

ユーザー指定のサービス アカウントを使用して Cloud Build API またはコマンドラインでビルドを開始する場合、VPC Service Controls の境界へのアクセス権をサービス アカウントに付与する必要はありません。

次の手順で、Cloud Build サービス アカウントに VPC Service Controls の境界へのアクセス権を付与します。

  1. Cloud Build サービス アカウントまたはユーザー指定のサービス アカウントのメールアドレスをメモします。Cloud Build サービス アカウントのメールアドレスを取得します。

    1. [IAM] ページを開きます。

      [IAM] ページを開く

    2. サービス境界に追加したプロジェクトを選択します。

    3. 権限の表で、末尾が @cloudbuild.gserviceaccount.com のメールアドレスを見つけてメモします。これは Cloud Build サービス アカウントです。

  2. サービス アカウントが Cloud Build API を呼び出すことができるようにサービス境界の上り(内向き)ポリシーを更新します。この上り(内向き)ルールにより、サービス アカウントは CreateBuild API 呼び出しを行うことができます。VPC Service Controls の上り(内向き)ポリシーの設定については、上り(内向き)ポリシーと下り(外向き)ポリシーの構成上り(内向き)のルールと下り(外向き)のルールをご覧ください。

    - ingressFrom:
        identities:
        - serviceAccount:SERVICE_ACCOUNT_EMAIL
        sources:
        - accessLevel: '*'
      ingressTo:
        operations:
        - serviceName: 'cloudbuild.googleapis.com'
          methodSelectors:
          - method: 'CreateBuild'
        resources:
        - 'projects/PROJECT_NUMBER'
    
  3. 変数を適切な値に置き換えて次のコマンドを実行し、境界ポリシーを更新します。

    gcloud beta access-context-manager perimeters update PERIMETER_NAME \
        --set-ingress-policies=INGRESS-FILENAME
        --policy=POLICY_ID
    

前述の変数を次のように置き換えます。

  • SERVICE_ACCOUNT_EMAIL: Cloud Build サービス アカウントまたはユーザー指定のサービス アカウントのメールアドレス。
  • PROJECT_NUMBER: VPC Service Controls の境界に追加した Cloud プロジェクトのプロジェクト番号。
  • PERIMETER_NAME: VPC Service Controls の境界の名前。
  • INGRESS-FILENAME: 上り(内向き)ポリシー ファイルの名前。
  • POLICY_ID: アクセス ポリシーの ID。

省略可: 開発用マシンの境界アクセスを有効にする

VPC Service Controls のチェックが Cloud Build API に適用されるため、Cloud Build API の呼び出しは同じサービス境界内から発生しない限り失敗します。したがって、Cloud Build API、Cloud Console の Cloud Build UI、Google Cloud CLI を使用してビルドを管理するには、次のいずれかの方法を選択します。

  • VPC Service Controls の境界内のマシンを使用する。たとえば、Compute Engine VM や、VPN 経由の VPC ネットワークに接続されたオンプレミス マシンを使用できます。

  • デベロッパーに境界へのアクセスを許可する。たとえば、IP アドレスやユーザー ID に基づいて境界のアクセスを有効にするアクセスレベルを作成できます。詳細については、保護されたリソースへの境界外部からのアクセスの許可をご覧ください。

組織のポリシーの制約の設定

VPC Service Controls のチェックが正しく適用され、指定したプライベート プールのみを使用するように Google Cloud 組織のビルドを制限するには、constraints/cloudbuild.allowedWorkerPools 組織のポリシーの制約を設定します。組織のポリシーは、組織全体に適用することも、組織内のプロジェクトやフォルダに適用することもできます。たとえば、組織のポリシーでは次のように指定できます。

  • 組織内のすべてのビルドが指定されたプライベート プールを使用する。
  • フォルダ内のすべてのビルドが指定されたプライベート プールを使用する。
  • プロジェクト内のすべてのビルドが指定されたプライベート プールを使用する。

IAM 権限: 組織のポリシーを管理するには、組織のポリシー管理者roles/orgpolicy.policyAdmin)のロールが必要です。ロールを付与する方法については、Cloud Build リソースへのアクセスを構成するをご覧ください。

gcloud resource-manager org-policies allow コマンドは、組織内のビルドで指定されたプライベート プールのみを使用するように、組織のポリシーを設定します。

 gcloud resource-manager org-policies allow \
     cloudbuild.allowedWorkerPools \
     projects/PRIVATEPOOL_PROJECT_ID/locations/LOCATION/workerPools/PRIVATEPOOL_ID \
     --organization ORGANIZATION_ID

上記のコマンドのプレースホルダ値を次のように置き換えます。

  • PRIVATEPOOL_ID: ビルドを実行するプライベート プールの ID。

  • PRIVATEPOOL_PROJECT_ID: プライベート プールを含む Cloud プロジェクトの ID。

  • LOCATION: プライベート プールを含むリージョン。

  • ORGANIZATION_ID: ビルドを実行している組織の ID。

このコマンドは under:is 接頭辞をサポートしています。

組織内のすべてのビルドが組織内の任意のプライベート プールを使用するように組織のポリシーを設定するには:

 gcloud resource-manager org-policies allow \
     cloudbuild.allowedWorkerPools under:organizations/ORGANIZATION_ID \
     --organization ORGANIZATION_ID

ここで、ORGANIZATION_ID はプライベート プールを含む組織の ID です。

フォルダに含まれるすべてのプロジェクト内のビルドが、指定されたプロジェクトのプライベート プールを使用する必要がある組織のポリシーを設定するには:

 gcloud resource-manager org-policies allow \
     cloudbuild.allowedWorkerPools under:projects/PROJECT_ID \
     --folder FOLDER_ID

ここで、PROJECT_ID はプライベート プールを含むプロジェクトの ID です。FOLDER_ID は、ビルドを実行しているプロジェクトです。

プロジェクト内のすべてのプロジェクトで指定したプロジェクト内の任意のプライベート プールを使用するよう組織のポリシーを設定するには:

 gcloud resource-manager org-policies allow \
     cloudbuild.allowedWorkerPools under:projects/PRIVATEPOOL_PROJECT_ID \
     --project BUILD_PROJECT_ID

ここで、PRIVATEPOOL_PROJECT_ID はプライベート プールを含むプロジェクトの ID で、BUILD_PROJECT_ID はビルドを実行しているプロジェクトの ID です。

constraints/cloudbuild.allowedWorkerPools 組織ポリシーの制約を適用する場合は、次の点に留意してください。

  • この組織のポリシーの制約を Cloud プロジェクトに適用する場合は、プロジェクト内のすべてのビルドでプライベート プールを使用するようにしてください。デフォルトの共有プールを使用しようとすると、ビルドが失敗します。

  • Google Cloud 組織に Cloud Build を暗黙的に使用する App Engine や Cloud Functions などのサービスが含まれている場合、この制約を適用すると、これらのサービスが想定どおりに動作しないことがあります。

サービス境界にプライベート プールを作成する

Console

  1. Google Cloud Console で [ワーカープール] ページを開きます。

    Cloud Build ワーカープールのページを開く

  2. プライベート プールを作成するプロジェクトを選択します。

  3. [ワーカープール] ページで、[作成] をクリックします。

  4. [プライベート プールの作成] サイドパネルで、次の操作を行います。

    1. プライベート プールの名前を入力します。

    2. プライベート プールを作成するリージョンを選択します。

    3. プライベート プールに使用する Compute Engine マシンタイプを選択します。

    4. VPC ネットワークを作成した Cloud プロジェクトのプロジェクト番号を入力します。

    5. VPC ネットワークの名前を入力します。

    6. [外部 IP を割り当てる] チェックボックスをオフにします。

    7. [作成] をクリックします。

gcloud

  1. YAML 形式または JSON 形式でプライベート プール構成ファイルを作成し、egressOption フラグを NO_PUBLIC_EGRESS に設定します。

    privatePoolV1Config:
      networkConfig:
        egressOption: NO_PUBLIC_EGRESS
        peeredNetwork: PEERED_NETWORK
    workerConfig:
      diskSizeGb: 'PRIVATE_POOL_DISK_SIZE'
      machineType: PRIVATE_POOL_MACHINE_TYPE
    

    ここで

    • PEERED_NETWORK は、サービス プロバイダ ネットワークとピアリングされているネットワークのネットワーク リソース URL です。PEERED_NETWORKprojects/NETWORK_PROJECT_ID/global/networks/NETWORK_NAME の形式にする必要があります。ここで、NETWORK_PROJECT_ID は、VPC ネットワークを保持する Cloud プロジェクトのプロジェクト ID、NETWORK_NAME は VPC ネットワークの名前です。
    • PRIVATE_POOL_MACHINE_TYPE は、プライベート プール インスタンスの Compute Engine マシンタイプです。サポート対象のマシンタイプについては、プライベート プール構成ファイルのスキーマをご覧ください。
    • PRIVATE_POOL_DISK_SIZE は、プライベート プール インスタンスのディスクサイズ(GB 単位)です。100 以上、1,000 以下の値を指定します。0 を指定すると、Cloud Build はデフォルト値の 100 を使用します。
    • egressOption は、プライベート プール用に VPC Service Controls の境界を有効にするフラグです。これを NO_PUBLIC_EGRESS に設定して、VPC Service Controls の境界内にプライベート プールを作成します。
  2. 次の gcloud コマンドを実行します。ここで、PRIVATEPOOL_ID はプライベート プールの一意の識別子、PRIVATEPOOL_CONFIG_FILE はプライベート プールの構成ファイルの名前、REGION はプライベート プールを作成するリージョンです。

    gcloud builds worker-pools create PRIVATEPOOL_ID --config-from-file PRIVATEPOOL_CONFIG_FILE --region REGION
    

省略可: VPC ネットワークで公共のインターネット呼び出しを有効にする。

リポジトリがホストされている場所(github.com など)へのネットワーク接続が許可されるように、VPC ネットワークを必ず以下のように構成します。

  1. プライベート プール構成ファイルで、egressOption フィールドが NO_PUBLIC_EGRESS に設定されていることを確認する。

  2. プライベート プールが実行されている VPC ネットワークが、PeeredNetwork として定義されている。リポジトリ ホストへの呼び出しを許可するには、この VPC ネットワークでリポジトリ ホストへのパブリック下り(外向き)トラフィックが許可されるようにします。これを行う方法については、ルートとファイアウォール ルールをご覧ください。

サービス境界内のプライベート プールでビルドを実行する

サービス境界内で実行されたビルドは、公共のインターネットにアクセスできません。このため、いくつかのアクションを実行した後、ビルドを行う必要があります。

ビルドされたイメージとアーティファクトを push する

ビルドでイメージとアーティファクトが別の Cloud プロジェクト内にある Container Registry、Artifact Registry、Cloud Storage に push されている場合は、必ずそのプロジェクトをビルド元のプロジェクトと同じサービス境界に追加してください。

ログバケットの作成

サービス境界内で実行されるビルドには、デフォルトの Cloud Storage ログバケット内にビルドログを保存する権限がありません。 次のいずれかのオプションを選択します。

ビルドの実行

プライベート プールでのビルドの実行の手順を使ってビルドを実行します。

次のステップ