VPC Service Controls (VPC-SC) に関する雑多な事項を記載します。
Private Google Access は外部 IP を持たない VM のための機能です。
VPC の機能ですが、VPC-SC と関連するため基本事項を記載します。
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 毎に有効化します。
外部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
--log-http
オプションを付与することで、具体的にどの Google API と通信しているかを確認できます。
以下のような背景のもと、Public IP による Google API へのアクセスが困難である場合があります。
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 |
gcloud コマンド等の Google API クライアントが restricted.googleapis.com を利用するための DNS 設定を作成します。参考: DNS configuration
restricted.googleapis.com の A レコードはインターネット上の DNS でも引けます。ただし、今回 CNAME レコードのための googleapis.com ゾーンを作成することに伴い、インターネット上の googleapis.com ゾーンを利用できなくなるため、A レコードの作成も必要です。
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
A レコード相当のルール
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 (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
Private Google Access with VPC Service Controls
以下のいずれの経路であってもアクセスできます。
実際の運用では VPC からインターネットへのアクセスは Firewall で制限していると考えられ、その場合「3」の経路は使えません。VPC-SC でサポートしていない Google API へのアクセスが要件として不要である場合は、「2」の経路である必要もありません。その場合、結果として「1」の経路を設定することになります。
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.
関連資料:
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 における柔軟なルーティング設定が可能となります。
利用料金は 0.01 USD * 24 * 30 * 110 = 800円/月 程度です。
Private Service Connect は AWS PrivateLink に相当するサービスです。Google API だけでなく一般の SaaS に対してインターネット経由せずにアクセスする場合にも利用できます。例えば、こちらのページに記載の Snowflake は 2021/10/27 の記事で Private Service Connect に対応したことが発表されました。
参考資料:
GCP VPC 内の VM から Private Service Connect Endpoint にアクセスする場合:
オンプレミスから Private Service Connect Endpoint にアクセスする場合:
Access Google APIS using Private Service Connect
事前に Cloud DNS API、Service Directory API を有効化する必要があります。有効化していない場合であっても Private Service Connect 自体は利用できますが、例えば p.googleapis.com
の DNS ゾーンが自動作成されない原因となります。
Private Service Connect の Endpoint に設定する IP に対する egress 通信が許可されるように Firewall を設定する必要があります。
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 への通信はインターネットを経由しません。
VPC で利用されていない任意の IP の割り当てます。
Private Service Connect Endpoint でサポートする target を選択します。VPC-SC と併用する場合は VPC-SC を選択します。最初の選択肢は private.googleapis.com
に相当し、二番目の選択肢は restricted.googleapis.com
に相当します。最後の選択肢は Snowflake 等の SaaS を利用する場合に選択します。
p.googleapis.com
ゾーンが自動作成されます。
Private Service Connect Endpoint は Service Directory という枠組みに登録されます。
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
自動作成された 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.com
を 123.123.123.123
に向けます。
username@instance-2:~$ tail -1 /etc/hosts
123.123.123.123 compute.googleapis.com
動作検証
gcloud compute instances list --log-http
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