G-gen の堂原です。本記事では Google Cloud (旧称 GCP) のセキュリティサービスである VPC Service Controls において、IP アドレスを許可したにも関わらずアクセスが弾かれるケースにおける見落としがちな原因について紹介します。
はじめに
VPC Service Controls は Google Cloud が提供しているセキュリティサービスです。 「サービス境界」と呼ばれる論理的な囲いを作成し、境界を跨ぐような API コールを制限します。
VPC Service Controls については、以下の記事で解説していますのでご参照ください。
VPC Service Controls においては、アクセスレベルを設定することで、特定の条件を満たす通信が境界の外から中にアクセスすることを許可することができます。 条件には IP アドレス範囲や地域を指定することが可能です。
事象 : IP アドレスを許可したはずがアクセス失敗
改めて、VPC Service Controls ではアクセスレベルを用いることで、特定の IP アドレス範囲から境界内へのアクセスを許可することができます。
そのためにはまずはアクセスレベルを作成し、その際に許可したい IP アドレスを設定します。
次に今しがた作成したアクセスレベルを設定したサービス境界を作成します。
以上の設定で、境界で指定したプロジェクト (上図では黒塗りしている部分に記載) の BigQuery には、アクセスレベルで許可した IP アドレスのみがアクセスできるはずです。
しかしアクセス元の通信環境次第では、アクセスレベルで IP アドレスを正しく許可したと思っても、アクセスが弾かれるケースがあります。その際以下のようなエラーメッセージが出力されますが、これだけでは「VPC Service Controls によってアクセスが拒否された」という事実しか分かりません。
VPC Service Controls: Request is prohibited by organization's policy. vpcServiceControlsUniqueIdentifier: xxx
原因 : IPv6 アドレスでアクセスしていた
もちろん、上記エラーメッセージだけだと単に IPv4 アドレス範囲の指定が誤っていたことが原因の場合もあります。
しかし、IPv4 アドレスの指定は正しいはずなのにアクセスが拒否される場合は、Google Cloud に IPv6 アドレスでアクセスしようとしていないかを確認していただきたいです。
VPC Service Controls の IP アドレス制限では、Web API の呼び出しに用いられた接続元 IP アドレスがチェックされるので、接続元 IP アドレスが IPv6 アドレスの場合はアクセスレベルでも IPv6 アドレスを許可する必要があります。
普段は VPC Service Controls や VPC Firewall など、IPv4 アドレスでの CIDR 指定に慣れていたことに加え、今回の作業元である自宅のインターネット回線が IPv6 対応の契約だったことを失念していたことから気が付きにくい事象でした。
確認方法
Cloud Logging を見ることで、どの IP アドレスでアクセスしようとしていたかを確認することができます。
ログエクスプローラにて、VPC Service Controls によって弾かれたアクセスのみを取得するクエリは以下の通りです。
resource.type="audited_resource" severity="ERROR"
ヒットしたログの protoPayload.requestMetadata.callerIp
にアクセス元の IP アドレスが記載されています。
具体的なアドレス値をマスクしているため見づらくはなっていますが、「: (コロン)」続きの形式となっていることから IPv6 アドレスでのアクセスであることがわかります。
解消方法
上記の通り、アクセスレベルで IPv6 アドレスを許可することでアクセス可能となります。
堂原 竜希(記事一覧)
クラウドソリューション部データアナリティクス課。2023年4月より、G-genにジョイン。
Google Cloud Partner Top Engineer 2023, 2024に選出 (2024年はRookie of the yearにも選出)。休みの日はだいたいゲームをしているか、時々自転車で遠出をしています。
Follow @ryu_dohara