Virtual Private Cloud ネットワークに VPC Service Controls の境界を設定する

VPC Service Controls を使用してサービス境界を設定する方法を説明します。このチュートリアルでは、VPC Service Controls の境界を効果的に使用するために必要なファイアウォール、Private Service Connect、DNS 構成などのネットワーク設定を使用します。このチュートリアルでは、サービスを許可または拒否する方法と、特定のサービスの許可リストに対して詳細な例外を作成する方法について説明します。

目標

  • VPC Service Controls の境界にネットワーク コントロールを追加し、データの引き出し経路を回避する。
  • 境界内または境界外からのリクエストに対して、境界内のサービスへのアクセスを許可または拒否する。
  • 境界内から発信されるリクエストに対して、境界外のサービスへのアクセスを許可または拒否する。
  • 組織のポリシー「リソース サービスの使用を制限する」と VPC Service Controls を使用する。

費用

このチュートリアルでは、課金対象である次の Google Cloud コンポーネントを使用します。

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。

このチュートリアルを終了した後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。

始める前に

  1. このチュートリアルでは、組織にプロジェクトが必要です。Google Cloud 組織がない場合は、組織の作成と管理をご覧ください。

  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  3. Google Cloud プロジェクトで課金が有効になっていることを確認します

  4. Compute Engine、Access Context Manager、Cloud DNS API を有効にします。

    API を有効にする

  5. Google Cloud コンソールで、「Cloud Shell をアクティブにする」をクリックします。

    Cloud Shell をアクティブにする

  6. 組織に次のロールがあることを確認します。 Access Context Manager Admin, Organization Policy Administrator

    ロールを確認する

    1. Google Cloud コンソールの [IAM] ページに移動します。

      [IAM] に移動
    2. 組織を選択します。
    3. [プリンシパル] 列で、自分のメールアドレスを含む行を見つけます。

      自分のメールアドレスがその列にない場合、ロールは割り当てられていません。

    4. 自分のメールアドレスを含む行の [ロール] 列で、ロールのリストに必要なロールが含まれているかどうかを確認します。

    ロールを付与する

    1. Google Cloud コンソールの [IAM] ページに移動します。

      [IAM] に移動
    2. 組織を選択します。
    3. [ アクセスを許可] をクリックします。
    4. [新しいプリンシパル] フィールドに、自分のメールアドレスを入力します。
    5. [ロールを選択] リストでロールを選択します。
    6. 追加のロールを付与するには、 [別のロールを追加] をクリックして各ロールを追加します。
    7. [保存] をクリックします。
  7. プロジェクトに次のロールがあることを確認します。 Compute Admin, DNS Administrator, IAP-Secured Tunnel User, Service Account User, Service Directory Editor

    ロールを確認する

    1. Google Cloud コンソールの [IAM] ページに移動します。

      [IAM] に移動
    2. プロジェクトを選択します。
    3. [プリンシパル] 列で、自分のメールアドレスを含む行を見つけます。

      自分のメールアドレスがその列にない場合、ロールは割り当てられていません。

    4. 自分のメールアドレスを含む行の [ロール] 列で、ロールのリストに必要なロールが含まれているかどうかを確認します。

    ロールを付与する

    1. Google Cloud コンソールの [IAM] ページに移動します。

      [IAM] に移動
    2. プロジェクトを選択します。
    3. [ アクセスを許可] をクリックします。
    4. [新しいプリンシパル] フィールドに、自分のメールアドレスを入力します。
    5. [ロールを選択] リストでロールを選択します。
    6. 追加のロールを付与するには、 [別のロールを追加] をクリックして各ロールを追加します。
    7. [保存] をクリックします。

VPC Service Controls の境界を設定する

VPC ネットワークに VPC Service Controls の境界を実装するには、外部サービスへのトラフィックを拒否するネットワーク制御を実装する必要があります。以降のセクションでは、境界内の VPC ネットワークに実装する必要があるネットワーク構成と、その構成例について説明します。

VPC ネットワークを準備する

