上り(内向き)と下り(外向き)のルール

このページでは、VPC Service Controls の上り(内向き) / 下り(外向き)ルールについて説明します。VPC Service Controls は、上り(内向き)ルールと下り(外向き)ルールを使用して、サービス境界で保護されたリソースとクライアントに関するアクセスを可能にします。

上り(内向き)ルールと 下り(外向き)ルールのブロックは、さまざまな ID とリソースに関するアクセス方向を指定します。上り(内向き) / 下り(外向き)ルールは、以前は 1 つ以上の境界ブリッジを必要としていたユースケースを置き換え、簡素化できます。

上り(内向き)ポリシーと下り(外向き)ポリシーをサービス境界に適用する方法については、上り(内向き)と下り(外向き)のポリシーの構成をご覧ください。

上り(内向き)ルールと下り(外向き)ルールでID グループとサードパーティ ID を構成できます。ユースケースの例については、上り(内向き)ルールと下り(外向き)ルールで ID グループとサードパーティ ID を使用する例をご覧ください。

セキュアなデータ交換のユースケースとサンプルのリストについては、上り(内向き) / 下り(外向き)ルールを使用したセキュアなデータ交換をご覧ください。

コンテキストアウェア アクセスのユースケースとサンプルのリストについては、上り(内向き)ルールを使用したコンテキストアウェア アクセスをご覧ください。

上り(内向き) / 下り(外向き)ルールのメリット

  1. 上り(内向き) / 下り(外向き)ルールを使用すると、Google Cloud Service API を使用して、組織内および組織間において限定公開で効率的にデータを交換できます。
  2. 上り(内向き) / 下り(外向き)ルールを使用すると、API リクエストのコンテキストに基づいて、境界内の Google Cloud リソースへのアクセスを許可できます。
    1. ソース ネットワーク、IP アドレス、またはデバイスで使用可能な ID タイプまたは ID を制限します。
    2. ソース ネットワーク、IP アドレス、デバイス、ID タイプに対してアクセスできる Google Cloud APIs とメソッドを制限します。
  3. データ交換の実行に使用される正確なサービス、メソッド、Google Cloud プロジェクト、VPC ネットワーク、ID を制限することで、情報流出のリスクを軽減します。
  4. 自分が管理していない外部データセットやイメージに対する読み取り専用アクセス権を付与します。
  5. 権限の低いセグメント内のクライアントから、多くの特権セグメントの Google Cloud リソースにアクセスできないようにする一方で、他の方向へのアクセスを許可します。
  6. 従来は境界ブリッジを 1 つ以上必要としていた構成を簡素化できます。

上り(内向き)と下り(外向き)の定義

上り(内向き)と下り(外向き)の定義は、リソースに対して呼び出されるオペレーションとは関係ありません。したがって、定義はリクエストの方向を指し、データの移動の方向ではありません。

  • 上り(内向き): サービス境界の外部からサービス境界内のリソースに対して API クライアントが行うすべてのアクセスを指します。例:

    • サービス境界外の Cloud Storage クライアントが、境界内の Cloud Storage リソースに対する読み取り、書き込み、またはコピー オペレーションを呼び出す。
  • 下り(外向き): サービス境界内の API クライアントまたはリソースがサービス境界外のリソースに対して行うすべてのアクセスを指します。例:

    • サービス境界内の Compute Engine クライアントが、使用するイメージ リソースが境界外にある Compute Engine の create オペレーションを呼び出す。
    • Cloud Storage クライアント(境界内または外部)は、あるバケットが境界内にあり、他方のバケットが外部にある場合に、copy コマンドを呼び出します。

ポリシーモデル

上り(内向き)ルールまたは下り(外向き)ルールは、fromto のブロックで構成されます。その場合:

  • from は API クライアントの属性を参照します。
  • to は、Google Cloud サービスとリソースの属性を参照します。

サービス境界には、複数の上り(内向き)ルールと下り(外向き)ルールを関連付けることができます。Google Cloud サービスの呼び出しは、次のセマンティクスに基づいて許可または拒否されます。

  • 境界外のクライアントから境界内の Google Cloud リソースに対するリクエストは、必要な上り(内向き)ルールの条件が満たされた場合に許可されます。
  • 境界内のクライアントから境界外の Google Cloud リソースへのリクエストは、必要な下り(外向き)ルールの条件が満たされた場合に許可されます。
  • クライアントが上り(内向き)ルールを満たしている場合(クライアントが境界内にない場合)かつ外部リソースが下り(外向き)ルールを満たしている場合、境界内の Google Cloud リソースと境界外の Google Cloud リソースに対する API 呼び出しが許可されます。

