Google Cloud Platform のセキュリティサービス
Google Cloud Platform (以降、GCP )もだいぶ閉塞ネットワークのサービスが充実してきました。エンタープライズ向けクラウドサービスにはセキュリティは最重要で、Cloud VPN 、Cloud Interconnect、Private Google Access などセキュリティに対するサービスが既にありました。
~~最近まだBeta版(2019年1月3日時点)ですが、~~Google Cloud NEXT'19にてGAがアナウンスされましたVPC サービスコントロールというセキュリティサービスが利用できるようになりました。この VPC サービスコントロールがどのようなサービスかを試してみました。
VPC サービスコントロールとは
公式ドキュメントには、
VPCサービスコントロールを使用すると、Cloud Storageバケット、Bigtableインスタンス、BigQueryデータセットなどのGoogle Cloud Platformリソースの周囲にセキュリティ境界を定義して、VPC内のデータを制限し、データ漏洩のリスクを軽減できます。VPCサービスコントロールを使用すると、企業はGoogle Cloud Platformの完全に管理されたストレージおよびデータ処理機能を利用するため、機密データを非公開にすることができます。
と書いてあります。Google Cloud Storage や BigQuery は、グローバルサービスですので、通常のセキュリティ制御は、Cloud IAM 、それぞれのサービスのACL を使用し、役割(権限)で制御します。VPCサービスコントロールは公式ドキュメントの説明から、ユーザーが使用しているグローバルサービスの領域を閉塞域にすることができて、セキュリティが格段に上がるようです。
このVPC サービスコントロールを実際に設定し検証してみました。
本記事の前提読者
本記事の前提読者は以下のように考えています。
- クラウドサービスで環境構築したことがある。
- GCP で環境構築したことがある。
詳細を説明していないところが多々ありますが、ご容赦ください。
VPC サービスコントロールの条件
VPC サービスコントロールを使用するのに、以下の条件がありますので注意です。
- 組織のユーザーであること
- VPC サービスコントロール使用に必要な権限を持っているユーザーであること
- アクセスコンテキストマネージャエディタ以上の役割
- 組織閲覧者以上の役割
組織のユーザーですので、G Suite 、または Cloud Identity のユーザーであることが必須です。そして、組織に対する役割を持つ必要があります。
公式ドキュメントには、アクセスコンテキストマネージャリーダーの役割も含まれていますが、VPC サービスコントロールの設定はできません。画面を閲覧できるだけです。
VPC サービスコントロールの保護対象サービス
VPC サービスコントロールは、現状は以下の GCP サービスが保護対象です。
- Cloud BigTable
- Cloud Storage (以降、GCS)
- BigQuery
- Cloud Pub/Sub
- Cloud Dataproc
- Stackdriver Logging
alpha版としては以下のサービスが対象です。
- Container Registry
- Cloud Key Management Service
- Cloud Spanner
VPC サービスコントロールの料金
料金は無料です。
VPC サービスコントロール の設定
では、VPC サービスコントロールを設定と検証の設定をしていきます。
限定公開の Google アクセスON の VPC を作成する
限定公開の Google アクセスというと日本語がよくわかりませんが、PrivateIP Google Access という意味らしく、内部IPアドレスで GCP のグローバルサービスにアクセスできるという意味らしいです。本記事では Private Google Access と記述します。
先に Private Google Access の VPC を作成します。Subnet 作成時に限定公開の google アクセス をONにします。
Google Compute Engine を作成する
検証するための Google Compute Engine (以降、GCE) を作成します。
先ほどのPrivate Google Access の VPC 上に作成し、外部IPアドレスは外します。外部IPアドレスを外す前に、SSHでログインし、シリアルコンソール接続で入れるようにrootのパスワードを設定します。
GCS のバケットを作成する
ここでは、検証するための GCS バケットを先に作成しておきます。
バケット名は vsc-bucket 、Regionalバケット(東京リージョン)としました。
アクセスログとストレージログ を参照し、audit-logの出力設定をしておきます。ここで設定したログバケット名は、vsc-logs-bucketとしました。
BigQuery のデータセット、テーブルを作成する
検証するための BigQuery データセットとテーブルを先に作成しておきます。
データセット名を vsc_ds として、東京リージョンに作成、テーブル名を table1 として作成しました。
新しい境界を作成する
いよいよ、VPC サービスコントロールを設定します。VPC サービスコントロールの画面は、ナビゲーションメニューからセキュリティのVPC サービスの管理をクリックします。このとき、プロジェクトの選択は組織を選択します。
そして、上の新しい境界をクリックします。
- 境界名に保護する境界の名称を設定します。
- 境界のタイプはデフォルトを設定します。
- 保護するプロジェクトに対象となるプロジェクトを設定します。今回は vpc-test というプロジェクトを設定しました。
- 保護するサービスに保護したいサービスを設定します。今回は BigQuery と GCS を設定しました。
そして保存ボタンをクリックし、新しい境界の設定を保存します。
GCS の画面をみると
GCS の画面を見ると、**「VPC Service Controls によってアクセスが拒否されました。」**と表示され、ブラウザが表示されません。当たり前ですが、GCP コンソールはグローバルからのアクセスとなりますので、Private になった GCS のバケットは閲覧できなくなります。
BigQuery の画面をみると
BigQuery の画面を見ても、GCS の画面と同じように**「VPC Service Controls: Request is prohibited by organization's policy.・・・」**と表示され、閲覧できませんし、データセットの作成ができません。
GCS の操作検証
VPC サービスコントロールで Private 領域となった GCS を操作してみます。
Cloud Shell から操作(外側からのアクセス)
アクセスできないとは思いますが、Cloud Shell から操作してみます。gsutil ls コマンドでバケット一覧を表示します。
aquiq@cloudshell:~ (vpc-test-221614)$ gsutil ls
AccessDeniedException: 403 Request violates VPC Service Controls.
VPC サービスコントロールでアクセスできません。「まあ、そりゃそうだ」の結果です。
限定公開の Google アクセス VPC 上の GCE から操作
先に作成しておいたPrivate Google Access の VPC上の GCE から操作します。
外部IPアドレスはありませんので、シリアルコンソールからルートでログインします。(実際は別のユーザー作成推奨)※シリアルコンソール接続は何気にすごいです。
gsutil ls コマンドでバケット一覧を表示します。
[root@instance-1 ~]# gsutil ls
gs://vsc-bucket/
gs://vsc-logs-bucket/
Private Google Access の VPC 上の GCE からは、作成していたバケットが表示されました。
ちなみに、GCE に外部IPアドレスが設定されていても問題なく、SSH で接続して gsutil ls コマンドの結果を取得できました。
API から操作
次に、API で操作してみます。VPC サービスコントロールで Private な状態ではどうなるのか興味深いです。
今回は単純に、バケットの情報を取得します。
※アクセストークン取得等APIの操作につきましては、偉大なる先人達の記事等ご参照ください。
Cloud Shell から実行(外側からアクセス)
以下のコマンドを実行しました。
curl -H "Authorization: Bearer {アクセストークン}" https://www.googleapis.com/storage/v1/b/vsc-bucket
結果は以下の通り、VPC サービスコントロールが効いて取得できませんでした。
{
"error": {
"errors": [
{
"domain": "global",
"reason": "vpcServiceControls",
"message": "Request violates VPC Service Controls."
}
],
"code": 403,
"message": "Request violates VPC Service Controls."
}
}
限定公開の Google アクセス VPC 上の GCE から操作
同じコマンドを GCE のシリアルコンソール接続から実行し、結果は以下のように正常に取得できました。
{
"kind": "storage#bucket",
"id": "vsc-bucket",
"selfLink": "https://www.googleapis.com/storage/v1/b/vsc-bucket",
"projectNumber": "939212211709",
"name": "vsc-bucket",
"timeCreated": "2019-01-03T06:51:34.749Z",
"updated": "2019-01-03T09:59:43.103Z",
"metageneration": "3",
"iamConfiguration": {
"bucketPolicyOnly": {
"enabled": false
}
},
"location": "ASIA-NORTHEAST1",
"logging": {
"logBucket": "vsc-logs-bucket",
"logObjectPrefix": "vsc-bucket"
},
"storageClass": "REGIONAL",
"etag": "CAM="
}
Private Google Access のVPC 内からは通常と同じ呼び方でAPIは操作できるということですね。
ちなみに、GCE に外部IPアドレスが設定されていても問題なく、SSH で接続して APIの結果を取得できました。
Cloud Functions からの選択
Cloud Functions は、GCS のバケットの状態をトリガーとすることができます。VPC サービスコントロールの GCS は選択できるか確認しました。
予想していたと思いますが無理でした。
VPC サービスコントロール 本記事のまとめ
本記事で VPC サービスコントロールを検証した結果、わかったことのまとめです。
- VPC サービスコントロールで保護したサービスは、外部から保護されるため、 GCP コンソールからの操作が不可能となる。
- gsutil コマンド、APIは Private Google Access の VPC内から通常通り実行可能である。
- VPC の Private Google Access の On/Off は関係なく、内部IPアドレスから VPC サービスコントロールで保護したサービスにはアクセス可能である。
- Cloud Functions では、VPC サービスコントロールで保護した GCS のバケットをトリガーとすることができない。そもそも、現状はVPC サービスコントロールの対象サービスではない。
終わりに
Private Google Access や VPC サービスコントロールを使用することで、エンタープライズで重要課題となるセキュリティ面はクリアされ、今後益々 GCP の活用を期待できます。
VPC サービスコントロールを触ってみる前は、セキュアな閉塞ネットワークを作成することができるという思いしかありませんでした。検証してみて、VPC サービスコントロールで保護したサービスでは、GCP コンソールが使用できないのはネックであると思いましたが、機密情報が保存された、例えば GCS の Coldline だけ別プロジェクトにして、外部から完全に保護するといった使用方法もありだと思いました。
前述しましたが、VPC サービスコントロールで保護されたサービスの操作は GCP コンソールを使用できず、使い勝手が悪くなる点が課題であると考えます。効率良いサービス構築手順を考える必要があると考えます。
(Google Cloud 様、なんとかご対応をよろしくお願いいたします。)
Access Context Manager のアクセスレベルの設定でGCPコンソールの使用は可能です。ごめんなさい。
アップデート
記事を追記します。
対象サービス
2019年11月現在の対象サービスは(α、βも含め)以下の26サービスになっています。
GCP コンソールのアクセス
Access Context Manager でIPアドレスを制御して、VPC サービスコントロールの対象にしたサービスの GCP コンソールにアクセスできます。
GCP コンソールの BigQuery を開く(Access Context Manager 設定前)
VPC サービスコントロールを設定しているのでエラーとなります。
Access Context Manager の設定
Access Context Manager に許可するIP アドレスを設定します。
Access Context Manager のアクセスレベルを紐付け
VPC サービスコントロールにAccess Context Manager のアクセスレベルを紐付けます。
BigQuery のGCP コンソールの BigQuery を開く(Access Context Manager 設定後)
Access Context ManagerでIPアドレスを許可したので、クエリ実行が可能となりました。