VPC Service Controls に関する雑多な事項の整理
[履歴] [最終更新] (2021/12/12 16:16:05)
最近の投稿
注目の記事

概要

VPC Service Controls (VPC-SC) に関する雑多な事項を記載します。

Private Google Access の基本形

Private Google Access は外部 IP を持たない VM のための機能です。
VPC の機能ですが、VPC-SC と関連するため基本事項を記載します。

Uploaded Image

Private Google Access

Firewall Egress (Internet) 外部 IP Private Google Access Google API アクセス (Public IP) インターネットアクセス
Deny 有/無 ON/OFF X X
Allow ON O O
Allow OFF O O
Allow ON O X
Allow OFF X X

Firewall によって、Google API の Public IP への Egress 通信が許可されている必要があります。

設定箇所

Private Google Access は VPC 内の subnet 毎に有効化します。

Uploaded Image

アクセス先 Google API の IP について

外部IP を持たない VM であっても、Google API のパブリック IP にアクセスできます。

They can reach the external IP addresses of Google APIs and services.
Private Google Access

Google API の IP がパブリック IP であったとしても、ネットワーク経路としては Google ネットワーク内で閉じます。

These IP addresses are publicly routable, but the path from a VM in a VPC network to those addresses remains within Google's network
Configuring Private Google Access
Accessing APIs from VMs with external IP addresses

外部IP を持つ VM であっても、同様にネットワーク経路としては Google ネットワーク内で閉じます。

Though the connection is made from the VM's external IP address, the traffic stays within Google Cloud and is not sent through the public internet.
Accessing APIs from VMs with external IP addresses

インターネットアクセスのための条件

Private Google Access はインターネットアクセスと区別されます。

インターネットアクセスのための条件は以下のすべてを満たすことです。参考: Internet access requirements

  • VPC 内の default internet gateway へのルーティングが存在すること。
  • Firewall による Egress 通信が許可されていること。
  • 外部IP または Cloud NAT が利用できること。

gcloud コマンドが通信する Google API の確認

--log-http オプションを付与することで、具体的にどの Google API と通信しているかを確認できます。

インターネットへの egress 通信が Firewall で禁止されている VPC における Private Google Access

以下のような背景のもと、Public IP による Google API へのアクセスが困難である場合があります。

  • セキュリティ要件でインターネットへの Egress 通信を Firewall で禁止している。
  • Google API が利用する Public IP の範囲をすべて Firewall で許可するのは避けたい。

Google API のエンドポイントは、Google が保有する、Public IP でありながらもインターネットで利用されていない 8 つの IP によってアクセスできます。

Firewall Egress (Internet) Firewall Egress (restricted.googleapis.com) 外部 IP Private Google Access Google API アクセス (restricted.googleapis.com) インターネットアクセス
Deny Deny 有/無 ON/OFF X X
Deny Allow ON O X
Deny Allow OFF O X
Deny Allow ON O X
Deny Allow OFF X X
  • restricted.googleapis.com 199.36.153.4/30
    • VPC-SC でサポートする Google API に対してのみ有効です。
  • private.googleapis.com 199.36.153.8/30
    • 上表は restricted.googleapis.com に関するものですが、private.googleapis.com でも同様です。

DNS 設定

gcloud コマンド等の Google API クライアントが restricted.googleapis.com を利用するための DNS 設定を作成します。参考: DNS configuration

Uploaded Image

restricted.googleapis.com の A レコードはインターネット上の DNS でも引けます。ただし、今回 CNAME レコードのための googleapis.com ゾーンを作成することに伴い、インターネット上の googleapis.com ゾーンを利用できなくなるため、A レコードの作成も必要です。

DNS response policy

DNS private zone の代わりに、DNS response policy を利用することもできます。

For general use of VPC Service Controls, we recommend that you use Cloud DNS response policies to configure DNS for your VPC networks. When you use Cloud DNS, you don't need to create a managed private zone to configure DNS.
Configuring DNS

Uploaded Image

A レコード相当のルール

Uploaded Image

オンプレミスや AWS VPC からの Google API 利用

restricted.googleapis.com および private.googleapis.com は、オンプレミスや AWS VPC に存在する、インターネットアクセス経路を持たないサーバからの Google API アクセスのためにも利用できます。

199.36.153.4/30 および 199.36.153.8/30 の経路はインターネットに広報されていないため、オンプレミスや AWS VPC に対して、GCP に向くような経路情報を広報することが可能になります。

GCP VPC の設定となるため、GCP subnet に対する設定である Private Google Access の有効無効は関係しません。

Private Google Access for on-premises hosts