上り(内向き)ルールで許可された API リクエストの例

  • 境界内の Cloud Storage バケットからローカルマシンにオブジェクトをダウンロードする境界外の Cloud Storage クライアント(たとえば、gcloud storage cp コマンドを使用)。
  • 境界内のプロジェクトの BigQuery ジョブを使用して、境界内の BigQuery データセットをクエリする境界外の BigQuery クライアント(たとえば、bq query コマンドを使用)。
  • 境界外の VPC ネットワーク内の Compute Engine VM は、境界内の Cloud Storage バケットに書き込みを行います。

下り(外向き)ルールで許可された API リクエストの例

  • 境界外の Cloud Storage バケットと境界内のバケットの間でオブジェクトをコピーする境界内の Cloud Storage クライアント(たとえば、gcloud storage cp コマンドを使用)。
  • 境界外のプロジェクトの BigQuery ジョブを使用して、境界内の BigQuery データセットをクエリする境界内の BigQuery クライアント(たとえば、bq query コマンドを使用)。

上り(内向き)ルールと下り(外向き)ルールの組み合わせによって許可された API リクエストの例

  • 境界外の Cloud Storage バケットと境界内のバケットの間でオブジェクトをコピーする境界外の Cloud Storage クライアント(たとえば、gcloud storage cp コマンドを使用)。
  • 境界外のプロジェクトの BigQuery ジョブを使用して、境界内の BigQuery データセットをクエリする境界外の BigQuery クライアント(たとえば、bq query コマンドを使用)。
  • 境界内の Cloud KMS 鍵を使用して、境界外の Compute Engine ディスクを作成する境界外の Compute Engine クライアント。

BigQuery と Compute Engine の例では、BigQuery ジョブまたは Compute Engine ディスクが境界外にあるため、上り(内向き)ルールでは不十分です。下り(外向き)ルールは、境界内の Google Cloud リソース(BigQuery データセットまたは Cloud KMS 鍵)と境界外のリソース(BigQuery ジョブまたは Compute Engine ディスク)に対する API リクエストを許可するために必要です。

複数のサービス境界に関わる API リクエスト

アクセスされたリソースと API クライアントが別のサービス境界に属している場合、関連するすべての境界のポリシーによって API リクエストが許可される必要があります。たとえば、サービス境界 A 内に Cloud Storage クライアントとバケット a があり、サービス境界 B 内にバケット b があるとします。この例では、Cloud Storage クライアントがオブジェクトをバケット a からバケット b に、またバケット b からバケット a にコピーするには、次の上り(内向き)ルールと下り(外向き)ルールが必要です。

  • Cloud Storage バケット b へのアクセスを許可する境界 A の下り(外向き)ルール
  • Cloud Storage バケット a へのアクセスを許可する境界 B の下り(外向き)ルール
  • 境界 B 外の Cloud Storage クライアントへのアクセスを許可する境界 B の上り(内向き)ルール

上り(内向き)ルールのリファレンス

上り(内向き)ルールは、Google Cloud コンソール、JSON ファイル、または YAML ファイルを使用して構成できます。次のサンプルでは、.yaml 形式を使用します。

