VPC Service Controls を使用する

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

始める前に

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

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

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

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

  • 省略可: マシンタイプの構成とリージョンでの可用性を確認します。詳細については、プライベート プール構成ファイルのスキーマ ドキュメントの workerconfig をご覧ください。

サービス境界の設定に必要な権限を取得するには、サービス アカウントに対する次の IAM ロールを付与するよう管理者に依頼します。

ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

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

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

VPC Service Controls の境界を作成する

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

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

  3. Cloud Build API を制限する。

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

サービス アカウントに VPC Service Controls の境界へのアクセス権を付与する

次の場合、ビルドが境界内のリソースにアクセスできるようにするには、以前の Cloud Build または Compute Engine サービス アカウントに VPC Service Controls の境界へのアクセス権を付与する必要があります。

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

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

  1. 以前のサービス アカウントのメールアドレスをメモします。

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

      [IAM] ページを開く

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

    3. 権限テーブルで、以前の Cloud Build サービス アカウントに対応するメールアドレスを見つけます。

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

    - ingressFrom:
        identities:
        - serviceAccount:SERVICE_ACCOUNT_EMAIL
        sources:
        - accessLevel: '*'
      ingressTo:
        operations:
        - serviceName: 'cloudbuild.googleapis.com'
          methodSelectors:
          - method: '*'
        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: サービス アカウントのメールアドレス。
  • PROJECT_NUMBER: VPC Service Controls の境界に追加したGoogle Cloud プロジェクトのプロジェクト番号。
  • PERIMETER_NAME: VPC Service Controls の境界の名前。
  • INGRESS-FILENAME: 上り(内向き)ポリシー ファイルの名前。
  • POLICY_ID: アクセス ポリシーの ID。

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

VPC Service Controls のチェックが Cloud Build API に適用されるため、Cloud Build API の呼び出しは同じサービス境界内から発生しない限り失敗します。したがって、Cloud Build API、 Google Cloud コンソールの 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: プライベート プールを含む Google 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 組織ポリシーの制約を適用する場合は、次の点に留意してください。

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

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

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

Google Cloud コンソール

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

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

  2. [プライベート プールを作成] をクリックします。

    [プライベート プールの作成] ページが表示されます。

    次の情報を入力して、プライベート プールを作成します。

  3. 名前: プライベート プールの名前を入力します。この値には、英数字 /[a-z][0-9]/ またはダッシュ - のみを使用できます。プライベート プールの名前は 1 ~ 63 文字にする必要があります。

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

  5. マシンの構成: 次のように構成します。

    1. シリーズ: マシンシリーズを選択します。

    2. マシンタイプ: この設定には、選択したマシンシリーズに基づいて、ワーカー プールで使用できるマシンタイプが表示されます。使用可能なマシンタイプはリージョンによって異なります。

    3. ディスクサイズ: プライベート プールのディスクサイズを入力します。100 以上、4,000 以下の値を指定します。値を指定しない場合、Cloud Build はディスクサイズ 100 を使用します。

    4. ネストされた仮想化: C3 シリーズのマシンを選択した場合は、ネストされた仮想化を有効にできます。この機能を使用すると、他の VM 内で仮想マシン(VM)インスタンスを実行して、独自の仮想環境を作成できます。

  6. [ネットワークの種類] で [プライベート ネットワーク] を選択し、次の項目を選択します。

    1. プロジェクト: Google Cloud プロジェクト ID を選択します。

    2. ネットワーク: プルダウン メニューからネットワークを選択します。ネットワークを作成していない場合は、VPC ネットワークを作成して管理するでネットワークの作成方法を確認してください。

    3. [IP 範囲]: Cloud Build プロデューサー ネットワークがプライベート リポジトリとの接続を維持する VM に割り当てるために使用できる内部 IP 範囲を入力します。

      STARTING_IP_ADDRESS/SUBNET_PREFIX_SIZE 形式のクラスレス ドメイン間ルーティング(CIDR)ルーティング表記を使用して範囲を指定できます。たとえば、192.0.2.0/24 の接頭辞の長さは 24 です。IP 範囲の最初の 24 ビットがサブネット マスク(192.0.2.0)として使用されますが、使用可能なホストアドレスの範囲は 192.0.2.0 から 192.0.2.255 です。

      注: 接頭辞長の値は /29 以下にする必要があります。範囲に値が指定されていない場合は、デフォルト値の /24 が自動的に割り当てられます。接頭辞長に値が指定されていない場合、ピアリングされた VPC ネットワーク内で IP アドレスが自動的に割り当てられます。IP アドレスに値が指定されていない場合、ピアリングされた VPC ネットワーク内の範囲が IP アドレスに自動的に割り振られます。

    4. [外部 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 ネットワークを保持する Google 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 ネットワークで許可するには、次の両方の設定を構成します。

制限事項

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

  • VPC Service Controls が使用されている場合、Cloud Build Pub/Sub トリガーはサポートされません。

次のステップ