このページでは、上り(内向き)ルールと下り(外向き)ルールを使用して、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_MODE
がcustom
に設定されているがサブネットがない VPC ネットワークはサポートされません。内部 IP アドレスを有効にするには、VPC ネットワークに少なくとも 1 つのサブネットが含まれている必要があります。アクセス ポリシー内のすべてのアクセスレベルで指定できる上限は 500 VPC ネットワークのみです。
アクセスレベルまたはサービス境界によって参照される VPC ネットワークを削除し、同じ名前で別の VPC ネットワークを再作成しても、VPC Service Controls では、再作成された VPC ネットワーク上で内部 IP アドレスが自動的に有効にされません。この制限を回避するには、別の名前の VPC ネットワークを作成して境界に追加します。
内部 IP アドレスを使用して Google マネージド サービスからのアクセスを許可することはできません。たとえば、Cloud SQL です。
下り(外向き)ルールで内部 IP アドレスベースの条件を持つアクセスレベルを使用する場合は、デバイスタイプやユーザー ID などの他の条件をアクセスレベルに追加しないことをおすすめします。
内部 IP アドレスが、地理的リージョンを参照するアクセスレベルと一致しません。
アクセスレベルで内部 IP アドレスを使用する
ベーシック アクセスレベル条件の
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 アドレス範囲。
VpcNetworkSource
のVpcSubNetwork
フィールドで指定された IP アドレス範囲は、CIDR ブロック IP サブネットワーク仕様に従う必要があります。サブネットには有効な IPv4 範囲である任意の IP アドレス範囲を使用できます。
IngressSource
またはEgressSource
の許可条件とともにこのアクセスレベルを使用します。
以降のセクションでは、サンプル シナリオを使用して、これらの手順を実行して内部 IP アドレスを有効にする方法について説明します。
内部 IP アドレスを使用してサブネット アクセスを設定する例
次の例では、2 つのプロジェクトがあります。
ネットワーク ホスト プロジェクト:
Project1
は VPC ネットワークdefault
をホストします。Project1
、VM1
、VM2
内の 2 つの VM は、このネットワークをネットワーク インターフェースとして使用し、トラフィックを送信します。Cloud Storage プロジェクト:
Project2
には Cloud Storage バケットが含まれています。
VPC Service Controls を使用すると、内部 IP アドレスを使用して、Project2
内の Cloud Storage バケットにアクセスするために、Project1
からの VM1
のみを許可できます。この設定を実現するには、次の手順を実行します。
Project1
の周囲にサービス境界sp1
を作成し、Project2
の周囲に別のサービス境界sp2
を作成します。次に、サービス境界に上り(内向き)ルールと下り(外向き)ルールを追加して、Cloud Storage バケットへの
VM1
のサブネット アクセスのみを許可できます。
次の図は、この例で説明する設定を示しています。
組織レベルでアクセス ポリシーを構成する
組織レベルのアクセス ポリシーがあることを確認します。このレベルにアクセス ポリシーがない場合は、次の gcloud CLI コマンドを実行します。
gcloud access-context-manager policies create \ --organization=ORGANIZATION_ID --title=POLICY_TITLE
以下のように置き換えます。
ORGANIZATION_ID: 組織の数値 ID。
POLICY_TITLE: 人が読める形式のアクセス ポリシーのタイトル。
詳細については、組織レベルのアクセス ポリシーを作成するをご覧ください。
このポリシーをデフォルト アクセス ポリシーとして設定するには、次の gcloud CLI コマンドを実行します。
gcloud config set access_context_manager/policy POLICY_NAME
POLICY_NAME は、アクセス ポリシーの数値名に置き換えます。
詳細については、
gcloud
コマンドライン ツールのデフォルトのアクセス ポリシーを設定するをご覧ください。
ネットワーク ホスト プロジェクトと Cloud Storage プロジェクトを保護する境界を作成する
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
)です。
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
のサブネットからのトラフィックのみを許可するアクセスレベルを作成します。
アクセス条件を定義する 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 ファイルをご覧ください。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 トラフィックが境界に入ることを許可します。
上り(内向き)ポリシーを定義する 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 ファイルの詳細については、上り(内向き)ルールのリファレンスをご覧ください。
サービス境界の上り(内向き)ポリシーを更新するには、次の 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 トラフィックが境界から出ることを許可します。
下り(外向き)ポリシーを定義する 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 ファイルの詳細については、下り(外向き)ルールのリファレンスをご覧ください。
サービス境界の下り(外向き)ポリシーを更新するには、次のコマンドを実行します。
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 アドレス範囲への送信トラフィックのみを許可するように、下り(外向き)ファイアウォール ルールを設定します。