内部 IP アドレスからの保護されたリソースへのアクセスを許可する

このページでは、上り(内向き)ルールと下り(外向き)ルールを使用して、VPC ネットワークの内部 IP アドレスからサービス境界へのトラフィックを許可する方法について説明します。

概要

VPC Service Controls を使用して、VPC ネットワークの特定の IP アドレス範囲が保護されたプロジェクトや VPC ネットワークへのアクセスを許可する条件を指定できます。この機能を使用すると、以下のタスクを実行できます。

  • VPC ネットワークの内部 IP アドレス範囲を許可するベーシック アクセスレベル条件をサポートします。

  • これらのアクセスレベル条件をサービス境界の上り(内向き)または下り(外向き)の API 呼び出しに使用できます。

この機能には、次の利点があります。

  • VPC Service Controls の構成で条件を指定して、VPC ネットワークの内部 IP アドレスからのアクセスを許可することができます。

  • API 呼び出しが複数のサービス境界を通過する必要があるワークフローでは、VPC ネットワーク全体やプロジェクト全体ではなく、少数のサブネットのみを許可するようにアクセスを制限できます。

  • 特定の Google Cloud リソースにのみアクセスできるように、オンプレミスとは異なるリソースを構成できます。アクセスレベルの一部として、これらのオンプレミス リソースとランディング ゾーン VPC ネットワークに関連付けられたサブネットの IP アドレス範囲を使用する必要があります。

図 1 は、承認済みの内部 IP アドレスから特定の保護されたサービスへのアクセスを許可する設定例を示しています。

内部 IP アドレスの使用に関する制限事項

VPC Service Controls で内部 IP アドレスを使用する場合、次の制限が適用されます。

  • 内部 IP アドレスは、ベーシック アクセスレベルでのみ有効にできます。カスタム アクセスレベルでは有効にできません。

  • 内部 IP アドレスベースの条件でアクセスレベルを無効にしないことをおすすめします。予期しない動作を引き起こす可能性があるためです。

  • サービス境界に VPC ネットワークを追加する際の制限も適用されます。

  • VPC Service Controls がポリシー拒否監査ログを記録すると、VPC ネットワークの名前が監査ログの __UNKNOWN__ として削除されます。

  • SUBNET_MODEcustom に設定されているがサブネットがない VPC ネットワークはサポートされません。内部 IP アドレスを有効にするには、VPC ネットワークに少なくとも 1 つのサブネットが含まれている必要があります。

  • アクセス ポリシー内のすべてのアクセスレベルで指定できる上限は 500 VPC ネットワークのみです。

  • アクセスレベルまたはサービス境界によって参照される VPC ネットワークを削除し、同じ名前で別の VPC ネットワークを再作成しても、VPC Service Controls では、再作成された VPC ネットワーク上で内部 IP アドレスが自動的に有効にされません。この制限を回避するには、別の名前の VPC ネットワークを作成して境界に追加します。

  • 内部 IP アドレスを使用して Google マネージド サービスからのアクセスを許可することはできません。たとえば、Cloud SQL です。

  • 下り(外向き)ルールで内部 IP アドレスベースの条件を持つアクセスレベルを使用する場合は、デバイスタイプやユーザー ID などの他の条件をアクセスレベルに追加しないことをおすすめします。

  • 内部 IP アドレスが、地理的リージョンを参照するアクセスレベルと一致しません。

アクセスレベルで内部 IP アドレスを使用する

  1. ベーシック アクセスレベル条件vpcNetworkSources フィールドに、VPC ネットワーク名と IP アドレス範囲を指定します。

    • VPC ネットワークの名前VPC ネットワーク名は、次の形式で定義する必要があります。

      //compute.googleapis.com/projects/PROJECT_ID/global/networks/NETWORK_NAME
      

      例: //compute.googleapis.com/projects/my-project/global/networks/my-vpc

    • IP アドレス範囲。VpcNetworkSourceVpcSubNetwork フィールドで指定された IP アドレス範囲は、CIDR ブロック IP サブネットワーク仕様に従う必要があります。サブネットには有効な IPv4 範囲である任意の IP アドレス範囲を使用できます。

  2. IngressSource または EgressSource の許可条件とともにこのアクセスレベルを使用します。

以降のセクションでは、サンプル シナリオを使用して、これらの手順を実行して内部 IP アドレスを有効にする方法について説明します。

内部 IP アドレスを使用してサブネット アクセスを設定する例

次の例では、2 つのプロジェクトがあります。

  1. ネットワーク ホスト プロジェクト: Project1 は VPC ネットワーク default をホストします。Project1VM1VM2 内の 2 つの VM は、このネットワークをネットワーク インターフェースとして使用し、トラフィックを送信します。

  2. Cloud Storage プロジェクト: Project2 には Cloud Storage バケットが含まれています。

