VPC Service Controls は Google Cloud の機能で、データの引き出しを防ぐためのセキュアな境界を設定できます。このページでは、Cloud Build プライベート プールで VPC Service Controls を使用してビルドのセキュリティを高める方法について説明します。
始める前に
このガイドのコマンドラインの例を使用するには、Google Cloud CLI をインストールして構成します。
Virtual Private Cloud ネットワークとプライベート プールがある VPC ネットワークとの間にプライベート接続を設定します。手順については、プライベート プールを作成するための環境を設定するをご覧ください。
サービス境界内で実行されるビルドには、デフォルトの Cloud Storage ログバケット内にビルドログを保存する権限がありません。ビルドを実行する前に、次のいずれかのオプションを使用してビルド構成ファイルをセットアップします。
loggingMode
をCLOUD_LOGGING_ONLY
に設定して、ビルドログを Cloud Logging に保存することを選択します。- プライベート プロジェクトに、ビルドログを保存する Cloud Storage ログバケットを作成します。詳細については、ユーザーが作成したバケットへのビルドログの保存をご覧ください。
loggingMode
をNONE
に設定してビルドログを無効にします。
ビルドでイメージとアーティファクトが別の Google Cloud プロジェクトの Artifact Registry または Cloud Storage に push されている場合は、ビルド元のプロジェクトと同じサービス境界にそのプロジェクトを追加します。
省略可: マシンタイプの構成とリージョンでの可用性を確認します。詳細については、プライベート プール構成ファイルのスキーマ ドキュメントの
workerconfig
をご覧ください。
サービス境界の設定に必要な権限を取得するには、サービス アカウントに対する次の IAM ロールを付与するよう管理者に依頼します。
-
組織閲覧者(
roles/resourcemanager.organizationViewer
) -
Access Context Manager 編集者 (
roles/accesscontextmanager.policyEditor
)
ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。
必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。
VPC Service Controls の境界にプライベート プールを設定する
VPC Service Controls を Cloud Build で使用するには、まず、組織レベルでサービス境界を作成して構成する必要があります。この設定により、Cloud Build を使用するときに VPC Service Controls のチェックが適用され、デベロッパーは VPC Service Controls に準拠するビルドのみを実行できるようになります。
VPC Service Controls の境界を作成する
VPC Service Controls クイックスタートに従って次の操作を行います。
- サービス境界を作成する。
プライベート プールを作成する予定のプロジェクトを境界に追加する。
Cloud Build API を制限する。
サービス境界を設定すると、Cloud Build API のすべての呼び出しが同じ境界内で発生しているか確認されます。
サービス アカウントに VPC Service Controls の境界へのアクセス権を付与する
次の場合、ビルドが境界内のリソースにアクセスできるようにするには、以前の Cloud Build または Compute Engine サービス アカウントに VPC Service Controls の境界へのアクセス権を付与する必要があります。
以前の Cloud Build または Compute Engine サービス アカウントを使用して、ビルドトリガー、Cloud Build API、またはコマンドラインでビルドを開始する場合。
ユーザー指定のサービス アカウントを使用してビルドトリガーでビルドを開始する場合。
ユーザー指定のサービス アカウントを使用して Cloud Build API またはコマンドラインでビルドを開始する場合、以前の Cloud Build または Compute Engine サービス アカウントに VPC Service Controls の境界へのアクセス権を付与する必要はありません。
次の手順で、以前の Cloud Build または Compute Engine サービス アカウントに VPC Service Controls の境界へのアクセス権を付与します。
以前のサービス アカウントのメールアドレスをメモします。
[IAM] ページを開きます。
サービス境界に追加したプロジェクトを選択します。
権限テーブルで、以前の Cloud Build サービス アカウントに対応するメールアドレスを見つけます。
サービス境界の上り(内向き)ポリシーを更新して、サービス アカウントが 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'
変数を適切な値に置き換えて次のコマンドを実行し、境界ポリシーを更新します。
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 コンソール
Google Cloud コンソールで [ワーカープール] ページを開きます。
[プライベート プールを作成] をクリックします。
[プライベート プールの作成] ページが表示されます。
次の情報を入力して、プライベート プールを作成します。
名前: プライベート プールの名前を入力します。この値には、英数字
/[a-z][0-9]/
またはダッシュ-
のみを使用できます。プライベート プールの名前は 1 ~ 63 文字にする必要があります。リージョン: プライベート プールを作成するリージョンを選択します。
マシンの構成: 次のように構成します。
シリーズ: マシンシリーズを選択します。
マシンタイプ: この設定には、選択したマシンシリーズに基づいて、ワーカー プールで使用できるマシンタイプが表示されます。使用可能なマシンタイプはリージョンによって異なります。
ディスクサイズ: プライベート プールのディスクサイズを入力します。100 以上、4,000 以下の値を指定します。値を指定しない場合、Cloud Build はディスクサイズ 100 を使用します。
ネストされた仮想化: C3 シリーズのマシンを選択した場合は、ネストされた仮想化を有効にできます。この機能を使用すると、他の VM 内で仮想マシン(VM)インスタンスを実行して、独自の仮想環境を作成できます。
[ネットワークの種類] で [プライベート ネットワーク] を選択し、次の項目を選択します。
プロジェクト: Google Cloud プロジェクト ID を選択します。
ネットワーク: プルダウン メニューからネットワークを選択します。ネットワークを作成していない場合は、VPC ネットワークを作成して管理するでネットワークの作成方法を確認してください。
[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 アドレスに自動的に割り振られます。[外部 IP を割り当てる] をオフにして、プライベート ネットワークへのアクセスを制限します。
[作成] をクリックして、プライベート プールを作成します。
gcloud
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_NETWORK
はprojects/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 の境界内にプライベート プールを作成します。
次の
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 ネットワークが、PeeredNetwork として定義されている。リポジトリ ホストへの呼び出しを許可するには、この VPC ネットワークでリポジトリ ホストへのパブリック下り(外向き)トラフィックが許可されるようにします。これを行う方法については、ルートとファイアウォール ルールをご覧ください。
次のいずれかを行います。
プライベート プール構成ファイルで、
egressOption
フィールドをPUBLIC_EGRESS
に設定します。
制限事項
VPC Service Controls の保護は、プライベート プールで実行されるビルドでのみ使用できます。VPC Service Controls は、デフォルトのプールで実行されるビルドでは使用できません。
VPC Service Controls が使用されている場合、Cloud Build Pub/Sub トリガーはサポートされません。
次のステップ
- プライベート プールでビルドを実行する方法を確認する。
- 一般的に使用されるネットワーキングのユースケースを構成する方法を確認する。