G-genの杉村です。本投稿では、 Google Cloud (GCP) のセキュリティ系サービスの中でも特に重要な VPC Service Controls の概念について分かりやすく解説していこうと思います。
VPC Service Controls とは
VPC Service Controls は Google Cloud(旧称 GCP)のセキュリティ機能です。
「境界 (perimeter) 」と呼ばれる論理的な囲いを作り、その囲いの外から中へのデータ等へのアクセスを防いだり、逆に囲いの中から外へのデータ流出等を防ぐことができます。
しかしながら VPC Service Controls には「できること」と「そうでないこと」があり、当機能だけを使えば Google Cloud のセキュリティが万全になるという訳ではありません。
当記事ではこの「境界(囲い)」とは何を示しているのか、どのような仕組みでデータの流出等を防いでいるのか、について記載します。
VPC Service Controls って結局何ができるの?
できること
できることは Google Cloud サービスに対する API コールの接続元を制限することです。
API コールとはそもそも何か?は次に説明します。
[ できることの例 ]
- BigQuery に対するクエリ のアクセス元を制限
- Cloud Storage からのオブジェクトの読み取り のアクセス元を制限
- GKE クラスターの設定変更 のアクセス元を制限
できないこと
VPCへのネットワーク的なアクセスを制限する ことはできません。
それは VPC ファイアウォール や WAF といった仕組みの仕事です。
[ できないことの例 ]
- VM への SSH ログインの接続元を制限
- Webサイトの管理画面からのデータの持ち出しを制限
- Web アプリへの攻撃を防御
API コールとは?
さて Google Cloud における "API コール" とはなんでしょうか。
以下の記事で図を使って解説しています。「API コールとは?」の欄をご参照ください。
簡略化した図のみを再掲します。

例えば Google Cloud をコンソール画面から操作したときでも その裏では Web ブラウザから Web API を呼んでいる ということになります。
この Web API はインターネットに公開されていますが、誰でも API を叩けるわけではなく、認証・認可に Google アカウントや IAM が使われています。
一方で、以下のようなアクセスは Web API とは関係ありません。
- VM への SSH アクセス
- VM でホストされた Web サイトへの HTTP(S) アクセス
これらは VPC の機能により、接続元から VPC 内の各リソースに TCP/IP 的にリーチしています。
この違いが、先述の "VPC Service Controls でできること/できないこと" の差に繋がって います。
構成例と仕様
想定構成図
以下の構成を例にとって、 VPC Service Controls でできることを説明していきます。

境界の定義
VPC Service Controls では 境界 (Perimiter) というものを定義することで、境界外からの API コールを拒否することができます。
境界には 任意のプロジェクトの任意の Google サービス を入れることができます。
※対象にできる Google サービスの 一覧はこちら です
新しい境界を作成する際、どのプロジェクトのどの Google サービスを境界に入れるかを選択します。
例えば "対象プロジェクトは XXX プロジェクト" で "対象サービスは BigQuery と Cloud Storage" のように設定できます。
このように設定すれば、 XXXプロジェクトの BigQuery と Cloud Storage は お互いに API コールをすることができ ます。
例えば BigQuery は Cloud Storage からデータをロードすることができます。

一方で、 別のプロジェクトにある BigQuery から のアクセスは弾かれます。
YYY プロジェクトの BigQuery からは XXX プロジェクトの Cloud Storage のオブジェクトをロードできません。
境界の外から中への API コールだからですね (もちろん、逆もしかりです) 。
境界の外からのアクセス / 境界の中から外へのアクセス
しかしこれでは、正規のユーザが自分のオフィスや自宅から BigQuery にアクセスしようとしても 拒否されてしまう ことになります。
ここで登場するのが 内向きポリシー (Ingress rules) です。
内向きルールで定義した条件に合致した場合は、境界外からの API コールでも許可されます。

このときの許可条件を定義した設定を アクセスレベル といいます。
アクセスレベルには例えば 特定の IP アドレスからのアクセスであれば許可 、などと設定することができます。

有償の BeyondCorp Enterprise ライセンスを購入すれば、デバイスにインストールされた MDM から収集される情報をもとにしたデバイスポリシーを条件とすることもできます。
逆に、境界内のサービスから外のサービスへの API コールをする必要がある場合は 外向きポリシー (Egress rules) を作成します。
さらに別の境界へのアクセスが必要な場合には 境界ブリッジ を作成します。
いずれも応用となるため、本投稿では深くは扱わないでおきます。
VPC 内からのアクセス
VPC の VM 等から境界内サービスへの API コールも必要になるでしょう。
例えば、 VM インスタンス上のアプリから Cloud Storage へデータをアップロードする、などです。