VPC Service Controls を使用すると、内部 IP アドレスを使用して、Project2 内の Cloud Storage バケットにアクセスするために、Project1 からの VM1 のみを許可できます。この設定を実現するには、次の手順を実行します。

  1. Project1 の周囲にサービス境界 sp1 を作成し、Project2 の周囲に別のサービス境界 sp2 を作成します。

  2. 次に、サービス境界に上り(内向き)ルールと下り(外向き)ルールを追加して、Cloud Storage バケットへの VM1 のサブネット アクセスのみを許可できます。

次の図は、この例で説明する設定を示しています。

組織レベルでアクセス ポリシーを構成する

  1. 組織レベルのアクセス ポリシーがあることを確認します。このレベルにアクセス ポリシーがない場合は、次の gcloud CLI コマンドを実行します。

    gcloud access-context-manager policies create \
        --organization=ORGANIZATION_ID --title=POLICY_TITLE
    

    以下のように置き換えます。

    • ORGANIZATION_ID: 組織の数値 ID。

    • POLICY_TITLE: 人が読める形式のアクセス ポリシーのタイトル。

    詳細については、組織レベルのアクセス ポリシーを作成するをご覧ください。

  2. アクセス ポリシーの名前を取得します

  3. このポリシーをデフォルト アクセス ポリシーとして設定するには、次の gcloud CLI コマンドを実行します。

    gcloud config set access_context_manager/policy POLICY_NAME
    

    POLICY_NAME は、アクセス ポリシーの数値名に置き換えます。

    詳細については、gcloud コマンドライン ツールのデフォルトのアクセス ポリシーを設定するをご覧ください。

ネットワーク ホスト プロジェクトと Cloud Storage プロジェクトを保護する境界を作成する

  1. Project1 の周囲に境界 sp1 を作成するには、次の gcloud CLI コマンドを実行します。

    gcloud access-context-manager perimeters create sp1 --title="sp1" --resources=PROJECT_NUMBER \
        --restricted-services=storage.googleapis.com --policy=POLICY_NAME
    

    以下のように置き換えます。

    • PROJECT_NUMBER: ネットワーク ホスト プロジェクトのプロジェクト番号。 たとえば、projects/111 です。

    • POLICY_NAME は、アクセス ポリシーの数値名です。(例: 1234567890)です。

  2. Cloud Storage サービスを制限する Project2 の周囲に境界 sp2 を作成するには、次の gcloud CLI コマンドを実行します。

    gcloud access-context-manager perimeters create sp2 --title="sp2" --resources=PROJECT_NUMBER \
        --restricted-services=storage.googleapis.com --policy=POLICY_NAME
    

    以下のように置き換えます。

    • PROJECT_NUMBER: Cloud Storage プロジェクトのプロジェクト番号。たとえば、projects/222 です。

    • POLICY_NAME は、アクセス ポリシーの数値名です。(例: 1234567890)です。

サービス境界の作成方法については、サービス境界を作成するをご覧ください。

この 2 つの境界を作成すると、2 つの VM から Cloud Storage バケットにアクセスできなくなります。

内部 IP アドレスに基づいたアクセス条件でアクセスレベルを作成する

VM1 のサブネットからのトラフィックのみを許可するアクセスレベルを作成します。

  1. アクセス条件を定義する YAML ファイルを作成します。次のサンプルは、内部 IP アドレスを有効にするために必要な属性のみを示しています。

    echo """
    - vpcNetworkSources:
      - vpcSubnetwork:
          network: VPC_NETWORK_NAME
          vpcIpSubnetworks:
          - IP_RANGE
    
    """ > level.yaml
    

    以下のように置き換えます。

    • VPC_NETWORK_NAME: VM1 が存在する VPC ネットワークの名前。例: //compute.googleapis.com/projects/Project1/global/networks/default

    • IP_RANGE: サブネットの IP アドレス範囲。例: 10.10.0.0/24

    前述の VPC ネットワーク名と IP アドレス範囲の形式を使用します。

    YAML ファイルの詳細については、basic-level-spec YAML ファイルをご覧ください。

  2. YAML ファイルを使用してアクセスレベルを作成するには、次の gcloud CLI コマンドを実行します。

    gcloud access-context-manager levels create LEVEL_NAME \
        --title="TITLE" --basic-level-spec=FILE_NAME
    

    以下のように置き換えます。

    • LEVEL_NAME: アクセスレベルの一意の名前。 例: allowvm1

    • TITLE: アクセスレベルの短い、人が読める形式のタイトル。 たとえば、allowvm1 です。

    • FILE_NAME: アクセスレベルのアクセス条件を定義する YAML ファイル。たとえば、level.yaml です。

    詳細については、ベーシック アクセスレベルの作成をご覧ください。