VPC Service Controls と Private Google Access の併用

VPC Service Controls (VPC-SC) に含まれるプロジェクトの VPC は Authorized VPC となります。Authorized VPC は Google API にアクセスした際に、VPC-SC に含まれるプロジェクトについて、VPC-SC で囲われているサービスを操作できます。

補足: VPC-SC に含まれていないプロジェクトに対してはアクセスできません。

username@instance-1:~$ gsutil cp gs://spls/gsp072/baby-names.zip .
AccessDeniedException: 403 Request is prohibited by organization's policy. vpcServiceControlsUniqueIdentifier: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Uploaded Image

Private Google Access with VPC Service Controls

以下のいずれの経路であってもアクセスできます。

  1. restricted.googleapis.com 199.36.153.4/30
  2. private.googleapis.com 199.36.153.8/30
  3. インターネットに経路情報が広報されている Public IP

実際の運用では VPC からインターネットへのアクセスは Firewall で制限していると考えられ、その場合「3」の経路は使えません。VPC-SC でサポートしていない Google API へのアクセスが要件として不要である場合は、「2」の経路である必要もありません。その場合、結果として「1」の経路を設定することになります。

「3」の場合に関する補足

Cloud DNS を利用できない等の理由で「1」または「2」を選択できない場合は「3」を利用することになります。

その場合に「3」以外のインターネットアクセスを禁止するためには、IP addresses for default domains で言及されている goog.json への egress 通信を明示的に Firewall で許可しつつ、他のインターネットへの egress 通信を禁止することになります。

その際に、「3」の IP であっても VPC-SC の制限の影響を受けることに注意します。VPC-SC 境界外のプロジェクトの API にアクセスするためには perimeter bridges または egress rule の設定が必要です。

ただし、「3」の場合は「2」の場合と同様に VPC-SC でサポートされていない Google API にもアクセスが可能であり、そのような Google API は VPC-SC の境界の影響を受けません。

例えば www.googleapis.com は VPC-SC でサポートされていない Google API です。以下のように「2」および「3」の場合は利用できてしまいます。

「1」の場合

myuser@instance-1:~$ tail -1 /etc/hosts
199.36.153.7 www.googleapis.com

curl -sS -XGET https://www.googleapis.com/gmail/v1/users/me/messages
Error 403 (Forbidden)!!1

「2」の場合

myuser@instance-1:~$ tail -1 /etc/hosts
199.36.153.8 www.googleapis.com

curl -sS -XGET https://www.googleapis.com/gmail/v1/users/me/messages
401 Login Required.

「3」の場合

myuser@instance-1:~$ tail -1 /etc/hosts
#199.36.153.8 www.googleapis.com

curl -sS -XGET https://www.googleapis.com/gmail/v1/users/me/messages
401 Login Required.

関連資料:

VPC Service Controls と Private Google Access と Private Service Connect の併用

2021/8/5 に GA となった Private Service Connect を利用すると、以下の「4」の選択肢によって、任意の IP で Google API にアクセスできるように設定できます。オンプレミスや AWS VPC からインターネットを経由せずに Google API を利用する際、従来は「1」または「2」を利用する必要がありましたが、「4」が選択可能になったことにより、199.36.153.4/30 および 199.36.153.8/30 に縛られることがなくなり、オンプレミスや AWS VPC における柔軟なルーティング設定が可能となります。

  1. restricted.googleapis.com 199.36.153.4/30
  2. private.googleapis.com 199.36.153.8/30
  3. インターネットに経路情報が広報されている Public IP
  4. Private Service Connect で設定した Endpoint IP

利用料金は 0.01 USD * 24 * 30 * 110 = 800円/月 程度です。

Private Service Connect は AWS PrivateLink に相当するサービスです。Google API だけでなく一般の SaaS に対してインターネット経由せずにアクセスする場合にも利用できます。例えば、こちらのページに記載の Snowflake は 2021/10/27 の記事で Private Service Connect に対応したことが発表されました。

参考資料:

Private Service Connect Endpoint へのアクセス経路

GCP VPC 内の VM から Private Service Connect Endpoint にアクセスする場合:

Uploaded Image

オンプレミスから Private Service Connect Endpoint にアクセスする場合:

Uploaded Image

Access Google APIS using Private Service Connect

Private Service Connect の設定例

API の有効化

事前に Cloud DNS API、Service Directory API を有効化する必要があります。有効化していない場合であっても Private Service Connect 自体は利用できますが、例えば p.googleapis.com の DNS ゾーンが自動作成されない原因となります。

Firewall 設定

Private Service Connect の Endpoint に設定する IP に対する egress 通信が許可されるように Firewall を設定する必要があります。

