GCP VPC Service ControlsのIPアドレス制御検証

1. GCP VPC Service Controlsとは?

VPC Service Controlsによって、Cloud Storage バケット、BigQuery データセットなどの Google Cloud Platformリソースの周囲にセキュリティ境界を定義して、特定のプロジェクトのCloud Storage バケット、BigQuery データセットなどのGoogle Cloud Platformリソースの周囲にセキュリティ境界を定義して、プロジェクト内リソースへのアクセスを制限するサービスです。

VPC Service Controls 機能と後述する Access Context Managerと組み合わせて 利用することにより、特定のアカウントor特定の地域or特定のIPアドレスからのみ プロジェクトのリソースへのアクセスを許可することが出来るため、セキュリティの向上につながります。

詳細については以下の公式サイトに記載されております。

https://cloud.google.com/vpc-service-controls/docs/overview?hl=ja

2.検証内容

・Access Context Manager(※)を利用したIPアドレス制御

IPアドレスの制御以外にも「デバイス制御」、「リージョン制御」、「ユーザー制御」も設定で可能ですが、今回は Access Context Manager を利用したIPアドレスの制御を検証の対象としております。

[補足]Access Context Manager とは

VPC Service Controlsを設定しただけの場合、「セキュリティ境界を定義したプロジェクトのVPC」内でしか、リソースに対しての操作が出来ません。 そのためVPC外(コンソールやサーバ)から操作を出来るようにするため、「Access Context Manager=何を許可するかの設定ができるサービス」も併用して設定する必要があります。

2-0 前提条件

VPC Service Controls及びAccess Context Managerの設定については、以下の権限が必要となります。

・Access Context Manager 管理者(roles/accesscontextmanager.policyAdmin)
・Resource Manager 組織閲覧者(roles/resourcemanager.organizationViewer)

また、プロジェクトが組織配下のプロジェクトであることが条件であるため、権限と条件については全てクリアしているという状態で以下の検証を行っております。

2-1 アクセスに関するイメージ図

2-2 VPC Service Controls側の設定内容

※ 開示ができない箇所はマスキングしております。

2-3 VPC Service Controls側の設定説明

▼境界名

管理/運用しやすい任意の名前を入力します。

▼境界のタイプ

今回は1つのプロジェクトに対して境界を設定するため、「標準境界」を選択しました。
境界ブリッジは、2つの境界間の通信を許可する場合に利用する選択肢で今回は利用しておりません。

▼保護するプロジェクト

保護対象のプロジェクトを選択します。

▼保護するサービス

保護対象のサービスを選択します。
今回は、BigQueryとCloudStorageを対象としましたので、その2つのサービスを選択しました。
なお、BigQueryとCloudStorage以外にも保護できる対象のサービスとしては、現時点(2019/08/23)では以下のサービスがあります。

・ Cloud Key Management Service (KMS) API
・ GKE Connect API
・ GKE Hub API
・ Google Bigtable API
・ Google Cloud Data Catalog API
・ Google Cloud Dataflow API
・ Google Cloud Dataproc API
・ Google Cloud Pub/Sub API
・ Google Cloud Recommender API
・ Google Cloud Spanner API
・ Google Cloud Vision API
・ Google Container Registry API
・ Google Kubernetes Engine API
・ Stackdriver Logging API
・ Stackdriver Trace API

▼アクセスレベル

Access Context Managerで設定したアクセスレベルを選択します。

2-4 Access Context Manager 側の設定内容

※ 開示ができない箇所はマスキングしております。

2-5 Access Context Manager 側の設定内容の説明

▼アクセスレベルのタイトル

管理/運用しやすい任意の名前を入力します。

▼条件

今回の条件は許可したいIPアドレスを記載するだけで、条件は複数にはならないため、「OR ANDで結合」 の選択箇所はグレーアウトになっております。条件が満たされる場合に返される値にはTRUEを選択し、IPサブネットワーク欄に許可したい、IPアドレスをCIDRブロック表記で入力します。条件の箇所でFALSEを選択し、IPアドレスを選択すると、そのIPアドレス以外からのアクセスを許可することになります。

3. 検証結果

VPC Service ControlsとAccess Context Mangerを設定した結果、許可されていないIPアドレスからアクセスした場合、期待通りアクセス不可となりました。

3-1 マネジメントコンソールからのアクセス不可結果

Cloud Storageのコンソール画面ですが、設定後は「VPC Service Controlsによってアクセスが拒否されました。」と出力されるようになりました。

※ 開示ができない箇所はマスキングしております。

3-2 サーバからのアクセス不可結果

VPC Service Controls境界外で許可しているIPアドレスでないサーバから以下のコマンドを実行した際、アクセスが拒否されるメッセージが出力されるようになりました。

・gsutil lsコマンド(バケットの一覧を出力するコマンド)

・bq lsコマンド(データセットの一覧を出力するコマンド)

※ 開示ができない箇所はマスキングしております。

4.まとめと所感

検証に関しては、期待通りの結果を得ることが出来ました。

欲を言えば、特定のバケットや特定のデータセットレベルでアクセス制御が可能になればより良いのかなと感じました。この点については今後のアップデートに期待したいところです。

また、検証前はインバウンドに関するアクセスに関して拒否/許可が可能な機能という認識でおりましたが、検証を通して、アウトバウンドに関するアクセスも拒否/許可されるという点が分かりました。

つまり、VPC Service Controls境界内のデータへのアクセスは許可したIPアドレスからしかアクセスは出来ず、 更に境界外へデータをコピーすることも出来ないと言うことが分かりました。

今後も引き続きGCPのリソースに対してよりセキュアにアクセスが出来る機能を調査/検証を行い、次回の投稿につなげたいと思います。