このページでは、VPC Service Controls の上り(内向き) / 下り(外向き)ルールについて説明します。VPC Service Controls は、上り(内向き)ルールと下り(外向き)ルールを使用して、サービス境界で保護されたリソースとクライアントに関するアクセスを可能にします。
上り(内向き)ルールと 下り(外向き)ルールのブロックは、さまざまな ID とリソースに関するアクセス方向を指定します。上り(内向き) / 下り(外向き)ルールは、以前は 1 つ以上の境界ブリッジを必要としていたユースケースを置き換え、簡素化できます。
上り(内向き)ポリシーと下り(外向き)ポリシーをサービス境界に適用する方法については、上り(内向き)と下り(外向き)のポリシーの構成をご覧ください。
上り(内向き)ルールと下り(外向き)ルールで、ID グループ、サードパーティ ID と IAM ロール(プレビュー)を構成できます。
セキュアなデータ交換のユースケースとサンプルのリストについては、上り(内向き) / 下り(外向き)ルールを使用したセキュアなデータ交換をご覧ください。
コンテキストアウェア アクセスのユースケースとサンプルのリストについては、上り(内向き)ルールを使用したコンテキストアウェア アクセスをご覧ください。
上り(内向き) / 下り(外向き)ルールのメリット
- 上り(内向き) / 下り(外向き)ルールを使用すると、 Google Cloud Service API を使用して、組織内および組織間において限定公開で効率的にデータを交換できます。
- 上り(内向き) / 下り(外向き)ルールを使用すると、API リクエストのコンテキストに基づいて、境界内の Google Cloudリソースへのアクセスを許可できます。
- ソース ネットワーク、IP アドレス、またはデバイスで使用可能な ID タイプまたは ID を制限します。
- ソース ネットワーク、IP アドレス、デバイス、ID タイプに対してアクセスできる Google Cloud APIs とメソッドを制限します。
- データ交換の実行に使用される正確なサービス、メソッド、Google Cloud プロジェクト、VPC ネットワーク、ID を制限することで、情報流出のリスクを軽減します。
- 自分が管理していない外部データセットやイメージに対する読み取り専用アクセス権を付与します。
- 権限の低いセグメント内のクライアントから、多くの特権セグメントのGoogle Cloud リソースにアクセスできないようにする一方で、他の方向へのアクセスを許可します。
- 従来は境界ブリッジを 1 つ以上必要としていた構成を簡素化できます。
上り(内向き)と下り(外向き)の定義
上り(内向き)と下り(外向き)の定義は、リソースに対して呼び出されるオペレーションとは関係ありません。したがって、定義はリクエストの方向を指し、データの移動の方向ではありません。
上り(内向き): サービス境界の外部からサービス境界内のリソースに対して API クライアントが行うすべてのアクセスを指します。例:
- サービス境界外の Cloud Storage クライアントが、境界内の Cloud Storage リソースに対する読み取り、書き込み、またはコピー オペレーションを呼び出す。
下り(外向き): サービス境界内の API クライアントまたはリソースがサービス境界外のリソースに対して行うすべてのアクセスを指します。例:
- サービス境界内の Compute Engine クライアントが、使用するイメージ リソースが境界外にある Compute Engine の
createオペレーションを呼び出す。 - Cloud Storage クライアント(境界内または外部)は、あるバケットが境界内にあり、他方のバケットが外部にある場合に、
copyコマンドを呼び出します。
- サービス境界内の Compute Engine クライアントが、使用するイメージ リソースが境界外にある Compute Engine の
ポリシーモデル
上り(内向き)ルールまたは下り(外向き)ルールは、from と to のブロックで構成されます。その場合:
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
*OR*
roles:
- ROLE_NAME
resources:
- projects/PROJECT
title: TITLE
- ingressFrom:- (必須)境界外の許可ソースと ID を一覧表示するfromブロックを開始します。identityType:- (この属性またはidentities属性を使用する必要があります)指定されたsources(ネットワーク送信元)から使用できる ID のタイプを定義します。有効な値:ANY_IDENTITY、ANY_USER_ACCOUNT、ANY_SERVICE_ACCOUNT。ANY_IDENTITYは、認証されていないリクエストも含めて、すべての ID からのリクエストを許可します。ANY_USER_ACCOUNTはすべての人間ユーザーを、ANY_SERVICE_ACCOUNTはすべてのサービス アカウントを許可しますが、ANY_USER_ACCOUNTとANY_SERVICE_ACCOUNTのどちらも、認証されていないリクエストは許可しません。この属性は、組織に基づいた ID を制限しません。たとえば、
ANY_SERVICE_ACCOUNTは任意の組織のサービス アカウントを許可します。identities:-(この属性またはidentityType属性を使用する必要があります)この属性は、境界内のリソースにアクセスできるサービス アカウント、ユーザー アカウント、Google グループ、またはサードパーティ ID のリストを開始します。PRINCIPAL_IDENTIFIER: 境界内のリソースへのアクセス権を付与するユーザー アカウント、サービス アカウント、Google グループ、またはサードパーティ ID を指定します。VPC Service Controls は、IAMv1API プリンシパル ID のうち、次の ID のみをサポートします。ユーザー アカウントとサービス アカウントについては、それぞれ
user:USER_EMAIL_ADDRESS形式とserviceAccount:SA_EMAIL_ADDRESS形式が使用されている。他の ID については、サポートされている ID グループで指定されている形式が使用されている。
これらの ID の詳細については、許可ポリシーのプリンシパル 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:- (この属性またはroles属性を使用する必要があります)fromブロック条件を満たすクライアントにアクセスを許可し、アクセス可能なサービスとアクション / メソッドのリストの開始を指定します。- serviceName:- (必須)このフィールドには有効なサービス名を指定することも、"*"に設定して、すべてのサービスへのアクセスを許可することもできます。たとえば、bigquery.googleapis.comは有効なserviceNameです。使用可能なサービスのリストについては、サポート対象プロダクトをご覧ください。methodSelectors:-(serviceNameが"*"以外の場合は必須)fromブロック条件を満たすクライアントがアクセスを許可されるメソッドのリストの先頭。制限付きのメソッドとサービスの権限については、サポートされているサービス メソッドの制限をご覧ください。VPC Service Controls で制御できないサービス メソッドの一覧については、サービス メソッドの例外をご覧ください。
- method:- (この属性またはpermission属性を使用する必要があります)このフィールドは、有効なサービス メソッドにすることも、"*"に設定して、すべての指定されたサービス メソッドへのアクセスを許可することもできます。- permission:- (この属性またはmethod属性を使用する必要があります)このフィールドは、有効なサービス権限にする必要があります。この権限が必要なオペレーションで境界内のリソースにアクセスできます。リソースへのリクエストで複数の権限が必要な場合は、上り(内向き)ルールが機能するために必要なすべての権限を 1 つのオペレーションで指定する必要があります。たとえば、BigQuery リソースへのリクエストで
bigquery.jobs.create権限とbigquery.tables.create権限が必要な場合は、この 2 つの権限を 1 つのオペレーションで指定する必要があります。また、Google Cloud コンソールを使用して同じリソースに対して権限を複数回指定した場合は、それらの権限は同一のオペレーション内に作成されません。この問題を回避するには、リソースのすべての権限を一度に指定します。roles:: (この属性またはoperations属性を使用する必要があります)この属性は、ルールで指定されたサービスのアクセス範囲を定義する IAM ロールのリストを参照します。ROLE_NAME: サービスへのアクセスに必要なすべての権限を含む単一のロールまたはロールの組み合わせを指定します。ロールを指定するには、ロール コンポーネントで説明されているロール名の形式を使用します(projects/PROJECT_ID/roles/IDENTIFIER形式を除く)。サポートされているサービスとロールについては、サポートされているプロダクトをご覧ください。
resources:- (必須)この属性は、境界外のクライアントからアクセス可能で、サービス境界内に存在するGoogle Cloud リソースのリストを指定します。このフィールドを"*"に設定すると、境界内の任意の Google Cloud リソースへの上り(内向き)アクセスが許可されます。title:- (省略可)この属性は、上り(内向き)ルールのタイトルを指定します。タイトルは境界内で一意で、100 文字以内にする必要があります。アクセス ポリシー内で、すべてのルールのタイトルの合計長は 240,000 文字を超えないようにする必要があります。
正常に機能する上り(内向き)ルールを作成するには、次の属性を指定する必要があります。
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
*OR*
roles:
- ROLE_NAME
resources:
- projects/PROJECT
*OR*
externalResources:
- EXTERNAL_RESOURCE_PATH
egressFrom:
identityType: ANY_IDENTITY | ANY_USER_ACCOUNT | ANY_SERVICE_ACCOUNT
*OR*
identities:
- PRINCIPAL_IDENTIFIER
sources:
- resource: RESOURCE
*OR*
- accessLevel: ACCESS_LEVEL
sourceRestriction: RESTRICTION_STATUS
title: TITLE
- egressTo:- (必須)境界外の指定されたプロジェクトの Google Cloud リソースで許可されたサービス オペレーションの一覧を取得するtoブロックを開始します。operations:- (この属性またはroles属性を使用する必要があります)fromブロック条件を満たすクライアントにアクセスを許可し、アクセス可能なサービスとアクション / メソッドのリストの開始を指定します。- serviceName:- (必須)このフィールドには有効なサービス名を指定することも、"*"に設定して、すべてのサービスへのアクセスを許可することもできます。使用可能なサービスのリストについては、サポート対象プロダクトをご覧ください。methodSelectors:-(serviceNameが"*"以外の場合は必須)fromブロック条件を満たすクライアントがアクセスを許可されるメソッドのリストの先頭。制限付きのメソッドとサービスの権限については、サポートされているサービス メソッドの制限をご覧ください。VPC Service Controls で制御できないサービス メソッドの一覧については、サービス メソッドの例外をご覧ください。
- method:- (この属性またはpermission属性を使用する必要があります)このフィールドは、有効なサービス メソッドにすることも、"*"に設定して、すべての指定されたサービス メソッドへのアクセスを許可することもできます。- permission:- (この属性またはmethod属性を使用する必要があります)このフィールドには有効なサービス権限が必要です。この権限を必要とするオペレーションで、境界外にある指定のリソースにアクセスできます。リソースへのリクエストで複数の権限が必要な場合は、下り(外向き)ルールが機能するために必要なすべての権限を 1 つのオペレーションで指定する必要があります。たとえば、BigQuery リソースへのリクエストで
bigquery.jobs.create権限とbigquery.tables.create権限が必要な場合は、この 2 つの権限を 1 つのオペレーションで指定する必要があります。また、Google Cloud コンソールを使用して同じリソースに対して権限を複数回指定した場合は、それらの権限は同一のオペレーション内に作成されません。この問題を回避するには、リソースのすべての権限を一度に指定します。roles:: (この属性またはoperations属性を使用する必要があります)この属性は、ルールで指定されたサービスのアクセス範囲を定義する IAM ロールのリストを参照します。ROLE_NAME: サービスへのアクセスに必要なすべての権限を含む単一のロールまたはロールの組み合わせを指定します。ロールを指定するには、ロール コンポーネントで説明されているロール名の形式を使用します(projects/PROJECT_ID/roles/IDENTIFIER形式を除く)。サポートされているサービスとロールについては、サポートされているプロダクトをご覧ください。
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_IDENTITY、ANY_USER_ACCOUNT、ANY_SERVICE_ACCOUNT。ANY_IDENTITYは、認証されていないリクエストも含めて、すべての ID からのリクエストを許可します。ANY_USER_ACCOUNTはすべての人間ユーザーを、ANY_SERVICE_ACCOUNTはすべてのサービス アカウントを許可しますが、ANY_USER_ACCOUNTとANY_SERVICE_ACCOUNTのどちらも、認証されていないリクエストは許可しません。この属性は、組織に基づいた ID を制限しません。たとえば、
ANY_SERVICE_ACCOUNTは任意の組織のサービス アカウントを許可します。identities:-(この属性またはidentityType属性を使用する必要があります)この属性は、境界外の指定されたリソースにアクセスできるサービス アカウント、ユーザー アカウント、Google グループ、またはサードパーティ ID のリストを開始します。PRINCIPAL_IDENTIFIER: 境界外の指定リソースにアクセスできるユーザー アカウント、サービス アカウント、Google グループ、またはサードパーティ ID を指定します。VPC Service Controls は、IAMv1API プリンシパル ID のうち、次の ID のみをサポートします。ユーザー アカウントとサービス アカウントについては、それぞれ
user:USER_EMAIL_ADDRESS形式とserviceAccount:SA_EMAIL_ADDRESS形式が使用されている。他の ID については、サポートされている ID グループで指定されている形式が使用されている。
これらの ID の詳細については、許可ポリシーのプリンシパル ID をご覧ください。
sources:- この属性は、ネットワーク送信元のリストを指定します。属性値は、プロジェクトまたはアクセスレベルのリストにできます。指定されたsourcesに基づいてアクセス制限を適用するには、sourceRestriction属性をSOURCE_RESTRICTION_ENABLEDに設定します。VPC Service Controls は、
sources属性のaccessLevel属性とresource属性を OR 条件として評価します。- resource:- (この属性またはaccessLevel属性を使用)境界外のデータへのアクセスを許可するサービス境界内のGoogle Cloud リソースを 1 つ以上指定します。この属性はプロジェクトのみをサポートします。プロジェクトを指定するには、projects/PROJECT_NUMBERの形式を使用します。この属性で
"*"を使用してすべての Google Cloud リソースを許可することはできません。- accessLevel:- (この属性またはresource属性を使用)境界内のリソースが境界外のリソースにアクセスできるようにするアクセスレベルを 1 つ以上指定します。これらのアクセスレベルが境界と同じアクセス ポリシーのものであることを確認します。accessLevel属性を"*"に設定すると、下り(外向き)ポリシーはすべてのネットワーク送信元からのアクセスを許可します。sourceRestriction:- (sources属性を使用する場合は必須)この属性を使用すると、指定されたsourcesに基づいてアクセス制限を適用できます。これらのアクセス制限を適用するには、sourceRestriction属性をSOURCE_RESTRICTION_ENABLEDに設定します。これらのアクセス制限を無効にするには、
sourceRestriction属性をSOURCE_RESTRICTION_DISABLEDに設定します。sourceRestriction属性に値を設定しないと、VPC Service Controls はsources属性を無視し、アクセス制限を適用しません。title:- (省略可)この属性は、下り(外向き)ルールのタイトルを指定します。タイトルは境界内で一意で、100 文字以内にする必要があります。アクセス ポリシー内で、すべてのルールのタイトルの合計長は 240,000 文字を超えないようにする必要があります。
下り(外向き)ポリシー ファイルの構成が完了したら、下り(外向き)ポリシー ファイルをサービス ポリシーに適用する方法について上り(内向き)ポリシーと下り(外向き)ポリシーの更新をご覧ください。
サービス境界に複数の下り(外向き)ルールを構成する場合、VPC Service Controls は、下り(外向き)ルールのいずれかの条件を満たすリクエストを許可します。
ドライラン モードを使用した上り(内向き) / 下り(外向き)ポリシーのテスト
サービスのすべてのメソッドへのアクセスを許可したくないときに、アクセスを許可するメソッドの正確なリストを特定することが難しい場合があります。これは、サービスの特定のメソッドが、 Google Cloud の別のサービスで異なるメソッドを呼び出す可能性があるためです。たとえば、BigQuery が Cloud Storage バケットからテーブルを読み込み、クエリを実行する場合です。
許可する適切なメソッドを確認するには、VPC Service Controls のドライラン モードを使用できます。これを行うには、まず、上り(内向き)または下り(外向き)ポリシーのないドライラン モードで境界を有効にし、監査ログから呼び出されるメソッドのリストを収集します。次に、これらのメソッドを、すべての違反が停止するまでの間、ドライランの上り(内向き) / 下り(外向き)ポリシーに段階的に追加していきます。その時点で、構成をドライラン モードから自動適用モードに移行できます。
サポートされていない機能
現在、上り(内向き) / 下り(外向き)ルールについては、以下の機能はサポートされていません。
- プロジェクトではなくラベルで Google Cloud リソースを特定する。
- すべてのサービスがメソッドごとの上り(内向き) / 下り(外向き)ルールをサポートしているわけではありません。サポートされているサービス メソッドの制限をご覧ください。
ANY_SERVICE_ACCOUNTとANY_USER_ACCOUNTの ID の種類を使用して、次の操作を行うことはできません。- すべての Container Registry オペレーション。
- すべての notebooks.googleapis.com サービス オペレーション。
- 署名付き URL を使用した Cloud Storage オペレーション。
- Cloud Run functions(ローカルマシンからの Cloud Functions のデプロイ)。
- Cloud Logging シンクから Cloud Storage リソースにログをエクスポートする。
- Cloud Composer のすべての Apache Airflow ウェブ ユーザー インターフェース オペレーション。
制限事項
上り(内向き)と下り(外向き)の上限については、割り当てと上限をご覧ください。
次のステップ
- この Codelab を完了して、上り(内向き)違反と下り(外向き)違反を修正する方法を確認する。
- 違反ダッシュボードを設定して表示する方法を確認する。