このセクションでは、インターネットへの下り(外向き)ネットワーク パスを軽減するために、VPC ネットワークに Google API とサービスに対するプライベート接続を設定します。

  1. Cloud Shell で、変数を設定します。

    gcloud config set project PROJECT_ID
    gcloud config set compute/region REGION
    gcloud config set compute/zone ZONE
    

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

    • PROJECT_ID: リソースを作成するプロジェクトのプロジェクト ID
    • REGION: ロケーションに近いリージョン(例: us-central1
    • ZONE: ロケーションに近いゾーン(例: us-central1-a
  2. 限定公開の Google アクセスが有効な VPC ネットワークとサブネットを作成します。

    gcloud compute networks create restricted-vpc --subnet-mode=custom
    gcloud compute networks subnets create restricted-subnet \
    --range=10.0.0.0/24 \
    --network=restricted-vpc \
    --enable-private-ip-google-access
    
  3. Private Service Connect エンドポイントと、vpc-sc バンドルを使用するように構成された転送ルールを作成します。

    gcloud compute addresses create restricted-psc-endpoint \
    --global \
    --purpose=PRIVATE_SERVICE_CONNECT \
    --addresses=10.0.1.1 \
    --network=restricted-vpc
    
    gcloud compute forwarding-rules create restrictedpsc \
    --global \
    --network=restricted-vpc \
    --address=restricted-psc-endpoint \
    --target-google-apis-bundle=vpc-sc
    
  4. Google Cloud APIs のクエリを Private Service Connect エンドポイントにリダイレクトするように Cloud DNS サーバー ポリシーを構成します。

    gcloud dns managed-zones create restricted-dns-zone \
      --description="Private DNS Zone to map Google API queries to the Private Service Connect endpoint for Google APIs" \
      --dns-name="googleapis.com." \
      --networks=restricted-vpc \
      --visibility=private
    
    gcloud dns record-sets create googleapis.com  \
    --rrdatas=10.0.1.1 \
    --type=A \
    --ttl=300 \
    --zone=restricted-dns-zone
    
    gcloud dns record-sets create *.googleapis.com  \
    --rrdatas="googleapis.com." \
    --type=CNAME \
    --ttl=300 \
    --zone=restricted-dns-zone
    
  5. すべての下り(外向き)トラフィックを拒否するように、優先度の低いファイアウォール ルールを構成します。

    gcloud compute firewall-rules create deny-all-egress \
    --priority=65534 \
    --direction=egress \
    --network=restricted-vpc \
    --action=DENY \
    --rules=all \
    --destination-ranges=0.0.0.0/0
    
  6. トラフィックが Private Service Connect エンドポイントの IP アドレスに到達できるように、優先度の高いファイアウォール ルールを構成します。

    gcloud compute firewall-rules create allow-psc-for-google-apis \
    --priority=1000 \
    --direction=egress \
    --network=restricted-vpc \
    --action=ALLOW \
    --rules=tcp:443 \
    --destination-ranges=10.0.1.1
    

    これらのファイアウォール ルールでは、Private Service Connect エンドポイントへの下り(外向き)を選択的に許可する前に、広範囲で下り(外向き)が拒否されます。この構成では、デフォルト ドメインに対して下り(外向き)トラフィックが拒否されます。これらのドメインは通常、限定公開の Google アクセスと暗黙的なファイアウォール ルールで到達可能です。

VPC Service Controls の境界を作成する

このセクションでは、VPC Service Controls の境界を作成します。

  1. Cloud Shell で、VPC Service Controls の境界を作成するための前提条件としてアクセス ポリシーを作成します。

    gcloud access-context-manager policies create \
    --organization=ORGANIZATION_ID --title "Access policy at organization node"
    

    出力は次のようになります。

    "Create request issued
    Waiting for operation [operations/accessPolicies/123456789/create/123456789] to complete...done."
    

    組織ノードに配置可能なアクセス ポリシー コンテナは 1 つだけです。組織でポリシーがすでに作成されている場合、出力は次のようになります。

    "ALREADY_EXISTS: Policy already exists with parent ContainerKey{containerId=organizations/123456789012, numericId=123456789012}"
    

    このメッセージが表示された場合は、次の手順に進みます。

  2. Cloud Storage サービスと Compute Engine サービスを制限する VPC Service Controls の境界を作成します。

    export POLICY_ID=$(gcloud access-context-manager policies list \
    --organization=ORGANIZATION_ID \
    --format="value(name)")
    
    gcloud access-context-manager perimeters create demo_perimeter \
    --title="demo_perimeter" \
    --resources=projects/$(gcloud projects describe PROJECT_ID --format="value(projectNumber)") \
    --restricted-services="storage.googleapis.com,compute.googleapis.com" \
    --enable-vpc-accessible-services \
    --policy=$POLICY_ID \
    --vpc-allowed-services="RESTRICTED-SERVICES"
    

境界外のトラフィックから許可されるサービスを確認する

以降のセクションでは、VPC Service Controls の境界で境界外からのリクエストを許可または拒否する方法について説明します。また、アクセスレベルと上り(内向き)ポリシーを構成して、サービスへの上り(内向き)を選択的に許可する方法についても説明します。

境界外からのトラフィックをシミュレートするには、Cloud Shell でコマンドを実行します。Cloud Shell は、ユーザーが所有する自身のプロジェクトと境界の外部にあるリソースです。境界では、リクエストに必要な Identity and Access Management が権限あっても、リクエストを許可または拒否できます。

このチュートリアルでは、Compute Engine API、Cloud Storage API、Cloud Resource Manager API を使用しますが、他のサービスにも同じコンセプトが適用されます。

制限付きサービスへの外部トラフィックが境界で拒否されることを確認する

このセクションでは、制限付きサービスへの外部トラフィックが境界で拒否されることを確認します。

VPC Service Controls の境界で制限付きサービスへのアクセスが拒否される仕組みを示すアーキテクチャ図

上の図は、承認済みのクライアントから境界内で制限付きとして構成したサービスへのアクセスが拒否され、制限付きとして構成していないサービスへのアクセスが許可される仕組みを表しています。

以降の手順では、Cloud Shell を使用してこのコンセプトを確認してみます。VPC ネットワーク内に VM を作成しようとすると、VPC Service Controls の境界の構成が原因で失敗します。

  1. Cloud Shell で次のコマンドを実行して、VPC ネットワーク内に VM を作成します。

    gcloud compute instances create demo-vm \
        --machine-type=e2-micro \
        --subnet=restricted-subnet \
        --scopes=https://www.googleapis.com/auth/cloud-platform \
        --no-address
    

    出力は次のようになります。

    "ERROR: (gcloud.compute.instances.create) Could not fetch resource:
    - Request is prohibited by organization's policy."
    

    Cloud Shell が境界外にあり、Compute Engine が --restricted-services フラグで構成されているため、リクエストが失敗します。

  2. Cloud Shell で次のコマンドを実行して、--restricted-services フラグが構成されていない Resource Manager サービスにアクセスします。

    gcloud projects describe PROJECT_ID
    

    成功すると、プロジェクトの詳細が返されます。このレスポンスは、境界が Cloud Resource Manager API への外部トラフィックを許可することを示しています。

    --restricted-services で構成されたサービスへの外部トラフィックが境界で拒否され、--restricted-services で明示的に構成されていないサービスへの外部トラフィックが許可されることが確認できました。

以降のセクションでは、境界内の制限付きサービスに到達するための例外パターンについて説明します。

アクセスレベルで境界の例外が許可されていることを確認する

このセクションでは、アクセスレベルによって境界の例外が許可されていることを確認します。アクセスレベルは、外部トラフィックに境界内のすべての制限付きサービスへのアクセスを許可し、サービスや他の属性ごとにきめ細かい例外を設定する必要がない場合に役立ちます。

アクセスレベルにより VPC Service Controls 境界内のすべてのサービスに例外が適用される仕組みを示すアーキテクチャ図

上の図は、アクセスレベルにより、承認済みのクライアントに境界内のすべての制限付きサービスへのアクセスを許可する仕組みを表しています。

次の手順では、このコンセプトを確認するため、アクセスレベルを作成して Compute Engine サービスにリクエストを送信してみます。制限付きの Compute Engine を構成している場合でも、このリクエストは許可されます。

  1. Cloud Shell から、アクセスレベルの構成を記述する YAML ファイルを作成し、境界に適用します。このサンプルでは、現在チュートリアルの実行に使用しているユーザー ID のアクセスレベルを作成します。

    export USERNAME=$(gcloud config list account --format "value(core.account)")
    
    cat <<EOF > user_spec.yaml
    - members:
      - user:$USERNAME
    EOF
    
    gcloud access-context-manager levels create single_user_level \
    --title="single-user access level" \
    --basic-level-spec=user_spec.yaml \
    --policy=$POLICY_ID
    
    gcloud access-context-manager perimeters update demo_perimeter \
    --add-access-levels=single_user_level \
    --policy=$POLICY_ID
    
  2. Cloud Shell で次のコマンドを再度実行し、VM の作成を試みます。

    gcloud compute instances create demo-vm \
    --machine-type=e2-micro \
    --subnet=restricted-subnet \
    --scopes=https://www.googleapis.com/auth/cloud-platform \
    --no-address
    

    今回はリクエストが正常に処理されます。外部トラフィックは制限付きのサービスを使用できませんが、構成したアクセスレベルでは例外が許可されます。

上り(内向き)ポリシーにより境界できめ細かな例外が許可されていることを確認する

このセクションでは、上り(内向き)ポリシーにより、境界にきめ細かい例外を適用できることを確認します。大まかなアクセスレベルとは異なり、きめ細かい上り(内向き)ポリシーは、トラフィック ソースに関する追加の属性を構成し、個々のサービスまたはメソッドへのアクセスを許可できます。

上り(内向き)ポリシーにより、境界内の特定のサービスに対してきめ細かい例外を許可する仕組みを表すアーキテクチャ図

上の図は、上り(内向き)ポリシーにより、承認済みクライアントに境界内の指定されたサービスへのアクセスのみを許可し、他の制限付きサービスへのアクセスを許可しない仕組みを表しています。

次の手順では、このコンセプトを確認するため、アクセスレベルを上り(内向き)ポリシーに置き換えて、承認済みクライアントに Compute Engine サービスへのアクセスのみを許可し、他の制限付きサービスへのアクセスを許可しないようにします。

  1. [Cloud Shell] タブで次のコマンドを実行して、アクセスレベルを削除します。

    gcloud access-context-manager perimeters update demo_perimeter \
    --policy=$POLICY_ID \
    --clear-access-levels
    
  2. [Cloud Shell] タブで、ユーザー ID の Compute Engine サービスへの上り(内向き)のみを許可する上り(内向き)ポリシーを作成し、そのポリシーを境界に適用します。

    cat <<EOF > ingress_spec.yaml
    - ingressFrom:
        identities:
        - user:$USERNAME
        sources:
        - accessLevel: '*'
      ingressTo:
        operations:
        - methodSelectors:
          - method: '*'
          serviceName: compute.googleapis.com
        resources:
        - '*'
    EOF
    
    gcloud access-context-manager perimeters update demo_perimeter \
    --set-ingress-policies=ingress_spec.yaml \
    --policy=$POLICY_ID
    
  3. [Cloud Shell] タブで次のコマンドを実行して、境界内に Cloud Storage バケットを作成します。

    gcloud storage buckets create gs://PROJECT_ID-01
    

    出力は次のようになります。

    "ERROR: (gcloud.storage.buckets.create) HTTPError 403: Request is prohibited by organization's policy."
    

    Cloud Shell は境界外のクライアントであるため、VPC Service Controls の境界は、Cloud Shell が境界内の制限付きサービスと通信できないようにします。

  4. [Cloud Shell] タブで次のコマンドを実行して、境界内の Compute Engine サービスにリクエストを送信します。

    gcloud compute instances describe demo-vm --zone=ZONE
    

    成功すると、demo-vm の詳細が返されます。このレスポンスは、Compute Engine サービスへの上り(内向き)ポリシーの条件を満たす外部トラフィックが境界で許可されていることを示しています。

境界内のトラフィックから許可されるサービスを確認する

以降のセクションでは、VPC Service Controls の境界で境界内からのサービスへのリクエストを許可または拒否する方法について説明します。また、下り(外向き)ポリシーで外部サービスへの下り(外向き)を選択的に許可する方法についても説明します。

境界の内側と外側にあるトラフィックの違いを説明するために、以降のセクションでは、境界外の Cloud Shell と境界内に作成した Compute Engine インスタンスを使用しています。境界内の Compute Engine インスタンスの SSH セッションから実行されるコマンドは、関連付けられたサービス アカウントの ID を使用しますが、境界外の Cloud Shell から実行されるコマンドは独自の ID を使用します。チュートリアルの推奨設定では、リクエストの実行に十分な IAM 権限が付与されていても、境界でリクエストを許可または拒否できます。

このチュートリアルでは、Compute Engine API、Cloud Storage API、Cloud Resource Manager API を使用しますが、他のサービスにも同じコンセプトが適用されます。

境界内の制限付きサービスへの内部トラフィックが境界で許可されていることを確認する

このセクションでは、サービスが VPC のアクセス可能なサービスで構成されている場合に、境界内のネットワーク エンドポイントからのトラフィックが許可されることを確認します。

VPC のアクセス可能なサービスの構成により、内部ネットワーク エンドポイントからサービスにアクセスできることを示すアーキテクチャ図

上の図は、境界内のネットワーク エンドポイントからのトラフィックが、VPC のアクセス可能なサービスとして構成されている制限付きサービスに到達できる仕組みを示しています。VPC のアクセス可能なサービスとして構成されていないサービスは、境界内のネットワーク エンドポイントからアクセスできません。

次の手順では、このコンセプトを確認するために、境界内の Compute Engine インスタンスへの SSH 接続を確立してサービスにリクエストを送信します。

  1. Cloud Shell で、TCP 転送用の IAP サービスで使用されている IP アドレス 35.235.240.0/20 からの上り(内向き)を許可することで、VPC ネットワークへの SSH トラフィックを許可するファイアウォール ルールを作成します。

    gcloud compute firewall-rules create demo-allow-ssh \
    --direction=INGRESS \
    --priority=1000 \
    --network=restricted-vpc \
    --action=ALLOW \
    --rules=tcp:22 \
    --source-ranges=35.235.240.0/20
    
  2. このインスタンスへの SSH セッションを開始します。

    gcloud compute ssh demo-vm --zone=ZONE
    

    コマンドライン プロンプトがインスタンスのホスト名に変わっていることを確認します。変わっていれば、demo-vm インスタンスに正常に接続しています。

    username@demo-vm:~$
    

    上記のコマンドが失敗した場合、次のようなエラー メッセージが表示されることがあります。

    "[/usr/bin/ssh] exited with return code [255]"
    

    この場合、Compute Engine インスタンスの起動が完了していない可能性があります。1 分ほど待ってからもう一度試してください。

  3. 境界内の SSH セッションから、VPC でアクセス可能なサービスの許可リストにある Google Cloud サービスを使用して、境界で内部的に許可されるサービスを確認します。たとえば、Compute Engine サービスを使用して任意のコマンドを試します。

    gcloud compute instances describe demo-vm --zone=ZONE
    

    成功すると、demo-vm の詳細が返されます。このレスポンスは、境界で Compute Engine API への内部トラフィックが許可されていることを示しています。

  4. 境界内の SSH セッションから、VPC でアクセス可能なサービスの許可リストにないサービスが VM から許可されていないことを確認します。たとえば、次のコマンドでは、VPC でアクセス可能なサービスの許可リストでない Resource Manager サービスを使用しています。

    gcloud projects describe PROJECT_ID
    

    出力は次のようになります。

    "ERROR: (gcloud.projects.list) PERMISSION_DENIED: Request is prohibited by organization's policy."
    

    Compute Engine インスタンスとその他のネットワーク エンドポイントは、VPC でアクセス可能なサービスの許可リストにあるサービスのみをリクエストできます。ただし、境界の外部から発生するサーバーレス リソースやサービスのトラフィックが、このようなサービスをリクエストする場合があります。プロジェクトでサービスの使用を防ぐには、リソース サービスの使用を制限するポリシーをご覧ください。

境界外の制限付きサービスへの内部トラフィックが境界で拒否されることを確認する

このセクションでは、境界内のサービスから境界外の Google Cloud サービスへの通信がブロックされることを確認します。

VPC Service Controls の境界が境界内のトラフィックから境界外の制限付きサービスへのアクセスを拒否する仕組みを示すアーキテクチャ図

上の図は、内部トラフィックが境界外の制限付きサービスと通信できないことを示しています。

次の手順では、このコンセプトを検証するために、内部トラフィックを境界内の制限付きサービスと境界外の制限付きサービスに送信します。

  1. 境界内の SSH セッションから次のコマンドを実行して、境界内にストレージ バケットを作成します。Cloud Storage サービスが restricted-servicesaccessible-services の両方で構成されているため、このコマンドは正常に機能します。

    gcloud storage buckets create gs://PROJECT_ID-02
    

    成功すると、ストレージ バケットが作成されます。このレスポンスは、境界で Cloud Storage サービスへの内部トラフィックが許可されていることを示しています。

  2. 境界内の SSH セッションから次のコマンドを実行して、境界外のバケットからの読み取りを行います。この公開バケットでは、allUsers に対する読み取り専用アクセスが許可されますが、境界内から境界外の制限付きサービスへのトラフィックは拒否されます。

    gcloud storage cat gs://solutions-public-assets/vpcsc-tutorial/helloworld.txt
    

    出力は次のようになります。

    "ERROR: (gcloud.storage.objects.describe) HTTPError 403: Request is prohibited
    by organization's policy."
    

    このレスポンスは、境界内の制限付きサービスを使用できるものの、境界内のリソースは境界外の制限付きサービスと通信できないことを示しています。

下り(外向き)ポリシーにより境界での例外が許可されていることを確認する

このセクションでは、下り(外向き)ポリシーによって境界の例外が許可されることを確認します。

下り(外向き)ポリシーにより境界外の制限付きサービスへのアクセスに例外が適用される仕組みを示すアーキテクチャ図

上の図は、下り(外向き)ポリシーで限定的な例外を適用し、内部トラフィックが特定の外部リソースと通信する仕組みを示しています。

次の手順では、このコンセプトを確認するために、下り(外向き)ポリシーを作成して、そのポリシーで許可されている境界外の公開 Cloud Storage バケットにアクセスしてみます。

  1. Cloud Shell で 新しいタブを開く」をクリックして、新しい Cloud Shell セッションを開きます。以降のステップでは、境界内の SSH セッションを含む最初のタブと、コマンドライン プロンプトが username@cloudshell で始まる境界外の Cloud Shell の 2 番目のタブを切り替えます。

  2. [Cloud Shell] タブで、google.storage.objects.get メソッドを使用して、外部プロジェクトの公開バケットに接続しているサービス アカウント ID(demo-vm)からの下り(外向き)ポリシーを作成します。下り(外向き)ポリシーで境界を更新します。

    export POLICY_ID=$(gcloud access-context-manager policies list \
    --organization=ORGANIZATION_ID \
    --format="value(name)")
    
    export SERVICE_ACCOUNT_EMAIL=$(gcloud compute instances describe demo-vm \
    --zone=ZONE) \
    --format="value(serviceAccounts.email)"
    
    cat <<EOF > egress_spec.yaml
    - egressFrom:
        identities:
          - serviceAccount:$SERVICE_ACCOUNT_EMAIL
      egressTo:
        operations:
        - methodSelectors:
          - method: 'google.storage.objects.get'
          serviceName: storage.googleapis.com
        resources:
        - projects/950403849117
    EOF
    
    gcloud access-context-manager perimeters update demo_perimeter \
    --set-egress-policies=egress_spec.yaml \
    --policy=$POLICY_ID
    
  3. コマンドライン プロンプトが username@demo-vm で始まり、境界内の VM への SSH セッションが表示されているタブに戻ります。

  4. 境界内の SSH セッションから、Cloud Storage バケットに対して別のリクエストを行い、機能することを確認します。

    gcloud storage cat gs://solutions-public-assets/vpcsc-tutorial/helloworld.txt
    

    出力は次のようになります。

    "Hello world!
    This is a sample file in Cloud Storage that is viewable to allUsers."
    

    このレスポンスは、境界と下り(外向き)ポリシーが特定の ID から特定の Cloud Storage バケットへの内部トラフィックを許可することを示しています。

  5. 境界内の SSH セッションから、下り(外向き)ポリシーの例外で明示的に許可されていないメソッドをテストすることもできます。たとえば、次のコマンドには境界で拒否される google.storage.buckets.list 権限が必要です。

    gcloud storage ls gs://solutions-public-assets/vpcsc-tutorial/*
    

    出力は次のようになります。

    "ERROR: (gcloud.storage.cp) Request is prohibited by organization's policy."
    

    このレスポンスは、境界で外部バケット内のオブジェクトからの内部トラフィックが拒否され、明示的に指定されたメソッドのみが下り(外向き)ポリシーによって許可されることを示します。

サービス境界の外部とデータを共有する一般的なパターンについては、上り(内向き)ルールと下り(外向き)ルールを使用したデータ交換の保護をご覧ください。

(省略可)「リソース サービスの使用を制限する」ポリシーを構成する

また、内部要件やコンプライアンス要件のため、個別に承認された API のみを環境で使用できるようにすることもあります。この場合、組織のポリシー「リソース サービスの使用を制限する」を構成できます。プロジェクトに組織のポリシーを適用すると、そのプロジェクトで作成できるサービスが制限されます。ただし、組織のポリシーによって、このプロジェクトのサービスと他のプロジェクトのサービスとの通信が妨げられることはありません。これに対し、VPC Service Controls を使用すると、境界を定義して境界外のサービスとの通信を防ぐことができます。

たとえば、Compute Engine を有効にして、プロジェクトで Cloud Storage を拒否する組織ポリシーを定義すると、このプロジェクトの VM はプロジェクトに Cloud Storage バケットを作成できません。ただし、VM は別のプロジェクトの Cloud Storage バケットに対してリクエストを送信できるため、Cloud Storage サービスでのデータの引き出しは可能です。このシナリオを実装してテストする手順は次のとおりです。

  1. コマンドライン プロンプトが username@cloudshell で始まる [Cloud Shell] タブに切り替えます。
  2. [Cloud Shell] タブで、Compute Engine サービスの使用のみを許可し、他のすべてのサービスを拒否する組織ポリシー サービスを記述する YAML ファイルを作成して、プロジェクトに適用します。

    cat <<EOF > allowed_services_policy.yaml
    constraint: constraints/gcp.restrictServiceUsage
    listPolicy:
      allowedValues:
      - compute.googleapis.com
      inheritFromParent: true
    EOF
    
    gcloud resource-manager org-policies set-policy allowed_services_policy.yaml \
    --project=PROJECT_ID
    
  3. コマンドライン プロンプトが username@demo-vm で始まり、境界内の VM への SSH セッションが表示されているタブに戻ります。

  4. 境界内の SSH セッションから次のコマンドを実行して、このプロジェクト内で以前に作成したストレージ バケットを表示します。

    gcloud storage buckets describe gs://PROJECT_ID
    

    出力は次のようになります。

    "ERROR: (gcloud.storage.buckets.create) HTTPError 403: Request is disallowed by organization's constraints/gcp.restrictServiceUsage constraint for 'projects/123456789' attempting to use service 'storage.googleapis.com'."
    

    このレスポンスは、境界の構成に関係なく、組織のポリシー サービスがプロジェクト内の Cloud Storage サービスを拒否することを示しています。

  5. 境界内の SSH セッションから次のコマンドを実行して、下り(外向き)ポリシーで許可されている境界外のストレージ バケットを表示します。

    gcloud storage cat gs://solutions-public-assets/vpcsc-tutorial/helloworld.txt
    

    出力は次のようになります。

    "Hello world!
    This is a sample file in Cloud Storage that is viewable to allUsers."
    

    成功すると、外部ストレージ バケットに helloworld.txt の内容が返されます。このレスポンスは、境界と下り(外向き)ポリシーにより、特定の限定された条件下で内部トラフィックが外部ストレージ バケットに到達することが許可されていることを示しています。ただし、組織のポリシー サービスにより、境界の構成に関係なくプロジェクト内の Cloud Storage サービスが拒否されます。境界で許可される場合は、制限付きサービスのリソース使用に関する組織のポリシー サービスに関係なく、プロジェクト外のサービスが引き続きデータ漏洩に使用される可能性があります。

    境界外の Cloud Storage や他の Google サービスとの通信を拒否するには、「リソース サービスの使用を制限する」組織のポリシー サービスだけではなく、VPC Service Controls の境界も構成する必要があります。VPC Service Controls はデータ引き出しのリスクを軽減します。「リソース サービスの使用を制限する」は、環境内に未承認のサービスが作成されないようにするコンプライアンス制御です。これらのコントロールを併用することで、承認済みサービスを使用した環境でデータ流出の範囲をブロックし、承認済みのサービスの内部環境での使用を選択的に許可できます。

クリーンアップ

Google Cloud プロジェクトを削除します。

gcloud projects delete PROJECT_ID

VPC Service Controls の境界では追加コストは発生しませんが、組織内の混乱や未使用のリソースを避けるためにクリーンアップする必要があります。

  1. Google Cloud コンソールの上部にあるプロジェクト セレクタで、このチュートリアルで使用した組織を選択します。
  2. Google Cloud コンソールで、[VPC Service Controls] ページに移動します。

    [VPC Service Controls] に移動

  3. 境界のリストで、削除する境界を選択して、[削除] をクリックします。

  4. ダイアログで、もう一度 [削除] をクリックして確定します。

次のステップ