Cloud Storage バケットへの受信 API トラフィックを許可するように上り(内向き)ポリシーを構成する

VM1 からのアクセスのみを許可するには、sp2 境界に上り(内向き)ポリシーを構成して、Cloud Storage API トラフィックが境界に入ることを許可します。

  1. 上り(内向き)ポリシーを定義する YAML ファイルを作成します。

    echo """
    - ingressFrom:
        identityType: ANY_IDENTITY
        sources:
        - accessLevel: accessPolicies/POLICY_NAME/accessLevels/ACCESS_LEVEL_NAME
      ingressTo:
        operations:
        - methodSelectors:
          - method: '*'
          serviceName: storage.googleapis.com
        resources:
        - '*'
    
    """ > ingress.yaml
    

    以下のように置き換えます。

    • POLICY_NAME は、アクセス ポリシーの数値名です。例: 1234567890

    • ACCESS_LEVEL_NAME: アクセスレベルの名前。(例: allowvm1)です。

    YAML ファイルの詳細については、上り(内向き)ルールのリファレンスをご覧ください。

  2. サービス境界の上り(内向き)ポリシーを更新するには、次の gcloud CLI コマンドを実行します。

    gcloud access-context-manager perimeters update PERIMETER --set-ingress-policies=FILE_NAME
    

    以下のように置き換えます。

    • PERIMETER: Cloud Storage プロジェクトを保護するサービス境界の名前。たとえば、sp2 です。

    • FILE_NAME: 上り(内向き)ポリシーを定義する YAML ファイル。(例: ingress.yaml)です。

    詳細については、サービス境界の上り(内向き)ポリシーと下り(外向き)ポリシーの更新をご覧ください。

Cloud Storage バケットへの送信 API トラフィックを許可するように、下り(外向き)ポリシーを構成する

また、sp1 境界に下り(外向き)ポリシーを構成して、Cloud Storage API トラフィックが境界から出ることを許可します。

  1. 下り(外向き)ポリシーを定義する YAML ファイルを作成します。YAML ファイルで sourceRestriction フィールドを SOURCE_RESTRICTION_ENABLED として設定します。

    echo """
    - egressFrom:
        identityType: ANY_IDENTITY
        sourceRestriction: SOURCE_RESTRICTION_ENABLED
        sources:
        - accessLevel: accessPolicies/POLICY_NAME/accessLevels/ACCESS_LEVEL_NAME
      egressTo:
        operations:
        - methodSelectors:
          - method: '*'
          serviceName: storage.googleapis.com
        resources:
        - '*'
    
    """ > egress.yaml
    

    以下のように置き換えます。

    • POLICY_NAME は、アクセス ポリシーの数値名です。例: 1234567890

    • ACCESS_LEVEL_NAME: アクセスレベルの名前。(例: allowvm1)です。

    YAML ファイルの詳細については、下り(外向き)ルールのリファレンスをご覧ください。

  2. サービス境界の下り(外向き)ポリシーを更新するには、次のコマンドを実行します。

    gcloud access-context-manager perimeters update PERIMETER --set-egress-policies=FILE_NAME
    

    以下のように置き換えます。

    • PERIMETER: ネットワーク ホスト プロジェクトを保護するサービス境界の名前。たとえば、sp1 です。

    • FILE_NAME: 下り(外向き)ポリシーを定義する YAML ファイル。(例: egress.yaml)です。

    詳細については、サービス境界の上り(内向き)ポリシーと下り(外向き)ポリシーの更新をご覧ください。

上り(内向き)ポリシーと下り(外向き)ポリシーを構成すると、Cloud Storage バケットには VM1 からアクセスできるようになりますが、Cloud Storage バケットには VM2 からアクセスできなくなります。

推奨事項

  • 内部 IP アドレスを有効にする場合は、VM の IP 転送を無効にすることをおすすめします。IP 転送では、同じ VPC ネットワーク内の VM が別の IP アドレスを使用してリクエストを送信できるため、IP アドレスのなりすましのリスクが発生します。

  • IP 転送を有効にする場合は、次の構成を使用して IP アドレスのなりすましのリスクを軽減することをおすすめします。

    • Restrict VM IP Forwarding 組織のポリシーの制約constraints/compute.vmCanIpForward)を使用して、承認された VM のみが IP 転送を有効にできるようにします。

    • ファイアウォール ルールの送信元を使用して、IP 転送が有効になっている VM と通信できる IP アドレスを制限します。次の作業を行います。

      • 特定の IP アドレス範囲から IP 転送が有効になっている VM への受信トラフィックのみを許可するように、上り(内向き)ファイアウォール ルールを設定します。

      • IP 転送が有効になっている VM から特定の IP アドレス範囲への送信トラフィックのみを許可するように、下り(外向き)ファイアウォール ルールを設定します。