VPC Service Controls は、Google Cloud の機能で、データの引き出しを防ぐためのセキュアな境界を設定できます。このページでは、Cloud Build プライベート プールで VPC Service Controls を使用してビルドのセキュリティを高める方法について説明します。
制限事項
VPC Service Controls の保護は、プライベート プールで実行されるビルドでのみ使用できます。VPC Service Controls は、デフォルトのプールで実行されるビルドでは使用できません。
VPC Service Controls が使用されている場合、Cloud Build Pub/Sub トリガーはサポートされません。
始める前に
このガイドのコマンドラインの例を使用するには、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 クイックスタートに従って次の操作を行います。
- サービス境界を作成する。
プライベート プールを作成する予定のプロジェクトを境界に追加する。
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 API を呼び出すことができるようにします。この上り(内向き)ルールにより、サービス アカウントは
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 Functions などのサービスが含まれている場合、この制約を適用すると、これらのサービスが想定どおりに動作しないことがあります。
サービス境界にプライベート プールを作成する
コンソール
Google Cloud Console で [ワーカープール] ページを開きます。
プライベート プールを作成するプロジェクトを選択します。
[ワーカープール] ページで、[作成] をクリックします。
[プライベート プールの作成] サイドパネルで、次の操作を行います。
プライベート プールの名前を入力します。
プライベート プールを作成するリージョンを選択します。
プライベート プールに使用する Compute Engine マシンタイプを選択します。
VPC ネットワークを作成した Google Cloud プロジェクトのプロジェクト番号を入力します。
VPC ネットワークの名前を入力します。
[外部 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 ネットワークを必ず以下のように構成します。
プライベート プール構成ファイルで、
egressOption
フィールドがNO_PUBLIC_EGRESS
に設定されていることを確認する。プライベート プールが実行されている VPC ネットワークが、PeeredNetwork として定義されている。リポジトリ ホストへの呼び出しを許可するには、この VPC ネットワークでリポジトリ ホストへのパブリック下り(外向き)トラフィックが許可されるようにします。これを行う方法については、ルートとファイアウォール ルールをご覧ください。
サービス境界内のプライベート プールでビルドを実行する
サービス境界内で実行されたビルドは、公共のインターネットにアクセスできません。このため、いくつかのアクションを実行した後、ビルドを行う必要があります。
ビルドされたイメージとアーティファクトを push する
ビルドでイメージとアーティファクトが別の Google Cloud プロジェクト内にある Container Registry(非推奨)、Artifact Registry、Cloud Storage に push されている場合は、必ずそのプロジェクトをビルド元のプロジェクトと同じサービス境界に追加してください。
ログバケットの作成
サービス境界内で実行されるビルドには、デフォルトの Cloud Storage ログバケット内にビルドログを保存する権限がありません。 次のいずれかのオプションを選択します。
loggingMode
をCLOUD_LOGGING_ONLY
に設定して、ビルドログを Cloud Logging に保存することを選択します。- プライベート プロジェクトに、ビルドログを保存する Cloud Storage ログバケットを作成します。これを行う方法については、ユーザーが作成したバケットへのビルドログの保存をご覧ください。
loggingMode
をNONE
に設定してビルドログを無効にします。
ビルドの実行
プライベート プールでのビルドの実行の手順を使ってビルドを実行します。
次のステップ
- プライベート プールでビルドを実行する方法を確認する。
- 一般的に使用されるネットワーキングのユースケースを構成する方法を確認する。