VPC Service Controls(VPC SC)の使用

VPC Service Controls は、Google Cloud の機能で、データの引き出しを防ぐためのセキュアな境界を設定できます。デフォルトの run.app URL とカスタム ドメインはどちらも VPC Service Controls の対象となります。このガイドでは、Cloud Run で VPC Service Controls を使用して、サービスのセキュリティを高める方法について説明します。

制限事項とアドバイザリ

  • Artifact Registry または Container Registry の場合:

    • コンテナを保存するレジストリは、デプロイ先のプロジェクトと同じ VPC Service Controls サービス境界に存在する必要があります。
    • ビルドされるコードは、コンテナが push されるレジストリと同じ境界にある必要があります。
  • VPC Service Controls の境界内にあるプロジェクトで継続的デプロイ機能利用できません。

  • Cloud Run サービスが呼び出されると、VPC Service Controls ポリシーの適用でクライアントの IAM 認証情報は使用されません。このようなリクエストには次の制限があります。

    • IAM プリンシパルを使用する VPC Service Controls の上り(内向き)ポリシールールはサポートされません。
    • IAM プリンシパルを使用する VPC Service Controls 境界のアクセスレベルはサポートされません。

VPC Service Controls をサポートするように組織を設定する

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

VPC Service Controls の境界を設定する

次の手順は、VPC Service Controls の境界を設定する方法を示しています。

  1. VPC Service Controls の管理に必要なロールが付与されていることを確認します。

  2. Google Cloud コンソールで、[VPC Service Controls] ページに移動します。

    [VPC Service Controls] ページに移動

  3. プロンプトが表示されたら、組織を選択します。

  4. [アクセス ポリシーを管理] をクリックします。アクセス ポリシーを選択するか、作成します。アクセス ポリシーには、境界に追加するすべてのプロジェクトを含める必要があります。

  5. [新しい境界] をクリックします。境界の名前を入力します。

  6. 境界内で保護するプロジェクトを選択します。

    1. [プロジェクト] をクリックします。

    2. [プロジェクトの追加] ウィンドウで、追加するプロジェクトを選択します。

      共有 VPC を使用している場合は、ホスト プロジェクトとサービス プロジェクトを必ず追加してください。

    3. [プロジェクトを追加] ボタンをクリックします。

  7. 境界内で保護するサービスとして Cloud Run を選択します。

    1. [制限付きサービス] をクリックします。

    2. [サービスを追加] をクリックします。

    3. 「Cloud Run」を検索します。次に、[Cloud Run Admin API] を選択します。

    4. [Add Cloud Run Admin API] をクリックします。

  8. デベロッパーのアクセスを有効にします。

    Cloud Run で VPC Service Controls を有効にすると、サービスの表示やデプロイを含めて、境界外のマシン(会社のノートパソコンなど)からのアクセスがすべて拒否されます。デベロッパーとアプリケーション オペレータが境界内のリソースを表示およびデプロイできるように、境界の上り(内向き)ポリシーを構成する必要があります。

    1. [上り(内向き)ポリシー] をクリックします。

    2. ソースIDプロジェクトサービスを指定します。

    3. [ルールを追加] をクリックします。

    Access Context Manager を使用している組織では、アクセスレベルを設定してデベロッパーのアクセスを有効にすることもできます。

  9. [境界を作成] をクリックします。

これらの手順を完了すると、Cloud Run Admin API のすべての呼び出しが同じ境界内で発生しているか確認されます。

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

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

VPC Service Controls に準拠し、データの引き出しから保護するには、次の組織のポリシーを設定して、サービス境界で Cloud Run に許可される上り(内向き)下り(外向き)の設定を制御します。

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

run.allowedIngress 組織のポリシーでは、デベロッパーが Cloud Run で使用できる上り(内向き)設定を管理します。この組織ポリシーにより、内部リクエストのみを許可する場合は、デベロッパーが値 internal を必ず使用するように設定できます。または、Cloud Load Balancing によって管理されるアクセス制御を使用して外部アプリケーション ロードバランサ経由のリクエストを許可する場合は、internal-and-cloud-load-balancing を必ず使用するように設定できます。

これらの設定の詳細については、Cloud Run の上り(内向き)の制限をご覧ください。

コンソール

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

    組織のポリシーに移動

  2. [編集] をクリックします。

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

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

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

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

  7. [カスタム値] で「internal」を入力します。Cloud Load Balancing トラフィックも許可する場合は、[新しいポリシーの値] をクリックして「internal-and-cloud-load-balancing」を入力します。

  8. [保存] をクリックします。

gcloud

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

gcloud resource-manager org-policies allow \
  run.allowedIngress internal \
  --organization ORGANIZATION_ID

ORGANIZATION_ID は組織 ID です。Cloud Load Balancing トラフィックも許可する場合は、run.allowedIngress internalrun.allowedIngress internal-and-cloud-load-balancing に置き換えます。

この組織のポリシーが適用されると、すべてのサービスで上り(内向き)設定に許可された値を使用する必要があります。つまり、Cloud Run サービスは、サービス境界内の VPC ネットワークからのトラフィックのみを受け入れます。上り(内向き)を別の値に設定しようとすると、組織のポリシーによってブロックされます。

許可される VPC 下り(外向き)設定を制限する

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

コンソール

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

    組織のポリシーに移動

  2. [編集] をクリックします。

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

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

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

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

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

  8. [保存] をクリックします。

