VPC Service Controls を構成する

VPC Service Controls は、Google Cloud の機能で、データの引き出しを防ぐためのセキュアな境界を設定できます。このガイドでは、Cloud Functions で VPC Service Controls を使用して、関数のセキュリティを強化する方法を説明します。

この統合に関する既知の制限については、VPC Service Controls のドキュメントをご覧ください。

組織レベルの設定

VPC Service Controls を Cloud Functions で使用するには、組織レベルでサービス境界を構成します。適切な組織のポリシーを構成すると、Cloud Functions を使用するときに VPC Service Controls のチェックを適用し、デベロッパーが VPC Service Controls に準拠するサービスのみをデプロイできるよう設定できます。組織のポリシーの設定時の継承違反の詳細を確認してください。

VPC Service Controls の境界を設定する

サービス境界を設定するには、組織閲覧者roles/resourcemanager.organizationViewer)と Access Context Manager 編集者roles/accesscontextmanager.policyEditor)のロールが必要です。

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

  1. サービス境界を作成する。

  2. 1 つ以上のプロジェクトを境界に追加する。

  3. Cloud Functions API(第 1 世代)、または両方の Cloud Functions API と Cloud Run Admin API(第 2 世代)を制限します。

サービス境界を設定すると、制限付き API へのすべての呼び出しは、同じ境界内で発生した呼び出しであることが確認されます。

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

VPC Service Controls のチェックが Cloud Functions API に適用されるため、Cloud Functions API の呼び出しは同じサービス境界内から発生しない限り失敗します。そのため、Cloud Functions API、Google Cloud コンソールの Cloud Functions UI、Google Cloud CLI で関数を管理するには、次のいずれかのオプションを選択します。

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

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

組織のポリシーを設定する

組織のポリシーを管理するには、組織ポリシー管理者roles/orgpolicy.policyAdmin)のロールが必要です。

VPC Service Controls に準拠し、データの引き出しを防ぐには、次の組織のポリシーを設定してサービス境界における Cloud Functions の許可されるネットワーク設定を管理します。

許可される上り(内向き)設定を制限する

cloudfunctions.allowedIngressSettings 組織のポリシーでは、デベロッパーが Cloud Functions で使用できる上り(内向き)設定を管理します。この組織のポリシーを使用すると、デベロッパーが値 ALLOW_INTERNAL_ONLY を必ず使用するように設定できます。

コンソール

  1. Google Cloud コンソールの [許可される上り(内向き)設定(Cloud Functions)] ポリシーページに移動します。

    組織のポリシーに移動

  2. [ポリシーを管理] をクリックします。

  3. [ポリシーの編集] ページで、[カスタマイズ] を選択します。

  4. [ポリシーの適用] で、[置換] を選択します。

  5. [ポリシーの値] で [カスタム] を選択します。

  6. [ポリシーの種類] で [許可] を選択します。

  7. [カスタム値] で、「ALLOW_INTERNAL_ONLY」を入力します。

  8. [ポリシーを設定] をクリックします。

gcloud

gcloud resource-manager org-policies allow コマンドを使用します。

gcloud resource-manager org-policies allow \
  cloudfunctions.allowedIngressSettings ALLOW_INTERNAL_ONLY \
  --organization ORGANIZATION_ID

ORGANIZATION_ID は組織 ID です。

この組織のポリシーが適用されると、すべての関数で上り(内向き)設定に値 ALLOW_INTERNAL_ONLY を使用しなければならなくなります。つまり、HTTP 関数はサービス境界内の VPC ネットワークから発生するトラフィックのみを受け入れます。異なる値を指定する関数のデプロイは失敗します。

VPC コネクタを要求する

cloudfunctions.requireVPCConnector 組織のポリシーは、サーバーレス VPC アクセス コネクタが関数に必要かどうかを管理します。制約が適用されるよう、この組織のポリシーを設定します。

コンソール

  1. Google Cloud コンソールの [VPC コネクタが必須(Cloud Functions)] ポリシーページに移動します。

    組織のポリシーに移動

  2. [ポリシーを管理] をクリックします。

  3. [ポリシーの編集] ページで、[カスタマイズ] を選択します。

  4. [適用] で [オン] を選択します。

  5. [ポリシーを設定] をクリックします。