- ingressFrom:
    identityType: ANY_IDENTITY | ANY_USER_ACCOUNT | ANY_SERVICE_ACCOUNT
    *OR*
    identities:
    - PRINCIPAL_IDENTIFIER
    sources:
    - resource: RESOURCE
      *OR*
    - accessLevel: ACCESS_LEVEL
  ingressTo:
    operations:
    - serviceName: SERVICE
      methodSelectors:
      - method: METHOD
      *OR*
      - permission: PERMISSION
    resources:
    - projects/PROJECT
  • - ingressFrom: - (必須)境界外の許可ソースと ID を一覧表示する from ブロックを開始します。

  • identityType: - (この属性または identities 属性を使用する必要があります)指定された sources(ネットワーク送信元)から使用できる ID のタイプを定義します。有効な値: ANY_IDENTITYANY_USER_ACCOUNTANY_SERVICE_ACCOUNTANY_IDENTITY は、すべての ID を許可します。ANY_USER_ACCOUNT は、すべてのユーザー(人)を許可します。ANY_SERVICE_ACCOUNT は、すべてのサービス アカウントを許可します。

    この属性は、組織に基づいて ID を制限しません。たとえば、ANY_SERVICE_ACCOUNT は任意の組織のサービス アカウントを許可します。

  • identities: -(この属性または identityType 属性を使用する必要があります)この属性は、境界内のリソースにアクセスできるサービス アカウント、ユーザー アカウント、Google グループ、またはサードパーティ ID のリストを開始します。

  • PRINCIPAL_IDENTIFIER: 境界内のリソースへのアクセス権を付与するユーザー アカウント、サービス アカウント、Google グループ、またはサードパーティ ID(プレビュー)を指定します。IAM v1 API プリンシパル ID で指定されている形式を使用します。たとえば、group:GROUP_NAME@googlegroups.com 形式を使用して Google グループを指定します。

    VPC Service Controls は、IAM v1 API プリンシパル ID の接頭辞 userserviceAccountgroupprincipalプレビュー)、principalSetプレビュー)で始まる v1 ID のみをサポートします。

  • sources: - (必須)ネットワーク送信元のリストを指定します。リスト内の各値は、アクセスレベルまたは Google Cloud プロジェクトです。accessLevel 属性を * に設定すると、上り(内向き)ポリシーはすべてのネットワーク送信元からのアクセスを許可します。この属性を Google Cloud プロジェクトに設定すると、上り(内向き)ポリシーは、このプロジェクトに属する VPC ネットワークからのアクセスを許可します。

    この値は、関連付けられたプロジェクトが完全に削除されると削除される可能性があります。ただし、この値を削除してもエラーは発生しません。問題のトラブルシューティングを行う際は、必ずこの値が存在するかどうかを確認してください。

  • - resource: - (この属性または accessLevel 属性を使用)アクセス可能な境界外のプロジェクトまたは VPC ネットワークを指定します。プロジェクトを指定するには、projects/PROJECT_NUMBER の形式を使用します。VPC ネットワークを指定するには、//compute.googleapis.com/projects/PROJECT_ID/global/networks/NETWORK_NAME の形式を使用します。

  • - accessLevel: - (この属性または resource 属性を使用する必要があります)境界外部からアクセス可能なアクセスレベルを指定します。accessLevel 属性を * に設定すると、上り(内向き)ポリシーはすべてのネットワーク送信元からのアクセスを許可します。

  • ingressTo: - (必須)境界内の指定の Google Cloud リソースで使用可能なサービス オペレーションを一覧表示する to ブロックを開始します。

  • operations: - (必須)from ブロック条件を満たすクライアントがアクセスを許可され、アクセスが可能なサービスとアクション / メソッドのリストの開始を指定します。

  • - serviceName: - (必須)このフィールドには有効なサービス名を指定することも、* に設定して、すべてのサービスへのアクセスを許可することもできます。たとえば、bigquery.googleapis.com は有効な serviceName です。使用可能なサービスのリストについては、サポート対象プロダクトをご覧ください。

  • methodSelectors: -(serviceName* 以外の場合は必須)from ブロック条件を満たすクライアントがアクセスを許可されるメソッドのリストの先頭。制限付きのメソッドとサービスの権限については、サポートされているサービス メソッドの制限をご覧ください。

  • - method: - (この属性または permission 属性を使用する必要があります)このフィールドは、有効なサービス メソッドにすることも、* に設定して、すべての指定されたサービス メソッドへのアクセスを許可することもできます。

  • - permission: - (この属性または method 属性を使用する必要があります)このフィールドは、有効なサービス権限にする必要があります。この権限が必要なオペレーションで境界内のリソースにアクセスできます。

    リソースへのリクエストで複数の権限が必要な場合は、上り(内向き)ルールが機能するために必要なすべての権限を 1 つのオペレーションで指定する必要があります。たとえば、BigQuery リソースへのリクエストで bigquery.jobs.create 権限と bigquery.tables.create 権限が必要な場合は、この 2 つの権限を 1 つのオペレーションで指定する必要があります。また、Google Cloud コンソールを使用して同じリソースに対して権限を複数回指定した場合は、それらの権限は同一のオペレーション内に作成されません。この問題を回避するには、リソースのすべての権限を一度に指定します。

  • resources: - (必須)この属性は、境界外のクライアントからアクセス可能で、サービス境界内に存在する Google Cloud リソースのリストを指定します。このフィールドを * に設定すると、境界内の任意の Google Cloud リソースへの上り(内向き)アクセスが許可されます。