gcloud

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

gcloud resource-manager org-policies allow \
  run.allowedVPCEgress all-traffic \
  --organization ORGANIZATION_ID

ORGANIZATION_ID は組織 ID です。

組織のポリシー設定後の動作

組織のポリシーを設定すると、すべての新しいリビジョンでダイレクト VPC 下り(外向き)またはサーバーレス VPC アクセス コネクタを使用し、下り(外向き)設定に値 all-traffic を使用する必要があります。この組み合わせにより、このリビジョンからのすべての下り(外向き)トラフィックは VPC ネットワーク経由でルーティングされます。このトラフィックは、VPC ネットワークのファイアウォール ルールやその他の設定に従います。異なる値を指定する新しいリビジョンのデプロイは、組織のポリシーによってブロックされます。

組織のポリシーとトラフィックの移行

組織のポリシーが設定される前から存在するサービスの場合、トラフィックを処理するすべてのリビジョンがポリシーを遵守するまで、遵守していないリビジョンへのトラフィック移行を継続できます。

この動作により、ポリシーを遵守した新しいリビジョンのテストと段階的なロールアウトを行うことができます。トラフィックを処理するすべてのリビジョンがポリシーを遵守している場合、遵守していないリビジョンにトラフィックを移行しようとすると、組織のポリシーでブロックされます。

VPC Service Controls をサポートするようにプロジェクトを設定する

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

VPC ネットワークを構成する

このセクションでは、通常の googleapis.com 仮想 IP に送信されたリクエストが、Cloud Run サービスが稼働する制限付き仮想 IP(VIP)範囲199.36.153.4/30restricted.googleapis.com)に自動的に転送されるように VPC ネットワークを構成する方法について説明します。コードを変更する必要はありません。

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

  1. VPC ネットワーク リソースをホストするサブネットで限定公開の Google アクセスを有効にします。

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

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

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

  3. Cloud DNS のレスポンス ポリシーを作成します。

    gcloud dns response-policies create RESPONSE_POLICY \
    --networks=NETWORK \
    --description=DESCRIPTION
    

    次のように置き換えます。

    • RESPONSE_POLICY: レスポンス ポリシーの名前。
    • NETWORK: このポリシーに関連付けるネットワークの名前。複数のネットワークを指定するには、各ネットワークの名前をカンマで区切ります。例: network1,network2
    • DESCRIPTION: レスポンス ポリシーの説明(例: Cloud Run VPC Service Controls response policy
  4. レスポンス ポリシーにルールを追加して、*.googleapis.comrestricted.googleapis.com に解決します。restricted.googleapis.com の IP アドレス範囲は 199.36.153.4/30 です。

    gcloud dns response-policies rules create RESPONSE_POLICY_RULE \
    --response-policy=RESPONSE_POLICY \
    --dns-name="*.googleapis.com." \
    --local-data=name="restricted.googleapis.com.",type="A",ttl=300,rrdatas="199.36.153.4|199.36.153.5|199.36.153.6|199.36.153.7"
    

    次のように置き換えます。

    • RESPONSE_POLICY_RULE: レスポンス ポリシー ルールの名前。
    • RESPONSE_POLICY: 前の手順で作成したレスポンス ポリシーの名前を引用符で囲みます。
  5. レスポンス ポリシーにルールを追加して、*.run.apprestricted.googleapis.com に解決します。restricted.googleapis.com の IP アドレス範囲は 199.36.153.4/30 です。

    gcloud dns response-policies rules create RESPONSE_POLICY_RULE \
    --response-policy=RESPONSE_POLICY \
    --dns-name="*.run.app." \
    --local-data=name="restricted.googleapis.com.",type="A",ttl=300,rrdatas="199.36.153.4|199.36.153.5|199.36.153.6|199.36.153.7"
    

    次のように置き換えます。

    • RESPONSE_POLICY_RULE: レスポンス ポリシー ルールの名前。
    • RESPONSE_POLICY: 前の手順で指定したレスポンス ポリシーの名前を引用符で囲みます。

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

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

VPC Service Controls 準拠の Cloud Run サービスとジョブをデプロイする

VPC Service Controls を Cloud Run 用に構成した後、サービス境界内にデプロイされたすべての Cloud Run サービスとジョブで VPC Service Controls が有効になっていることを確認します。そのためには、次の条件を満たしている必要があります。

  • Cloud Run のサービスとジョブは、ダイレクト VPC 下り(外向き)またはサーバーレス VPC アクセス コネクタを使用する必要があります。詳細については、VPC ネットワークへの接続をご覧ください。
  • Cloud Run サービスとジョブは、すべての送信トラフィックを VPC ネットワーク経由で転送する必要があります。詳細については、下り(外向き)設定をご覧ください。
  • Cloud Run サービスは、内部ソースからのトラフィックのみを許可する必要があります。詳細については、上り(内向き)設定をご覧ください。上り(内向き)を「all」に設定すると、VPC Service Controls の適用が無効になります。

既存のサービスが VPC Service Controls に準拠しているか確認する

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

Google では、サービスを定期的に監査して、上り(内向き)と下り(外向き)の設定が要件を満たしていることを確認し、必要に応じてサービスを更新または再デプロイすることをおすすめしています。たとえば、Cloud Run Admin API を使用してサービスを一覧表示し、適切な掲載ネットワークの設定を指定しないサービスを強調するスクリプトを作成できます。