gcloud

gcloud resource-manager org-policies enable-enforce コマンドを使用します。

gcloud resource-manager org-policies enable-enforce \
  cloudfunctions.requireVPCConnector \
  --organization ORGANIZATION_ID

ORGANIZATION_ID は組織 ID です。

この組織のポリシーが適用されると、すべての関数でサーバーレス VPC アクセス コネクタの使用が必要になります。コネクタを指定しない関数のデプロイは失敗します。

許可される VPC コネクタの下り(外向き)設定を制限する

cloudfunctions.allowedVpcConnectorEgressSettings 組織のポリシーは、デベロッパーが Cloud Functions で使用できる下り(外向き)設定を管理します。値 ALL_TRAFFIC のみを許可するように、この組織のポリシーを設定します。

コンソール

  1. Google Cloud コンソールの [許可される VPC コネクタの下り(外向き)設定(Cloud Functions)] ポリシーページに移動します。

    組織のポリシーに移動

  2. [ポリシーを管理] をクリックします。

  3. [ポリシーの編集] ページで、[カスタマイズ] を選択します。

  4. [ポリシーの適用] で、[置換] を選択します。

  5. [ポリシーの値] で [カスタム] を選択します。

  6. [ポリシーの種類] で [許可] を選択します。

  7. [カスタム値] で、「ALL_TRAFFIC」を入力します。

  8. [ポリシーを設定] をクリックします。

gcloud

gcloud resource-manager org-policies allow コマンドを使用します。

gcloud resource-manager org-policies allow \
  cloudfunctions.allowedVpcConnectorEgressSettings ALL_TRAFFIC \
  --organization ORGANIZATION_ID

ORGANIZATION_ID は組織 ID です。

この組織のポリシーが適用されると、すべての関数で下り(外向き)設定に値 ALL_TRAFFIC を使用しなければならなくなります。つまり、関数ですべての下り(外向き)トラフィックを VPC ネットワーク経由でルーティングする必要があります。異なる値を指定する関数のデプロイは失敗します。

cloudfunctions.requireVPCConnector 組織のポリシーと組み合わせると、すべての下り(外向き)トラフィックは VPC ネットワークを通過し、そこで設定されているファイアウォールとルーティング ルールが適用されます。

プロジェクト レベルの設定

サービス境界内の個々のプロジェクトでは、VPC Service Controls を使用するために追加の構成を行う必要があります。

VPC ネットワークの構成

データの引き出しのリスクを軽減しつつ、Google API とサービスにアクセスするには、リクエストを制限付きの仮想 IP(VIP)範囲である 199.36.153.4/30restricted.googleapis.com)に送信する必要があります。

プロジェクト内の各 VPC ネットワークで、制限付きの VIP 範囲へのトラフィック以外の送信トラフィックをブロックする手順は次のとおりです。

  1. ファイアウォール ルールの構成を行い、VPC ネットワークの外部へデータが送信されるのを防ぎます。

    • すべての送信トラフィックをブロックする下り(外向き)拒否ルールを作成します。

    • TCP ポート 443 で 199.36.153.4/30 へのトラフィックを許可する、下り(外向き)許可ルールを作成します。先ほど作成した下り(外向き)拒否ルールよりも前にこの優先度が設定されていることを確認します。これにより、制限付き VIP 範囲へのみ下り(外向き)が許可されます。

  2. *.googleapis.comrestricted.googleapis.com に解決されるよう、DNS を構成します。

  3. *.cloudfunctions.net を IP 範囲 199.36.153.4/30 にマッピングする A レコードを DNS で構成します。Cloud DNS でこれを行うことができます。

    gcloud dns managed-zones create ZONE_NAME \
    --visibility=private \
    --networks=https://www.googleapis.com/compute/v1/projects/PROJECT_NAME/global/networks/VPC_NAME \
    --description=none \
    --dns-name=cloudfunctions.net
    
    gcloud dns record-sets transaction start --zone=ZONE_NAME
    
    gcloud dns record-sets transaction add --name=*.cloudfunctions.net. \
    --type=A 199.36.153.4 199.36.153.5 199.36.153.6 199.36.153.7 \
    --zone=ZONE_NAME \
    --ttl=300
    
    gcloud dns record-sets transaction execute --zone=ZONE_NAME
    
  4. VPC コネクタのサブネットで限定公開の Google アクセスを有効にします。