正常に機能する上り(内向き)ルールを作成するには、次の属性を指定する必要があります。

  • sources 属性。accessLevel または resource(Google Cloud プロジェクトまたは VPC ネットワーク)を指定するか、accessLevel 属性を * に設定する必要があります。
  • identityType または identities 属性
  • resources 属性
  • serviceName 属性

上り(内向き)ポリシー ファイルの構成が完了したら、上り(内向き)ポリシー ファイルをサービス境界に適用する方法について上り(内向き)ポリシーと下り(外向き)ポリシーの更新をご覧ください。

サービス境界に複数の上り(内向き)ルールを構成する場合、VPC Service Controls は、上り(内向き)ルールのいずれかの条件を満たすリクエストを許可します。

下り(外向き)ルールのリファレンス

下り(外向き)ルールは、Google Cloud コンソール、JSON ファイル、または YAML ファイルを使用して構成できます。次のサンプルでは、.yaml 形式を使用します。

- egressTo:
    operations:
    - serviceName: SERVICE_NAME
      methodSelectors:
      - method: METHOD
      *OR*
      - permission: PERMISSION
    resources:
    - projects/PROJECT
    *OR*
    externalResources:
    - EXTERNAL_RESOURCE_PATH
  egressFrom:
    identityType: ANY_IDENTITY | ANY_USER_ACCOUNT | ANY_SERVICE_ACCOUNT
    *OR*
    identities:
    - PRINCIPAL_IDENTIFIER
    sources:
    - accessLevel: ACCESS_LEVEL
    sourceRestriction: RESTRICTION_STATUS
  • - egressTo: - (必須)境界外の指定されたプロジェクトの Google Cloud リソースで許可されたサービス オペレーションを一覧表示する to ブロックを開始します。

  • operations: - (必須)from ブロック条件を満たすクライアントがアクセスを許可され、アクセスが可能なサービスとアクション / メソッドのリストの開始を指定します。

  • - serviceName: - (必須)このフィールドには有効なサービス名を指定することも、* に設定して、すべてのサービスへのアクセスを許可することもできます。使用可能なサービスのリストについては、サポート対象プロダクトをご覧ください。

  • methodSelectors: -(serviceName* 以外の場合は必須)from ブロック条件を満たすクライアントがアクセスを許可されるメソッドのリストの先頭。制限付きのメソッドとサービスの権限については、サポートされているサービス メソッドの制限をご覧ください。

  • - method: - (この属性または permission 属性を使用する必要があります)このフィールドは、有効なサービス メソッドにすることも、* に設定して、すべての指定されたサービス メソッドへのアクセスを許可することもできます。

  • - permission: - (この属性または method 属性を使用する必要があります)このフィールドには有効なサービス権限が必要です。この権限を必要とするオペレーションで、境界外にある指定のリソースにアクセスできます。

    リソースへのリクエストで複数の権限が必要な場合は、下り(外向き)ルールが機能するために必要なすべての権限を 1 つのオペレーションで指定する必要があります。たとえば、BigQuery リソースへのリクエストで bigquery.jobs.create 権限と bigquery.tables.create 権限が必要な場合は、この 2 つの権限を 1 つのオペレーションで指定する必要があります。また、Google Cloud コンソールを使用して同じリソースに対して権限を複数回指定した場合は、それらの権限は同一のオペレーション内に作成されません。この問題を回避するには、リソースのすべての権限を一度に指定します。

  • resources: - この属性は、境界内のクライアントがアクセスできる、プロジェクトで指定されている Google Cloud リソースのリストです。このフィールドを * に設定すると、すべての Google Cloud リソースへの下り(外向き)アクセスが許可されます。

  • externalResources: - この属性は、BigQuery Omni リソースを指定するためにのみ使用されます。この属性は、境界内のクライアントがアクセスできる、BigQuery Omni でサポートされている外部リソースのリストです。指定できるのは、Amazon S3 リソースまたは Azure Blob Storage リソースのみです。Amazon S3 の場合、サポートされる形式は s3://BUCKET_NAME です。Azure Storage の場合、サポートされる形式は azure://myaccount.blob.core.windows.net/CONTAINER_NAME です。

  • egressFrom: -(必須)境界内の許可ソースと ID を一覧表示する from ブロックを開始します。

  • identityType: - (この属性または identities 属性を使用する必要があります)この属性は、境界外の指定リソースにアクセスするために使用できる ID の種類を定義します。有効な値: ANY_IDENTITYANY_USER_ACCOUNTANY_SERVICE_ACCOUNTANY_IDENTITY は、すべての ID を許可します。ANY_USER_ACCOUNT は、すべてのユーザー(人)を許可します。ANY_SERVICE_ACCOUNT は、すべてのサービス アカウントを許可します。

    この属性は、組織に基づいて ID を制限しません。たとえば、ANY_SERVICE_ACCOUNT は任意の組織のサービス アカウントを許可します。

  • identities: - (この属性または identityType 属性を使用する必要があります)この属性は、境界外の指定リソースにアクセスできるサービス アカウント、ユーザー アカウント、Google グループ、またはサードパーティ ID のリストを開始します。

  • PRINCIPAL_IDENTIFIER: 境界外の指定リソースにアクセスできるユーザー アカウント、サービス アカウント、Google グループ、またはサードパーティ ID(プレビュー)を指定します。IAM v1 API プリンシパル ID で指定されている形式を使用します。たとえば、group:GROUP_NAME@googlegroups.com 形式を使用して Google グループを指定します。

    VPC Service Controls は、IAM v1 API プリンシパル ID の接頭辞 userserviceAccountgroupprincipalプレビュー)、principalSetプレビュー)で始まる v1 ID のみをサポートします。

  • sources: - (必須)ネットワーク送信元のリストを指定します。属性値には、アクセスレベルのリストを指定できます。指定された sources に基づいてアクセス制限を適用するには、sourceRestriction 属性を SOURCE_RESTRICTION_ENABLED に設定します。

  • - accessLevel: - (必須)境界内のリソースが境界外のリソースにアクセスできるようにする 1 つ以上のアクセスレベルを指定します。これらのアクセスレベルが境界と同じアクセス ポリシーのものであることを確認します。accessLevel 属性を * に設定すると、下り(外向き)ポリシーはすべてのネットワーク送信元からのアクセスを許可します。

  • sourceRestriction: - (sources 属性を使用する場合は必須)この属性を使用すると、指定された sources に基づいてアクセス制限を適用できます。これらのアクセス制限を適用するには、sourceRestriction 属性を SOURCE_RESTRICTION_ENABLED に設定します。

    これらのアクセス制限を無効にするには、sourceRestriction 属性を SOURCE_RESTRICTION_DISABLED に設定します。

    sourceRestriction 属性に値を設定しないと、VPC Service Controls は sources 属性を無視し、アクセス制限を適用しません。