これは、以下の両方が満たされた場合に可能になります。
- 境界内のプロジェクト に所属する VPC からの接続であること
- VPC のアクセス可能なサービス (VPC accessible services) という設定値でサービスが許可されていること
VPC のアクセス可能なサービス (VPC accessible services) の設定は以下から選択することができます。
No | 名称 | 意味 |
---|---|---|
1 | すべてのサービス | 境界内か境界外かに関わらずすべてのサービスにアクセスできる。 |
2 | サービスなし | どの Google サービスにもアクセスできない。 |
3 | すべての制限付きサービス | 境界内のサービスにだけアクセスできる。 |
4 | 選択したサービス | アクセス可能な境界内サービスを明示的に選択する。 |

少し難しいですね。
例えば、境界として XXX プロジェクトの Cloud Storage だけ が選択されているとします。
このとき、XXX プロジェクトの VPC 内の VM から Google サービスへの API コールの成否は以下のようになります。
設定値が "すべてのサービス" の場合
VM からは、境界内か境界外かに関わらずすべてのサービスにアクセスできます。
No | 接続先サービス | APIコール成否 |
---|---|---|
1 | Cloud Storage | OK |
2 | BigQuery | OK |
設定値が "サービスなし" の場合
VM からは、境界に関係なくどの Google サービスにもアクセスできません。
No | 接続先サービス | APIコール成否 |
---|---|---|
1 | Cloud Storage | NG |
2 | BigQuery | NG |
設定値が "すべての制限付きサービス" の場合
VM からは、境界内として指定したサービスにだけアクセスできます。
No | 接続先サービス | APIコール成否 |
---|---|---|
1 | Cloud Storage | OK |
2 | BigQuery | NG |
設定値が "すべての制限付きサービス" の場合
明示的に選択したサービスへの API コールだけが成功します。
オンプレミスからのアクセス
前述の 内向きルール で定義すればオンプレミスサイトから接続元 IP を固定したうえで、 インターネット経由 で、境界内サービスへアクセスすることができます。
しかし VPC と オンプレミスサイトが VPN や Cloud Interconnect で接続している場合に、 プライベートネットワークの経路でアクセスしたい ときはどうすればいいでしょうか。
VPN や Cloud Interconnect 経由でVPC の 限定公開の Google アクセス の仮想 IP 経由でアクセスすれば、オンプレミスから境界内のサービスへプライベートアクセスすることができます。
※ なお前述の VPC 内からのアクセスの条件も満たしている必要があります。

限定公開の Google アクセス経由 とは、 VPC 内から Google の内部ネットワーク経由でかつ プライベート IP による接続で Google サービスの API へアクセスできる仕組みのことです。
以下の記事で紹介していますので、ご参照ください。
境界内の VPC を経由してアクセスさせる、ということになります。
なおオンプレミスから限定公開の Google アクセス経由で API コールをする際に、クライアント側から利用する API エンドポイントとして restricted.googleapis.com
を使わせることで VPC Service Controls の サポート対象外のサービスに対するアクセスを弾く ことができます。
逆にこのドメイン名を使わないと VPC Service Controls サポート対象外のサービスへのアクセスが可能になってしまい、統制に漏れが出てしまうかもしれません。
※ なおこの知見は認定試験である Professional Cloud Network Engineer などでも頻出です。
ユースケース
さて、これで VPC Service Controls の基本は押さえられたと思います。 最後に VPC Service Controls のユースケースをいくつか列挙します。
- Cloud Storage に工場の計測データを保存している。プロジェクトに境界を設定し、 社内の拠点の固定 IP からのみアクセスできるように内向きポリシーを設定 する
- BigQuery に個人情報を含むアプリの利用者データを保存している。この BigQuery には VPC 内の VM にホストした BI ツール以外からアクセスされることはないため、 プロジェクトに境界を設定し、内向きポリシーは設定しない
- 別のプロジェクトにある BigQuery に入っている機密データの一部をこちらのプロジェクトの BigQuery テーブルに持ってくる。アクセス要件が違うため、2つのプロジェクトで別々の境界を作成。 2つの境界を境界ブリッジで接続する
ドライラン構成
既に稼働中の環境に新しく VPC Service Controls を設定するときや、境界の設定に手を加えるときなどに、いきなり設定変更を適用すると予期せぬ不具合が発生しえます。
境界には現行構成に加えて、 ドライラン 構成を設定できます。
ドライランで設定された境界に違反すると、 Cloud Logging にログ記録のみがされます。
WAF 製品などにも同じような機能がありますね。
これを事前に設定しておくことで、設定変更やどんな影響を与えるのかを見極めてから実適用をすることができます。

このように、本番環境での運用も意識しながら VPC Service Controls を使いこなしていきましょう。
杉村 勇馬 (記事一覧)
執行役員 CTO / クラウドソリューション部 部長
元警察官という経歴を持つ現 IT エンジニア。クラウド管理・運用やネットワークに知見。AWS 12資格、Google Cloud認定資格11資格。X (旧 Twitter) では Google Cloud や AWS のアップデート情報をつぶやいています。
Follow @y_sugi_it