この時点で、VPC ネットワーク内から発信されるリクエストは次のようになります。

  • VPC ネットワークを離れることができないため、サービス境界外への下り(外向き)通信を防ぎます。
  • アクセスできるのは VPC Service Controls をチェックする Google API とサービスのみであるため、Google API を介したデータの引き出しが発生しません。

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

Cloud Functions では、Cloud Build を使用してソースコードを実行可能なコンテナに構築します。VPC Service Controls で Cloud Functions を使用するには、サービス境界にアクセスできるように Cloud Build サービス アカウント(デフォルトまたはカスタム)を構成する必要があります。

サービス アカウント名を見つける

デフォルトの Cloud Build サービス アカウントを使用している場合は、次のように名前を確認できます。

  1. Google Cloud コンソールの [IAM] ページから、Cloud Build サービス アカウントを探します。

    [IAM] を開く

  2. [プロジェクト] プルダウンに正しいプロジェクトが表示されていることを確認します。

  3. cloudbuild.gserviceaccount.com を検索します。PROJECT_NUMBER@cloudbuild.gserviceaccount.com 形式のメールアドレスはサービス アカウント名です。

カスタム Cloud Build サービス アカウントがある場合は、代わりにその名前を使用します。

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

サービス アカウント名が見つかったら、ユーザーまたはサービス アカウントによるアクセスを制限するガイドに沿って、サービス アカウントのアクセスレベルを作成します。既存の境界にアクセスレベルを追加するの手順に沿って、サービス境界にアクセスレベルを追加します。

VPC Service Controls に準拠した関数のデプロイ

VPC Service Controls を Cloud Functions 用に構成した後、サービス境界内にデプロイされたすべての関数が、指定された組織のポリシーに準拠していることを確認する必要があります。つまり、以下のようになります。

  • すべての関数は、サーバーレス VPC アクセス コネクタを使用する必要がある。詳細については、VPC ネットワークへの接続をご覧ください。
  • すべての関数は、内部からのトラフィックのみを許可する必要がある。詳細については、上り(内向き)設定をご覧ください。
  • すべての関数は、すべての送信トラフィックを VPC ネットワーク経由でルーティングする必要がある。詳細については、下り(外向き)設定をご覧ください。

これらの基準を満たさない関数のデプロイは失敗します。

既存の関数が VPC Service Controls に準拠しているか確認する

VPC Service Controls を設定すると、サービス境界内のプロジェクトで作成された新しい関数の準拠状況が自動的に確認されます。ただし、既存のワークロードの中断を避けるため、既存の関数は機能し続けます。その結果、そうした関数は組織のポリシーに準拠していない場合があります。

既存の関数を監査し、必要に応じて関数を更新または再デプロイすることをおすすめします。この処理を容易にするために、Cloud Functions API を使用して関数を一覧表示し、適切なネットワーク設定を指定していない関数をハイライト表示するスクリプトを作成できます。

境界外の関数での VPC Service Controls の使用

上記のセクションは、VPC Service Controls サービス境界内に Cloud Functions の関数をデプロイするシナリオに適用されます。

境界内のリソースにアクセスする必要がある関数をサービス境界の外部にデプロイする必要がある場合は、次の構成が必要です。

  1. Cloud Build サービス アカウントに VPC Service Controls の境界へのアクセスを許可する
  2. 関数のランタイム サービス アカウントに境界へのアクセス権を付与する。これを行うには、アクセスレベルを作成して、アクセスレベルをサービス境界に追加するか、境界に上り(内向き)ポリシーを作成します。
  3. 関数を VPC ネットワークに接続する
  4. 関数からの送信トラフィックをすべて VPC ネットワーク経由でルーティングする。詳細については、下り(外向き)設定をご覧ください。

この構成を完了すると、関数は境界で保護されたリソースにアクセスできるようになります。