下り(外向き)ポリシー ファイルの構成が完了したら、下り(外向き)ポリシー ファイルをサービス ポリシーに適用する方法について上り(内向き)ポリシーと下り(外向き)ポリシーの更新をご覧ください。

サービス境界に複数の下り(外向き)ルールを構成する場合、VPC Service Controls は、いずれかの下り(外向き)ルールの条件を満たすリクエストを許可します。

ドライラン モードを使用した上り(内向き) / 下り(外向き)ポリシーのテスト

サービスのすべてのメソッドへのアクセスを許可したくないときに、アクセスを許可するメソッドの正確なリストを特定することが難しい場合があります。これは、サービスの特定のメソッドが、Google Cloud の別のサービスで異なるメソッドを呼び出す可能性があるためです。たとえば、BigQuery が Cloud Storage バケットからテーブルを読み込み、クエリを実行する場合です。

許可する適切なメソッドを確認するには、VPC Service Controls のドライラン モードを使用できます。これを行うには、まず、上り(内向き)または下り(外向き)ポリシーのないドライラン モードで境界を有効にし、監査ログから呼び出されるメソッドのリストを収集します。次に、これらのメソッドを、すべての違反が停止するまでの間、ドライランの上り(内向き) / 下り(外向き)ポリシーに段階的に追加していきます。その時点で、構成をドライラン モードから自動適用モードに移行できます。

サポートされていない機能

現在、上り(内向き) / 下り(外向き)ルールについては、以下の機能はサポートされていません。

  1. プロジェクトではなくラベルで Google Cloud リソースを特定する。
  2. すべてのサービスがメソッドごとの上り(内向き) / 下り(外向き)ルールをサポートしているわけではありません。サポートされているサービス メソッドの制限をご覧ください。
  3. ANY_SERVICE_ACCOUNTANY_USER_ACCOUNT の ID の種類を使用して、次の操作を行うことはできません。

制限事項

上り(内向き)と下り(外向き)の上限については、割り当てと上限をご覧ください。

次のステップ

  • このcodelab を完了して、上り(内向き)違反と下り(外向き)違反を修正する方法を確認する。