Private Google Access

Private Service Connect の利用時に Private Google Access は必須ではありません。GCP VPC 内の VM が External IP を持たない場合は、Private Google Access を subnet の設定で有効化する必要があります。VM が External IP を持つ場合は、Private Google Access が有効化されていない場合であっても Private Service Connect Endpoint にアクセスできます。External IP の有無、および Private Google Access の有効無効に関わらず、Google API への通信はインターネットを経由しません。

Private Service Connect Endpoint の作成

VPC で利用されていない任意の IP の割り当てます。

Uploaded Image

Private Service Connect Endpoint でサポートする target を選択します。VPC-SC と併用する場合は VPC-SC を選択します。最初の選択肢は private.googleapis.com に相当し、二番目の選択肢は restricted.googleapis.com に相当します。最後の選択肢は Snowflake 等の SaaS を利用する場合に選択します。

Uploaded Image

p.googleapis.com ゾーンが自動作成されます。

Uploaded Image

Private Service Connect Endpoint は Service Directory という枠組みに登録されます。

Uploaded Image

VM から Endpoint IP にアクセスできることを確認します。

username@instance-2:~$ curl -v 123.123.123.123/generate_204
* Expire in 0 ms for 6 (transfer 0x5590da276fb0)
*   Trying 123.123.123.123...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x5590da276fb0)
* Connected to 123.123.123.123 (123.123.123.123) port 80 (#0)
> GET /generate_204 HTTP/1.1
> Host: 123.123.123.123
> User-Agent: curl/7.64.0
> Accept: */*
> 
< HTTP/1.1 204 No Content
< Content-Length: 0
< Date: Sun, 12 Dec 2021 06:38:56 GMT
< 
* Connection #0 to host 123.123.123.123 left intact

Private Service Connect Endpoint の利用

自動作成された p.googleapis.com には以下のような A レコードが登録されています。

username@instance-2:~$ ping compute-mygoogleendpoint.p.googleapis.com
PING compute-mygoogleendpoint.p.googleapis.com (123.123.123.123) 56(84) bytes of data.

username@instance-2:~$ ping storage-mygoogleendpoint.p.googleapis.com
PING storage-mygoogleendpoint.p.googleapis.com (123.123.123.123) 56(84) bytes of data.

gcloud で利用する場合は以下のようにします。

gcloud config set api_endpoint_overrides/compute https://compute-mygoogleendpoint.p.googleapis.com/compute/v1/

p.googleapis.com を利用できない場合等は DNS で *.googleapis.com123.123.123.123 に向けます。

username@instance-2:~$ tail -1 /etc/hosts
123.123.123.123 compute.googleapis.com

動作検証

gcloud compute instances list --log-http

VPC-SC

Target に VPC-SC を選択した場合は、以下のように www.googleapis.com 等へのアクセスは不可となります。

username@instance-2:~$ tail -1 /etc/hosts
123.123.123.123 www.googleapis.com

curl -sS -XGET https://www.googleapis.com/gmail/v1/users/me/messages
Error 403 (Forbidden)!!1
関連ページ
    概要 こちらのページで基本的な使い方を把握した GCP の Data Loss Prevention (DLP) サービスを用いると、文章や画像の中に含まれる、電話番号や氏名および住所といった、個人を特定し得る情報 Personally Identifiable Information (PII) の検出を行えます。更に追加の設定によって、検出した情報を消したり他の文字列で置き換えたり、ハッシュ
    概要 こちらのページで基本的な使い方を把握した GCP DLP に相当する AWS サービスに Amazon Comprehend が存在します。GCP VPC 内から Public Internet を経由せずに利用する設定の例を記載します。 AWS VPC と GCP VPC の作成 クラウド 項目 値
    概要 GCP API を GCP の外から利用するためには、一般に Service Account を利用します。その際に Service Account の鍵ファイルを利用すると、鍵ファイルの流出によるリスクが発生します。Workload identity federation という機能を用いることで、鍵を用いない認証の仕組みを実現できます。
    概要 こちらのページでは role によるアクセス制御を記載しました。本ページではネットワーク関連の設定について記載します。 Network Policy によるアクセス元 IP 制限 IPv4 で指定します。IPv6 は 2021/9/21 時点では利用できません。 allowed list で許可されていない IP は block されます。
    概要 API を管理するためのプラットフォームである Apigee X について、基本的な使い方を記載します。Apigee は 2016 年に Google によって買収されており、Apigee Edge という名称で Google Cloud のサービスに加わりました。2021 年に Apigee X という名称の GCP-native なサービスが開始されました。