VPC Service Controls を使用する

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

始める前に

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

  • 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 のすべての呼び出しが同じ境界内で発生しているか確認されます。

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

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

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

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

省略可: 組織のポリシーの制約を設定する

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

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

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

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

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

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

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

  • WORKERPOOL_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/WORKERPOOL_PROJECT_ID \
     --project BUILD_PROJECT_ID

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

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

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

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

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

Cloud Build は、Cloud Build サービス アカウントを使用してビルドを実行します。デフォルトでは、Cloud Build サービス アカウントは VPC Service Controls の境界外には残りますが、境界を含む Cloud プロジェクトは境界内にあります。このため、ビルドが境界内のリソースにアクセスできるようにするには、Cloud Build サービス アカウントに VPC Service Controls の境界へのアクセス権を付与する必要があります。この手順を避けるには、Cloud Build サービス アカウントの代わりにユーザー指定のサービス アカウントを使用します。対応する Cloud プロジェクトが境界内にある場合、ユーザー指定のサービス アカウントは VPC Service Controls の境界内にあります。

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

  1. Cloud Build サービス アカウントのメールアドレスを取得します。

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

      [IAM] ページを開く

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

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

  2. ユーザー アカウントまたはサービス アカウントによるアクセスを制限するの手順に沿って、Cloud Build サービス アカウントのアクセスレベルを作成します。

  3. 既存の境界にアクセスレベルを追加するの手順に従って、サービス境界にアクセスレベルを追加します。

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

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: 'WORKER_POOL_DISK_SIZE'
      machineType: WORKER_POOL_MACHINE_TYPE
    

    ここで

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

    gcloud builds worker-pools create WORKERPOOL_ID --config-from-file WORKERPOOL_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 ログバケット内にビルドログを保存する権限がありません。 次のいずれかのオプションを選択します。

ビルドの実行

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

次のステップ