VPC Service Controls の IP アドレス制限と Looker Studio

記事タイトルとURLをコピーする

G-gen の藤岡です。当記事では、Google Cloud(旧称 GCP)の BigQuery に特定の IP アドレスからのアクセスのみを許可する VPC Service Controls を設定しつつ、Looker Studio には IP アドレスの制限をかけずレポートを閲覧できるようにする方法を紹介します。

サービス・機能の概要

当記事で使用するサービスや機能の概要は以下の通りです。

VPC Service Controls

VPC Service Controls は Google Cloud のセキュリティ機能です。 境界 (Perimeter) と呼ばれる論理的な囲いを作り、その囲いの中のリソースへのアクセスを IP アドレスやサービスアカウント等に制限することができます。

詳細ついては以下の記事をご参照ください。

blog.g-gen.co.jp

Looker Studio

Looker Studio (旧称 データポータル)は Google Cloud が提供する BI ツールです。 Google スプレッドシートや BigQuery 等のデータソースからレポートを作成し、データの可視化をすることができます。

以下の記事で Looker Studio について触れていますので、ご参照ください。

blog.g-gen.co.jp

blog.g-gen.co.jp

Looker Studio のデータの認証情報には以下の3種類があります。

  • オーナーの認証情報
  • 閲覧者の認証情報
  • サービス アカウントの認証情報

後述しますが、当記事では「サービス アカウントの認証情報」を使用します。 なお、現在 サービス アカウントの認証情報はデータソースが BigQuery の場合にのみ使用できます

また、サービスアカウントの認証情報を利用するにあたり必要な Looker Studio サービス エージェントを取得するには、Workspace または Cloud Identity のユーザーである必要があります

参考:データの認証情報

Looker Studio サービス エージェントをサービスアカウントのプリンシパルに追加することで、サービスアカウントを使用して Looker Studio のレポートを閲覧および編集等ができるようになります。

参考:Looker Studio 用に Google Cloud サービス アカウントを設定する

Looker Studio サービス エージェントについては以下の記事でも触れていますので、ご参照ください。

blog.g-gen.co.jp

サービスアカウントの権限借用

Identity and Access Management (以下 IAM)には サービスアカウントの権限借用 という機能があります。本機能を使用することで、特定のサービスアカウントへの権限借用を許可されているプリンシパル(ユーザー等)は、そのサービスアカウントの権限を使用してリソースへアクセスすることができます。

参考:サービス アカウントの権限借用の管理

IAM の基本的な概念については以下の記事をご参照ください。

blog.g-gen.co.jp

VPC Service Controls と Looker Studio

それぞれのサービスや機能を確認したところで、当記事で紹介する内容について触れていきます。

Looker Studio のデータソースに BigQuery を使用した場合、BigQuery が VPC Service Controls の境界内にあると Looker Studio にも同様の制限がかかります

具体的には、BigQuery に特定の IP アドレスからのアクセスのみを許可する VPC Service Controls を設定した場合、Looker Studio にも同様の IP アドレスの制限がかかります。

理由は、Looker Studio のレポートの編集や保存、閲覧時に BigQuery に対するクエリが実行されるからです。

許可されていない IP アドレスから Looker Studio のレポートを閲覧すると以下のように Service Control のエラー と表示されます。

Looker Studio の VPC Service Controls のエラー画面

参考:Google BigQuery に接続する

実施内容

当記事では、以下の内容を実現するための方法を紹介します。

  • VPC Service Controls を設定することで、 BigQuery へのアクセスは特定の IP アドレスからのみに制限
  • Looker Studio のサービスアカウントの認証情報を設定することで、ユーザーは IP アドレスの制限なく Looker Studio のレポートの操作および閲覧が可能

構成図

以下の3パターンを順に設定および確認していきます。

なお今回は VPC Service Controls と Looker Studio に焦点を当てて紹介するため、他の部分の設定についての詳細は割愛します。

構成図(パターン1)

構成図(パターン2)

構成図(パターン3)

事前準備

Cloud Storage の設定

Cloud Storage(以下 GCS)でバケットの作成およびオブジェクトをアップロードします。

今回はオブジェクトに「sample-data.csv」としてランダムに生成された販売実績データの csv ファイルを使用しています。

GCS の画面

BigQuery の設定

BigQuery でデータセット「fujioka_dataset_01」を作成し、GCS の「sample-data.csv」をソースとするテーブル「table-01」を作成します。

BigQuery の画面

テーブルの中身は以下のようになっています。

テーブルの画面

Looker Studio でレポートの作成

Looker Studio にログインし、レポートを作成します。

Looker Studio レポート作成画面

データのレポートへの追加 で [BigQuery] を選択します。

データに接続

対象のプロジェクト、データセット、テーブルを選択します。

レポートへ BigQuery のテーブルを追加

円グラフを作成しました。

レポート画面

ここまでで、以下の構成が出来上がりました。

ここまでの構成

パターン1

VPC Service Controls の設定

Access Context Manager でアクセスレベルの作成をします。

今回はアクセスポリシーに default policy を使用するため、VPC Service Controls および Access Context Manager は組織レベルで設定をします。

コンソールで [セキュリティ] > [Access Context Manager] > [+ アクセスレベルを作成] を選択します。

Access Context Manager の画面

新しいアクセスレベル を以下のように設定します。

なお、この IP サブネットワークに プライベート IP 範囲を含めることはできません。

参考:アクセスレベルの属性

項目 設定値 備考
アクセスレベルのタイトル fujioka-home 任意の名前
IP サブネットワーク xxx.xxx.xxx.6/32 アクセスを許可する IPv4 または IPv6 を設定

アクセスレベル

次に [セキュリティ] > [VPC Service Controls] > [+ 新しい境界] を選択します。

VPC Service Controls の画面

新しい VPC サービス境界 を以下のように設定します。

① Details

項目 設定値 備考
境界のタイトル fujioka-vpcsc 任意の名前
境界のタイプ 標準境界(デフォルト)

① Details

② Projects

項目 設定値 備考
保護するプロジェクト fujioka 対象のプロジェクト

② Projects

③ Restricted Services

項目 設定値 備考
保護するサービス BigQuery API
Google Cloud Storage API
BigQuery と GCS を境界内に入れる

③ Restricted Services

④ VPC accessible services

[すべてのサービス] を選択します。

④ VPC accessible services

⑤ Access Levels

設定しないで進みます。

⑤ Access Levels

⑥ 内向きポリシー

今回は、GCP サービス / リソースの TO 属性 のメソッドを All methods にしていますが、Selected method にすることでより細かに操作を絞ることができます。

⑥ 内向きポリシー

⑦ 下り(外向き)ポリシー

設定しないで進みます。

⑦ 下り(外向き)ポリシー

確認

ここまでで、以下の構成が出来上がりました。

構成図(パターン1)

アクセスレベルで 許可されていない IP アドレスからレポートを見ると Service Control のエラー と表示されます。

エラー画面が表示されない場合は、ブラウザの更新やディメンションの変更等をお試しください。

Looker Studio の VPC Service Controls のエラー画面

パターン2

次に、BigQuery と GCS への IP アドレス制限はかけながら、 Looker Studio への IP アドレス制限をかけない ようにします。

サービスアカウントの作成

コンソールで [IAM と管理] > [サービスアカウント] > [+ サービスアカウントを作成] を選択します。

サービスアカウントを作成

任意の サービスアカウント名 および サービスアカウント ID を設定します。 今回は、looker-studio-sa@<プロジェクト ID>.iam.gserviceaccount.com というサービスアカウントを作成します。

サービスアカウントの作成①

ロールは BigQuery ジョブユーザー を設定します。

サービスアカウントの作成②

VPC Service Controls の設定

次に、パターン1で作成した fujioka-vpcsc の VPC Service Controls に新しく作成したサービスアカウントからのアクセスを許可する設定を入れます。

VPC Service Controls の画面

[境界を編集] を選択します。

境界を編集

⑥ 内向きポリシー で [ADD RULE] をし、以下の設定を追加します。

API クライアントの FROM 属性 の ユーザーアカウント / サービスアカウント に作成したサービスアカウント looker-studio-sa@<プロジェクト ID>.iam.gserviceaccount.com を選択します。

⑥ 内向きポリシー の画面

Looker Studio サービス エージェントにサービス アカウントへのアクセスを許可

Looker Studio サービス エージェントのヘルプページ で表示される Service Agent service-org-<組織 ID>@gcp-sa-datastudio.iam.gserviceaccount.com をコピーします。

Google アカウントでログインしていない場合はログインをしてから、再度ページを開いてください。

Looker Studio Service Agent の画面

コンソールから、作成したサービスアカウント looker-studio-sa@<プロジェクト ID>.iam.gserviceaccount.com に Looker Studio サービス エージェントのアクセスを許可する設定をします。

サービスアカウントの権限画面

Looker Studio サービス エージェントに iam.serviceAccount.getAccessToken 権限を付与するロールを選択します。今回は サービス アカウント トークン作成者 ロールを選択していますが、この権限を付与する任意のカスタムロールも使用できます。

項目 設定値 備考
新しいプリンシパル service-org-<組織 ID>@gcp-sa-datastudio.iam.gserviceaccount.com Looker Studio サービス エージェント
ロール サービス アカウント トークン作成者

アクセスの許可画面

ユーザーロールの付与

次に、作成したサービスアカウント looker-studio-sa@<プロジェクト ID>.iam.gserviceaccount.com の権限借用をするユーザーを設定します。

サービスアカウントの権限画面

データソース(BigQuery)を作成または編集する Looker Studio ユーザーに、iam.serviceAccounts.actAs 権限を含むロールを付与 します。今回は サービス アカウント ユーザー のロールを付与します。

なお、後述のパターン3のような Looker Studio のレポートの表示のみ行うユーザーには、サービス アカウントの権限は不要 です。

項目 設定値 備考
新しいプリンシパル fujioka@xxxx Google アカウント
ロール サービス アカウント ユーザー

アクセスの許可画面

BigQuery へのアクセスを許可

Looker Studio からサービスアカウントで BigQuery データへのアクセスを許可するには、テーブルまたはデータセットレベルでサービス アカウントに BigQuery データ閲覧者 のロールを付与します。 今回はテーブルレベルでロールを付与するため、今回の Looker Studio のレポートのソースであるテーブル table-01 に対して行います。

[BigQuery] > [fujioka_dataset_01] > [table-01] > [共有] を選択します。

テーブルへアクセス権付与

[プリンシパルを追加] を選択します。

プリンシパルを追加

項目 設定値 備考
新しいプリンシパル looker-studio-sa@<プロジェクト ID>.iam.gserviceaccount.com 作成したサービスアカウント
ロール BigQuery データ閲覧者

アクセスの許可画面

Looker Studio のデータの認証情報を更新

Looker Studio のレポート画面から [リソース] > [追加済みのデータソースの管理] を選択します。

Looker Studio のレポート画面

[編集] を選択します。

データソース

データの認証情報が現在は作成者になっているため、サービスアカウントに変更します。ユーザーアイコンを選択します。

データの認証情報

[サービスアカウント認証情報] にチェックを入れ、作成したサービスアカウント looker-studio-sa@<プロジェクト ID>.iam.gserviceaccount.com を入力します。

ここで [サービスアカウント認証情報] が選択肢にない場合は、Looker Studio のレポートを開き直してください。

データの認証情報を更新

データの認証情報が以下のようにサービスアカウントに変更されました。

データの認証情報

確認

ここまでで、以下の構成が出来上がりました。

構成図(パターン2)

パターン1では、アクセスレベルで 許可されていない IP アドレスからレポートを見ると Service Control のエラーと表示されていましたが、問題なく閲覧ができるようになりました。

Looker Studio のレポート画面

但し、構成図の通りアクセスレベルで 許可されていない IP アドレスから境界内の BigQuery や GCS は閲覧ができません。

BigQuery の閲覧不可(データセット表示されない)

GCS の閲覧不可

パターン3

最後のパターンは、Looker Studio のレポートを他のユーザーに共有した場合についてです。

Looker Studio でレポートの共有

レポートの画面から [共有] > [他のユーザーを招待] を選択します。

レポートの共有

今回は fujioka-dev ユーザーを 閲覧者 として共有しました。

ユーザーを追加

確認

共有されたユーザーで、アクセスレベルで 許可されていない IP アドレスからもレポートが閲覧できます。

Looker Studio のレポート画面

ここまでで、以下の構成が出来上がりました。

構成図(パターン3)

監査ログ

以下は、共有されたユーザーが xxx.xxx.xxx.57 の IP アドレスからレポートのコントロールプルダウン変更をした時の 監査ログ (Cloud Audit Logs)です。

protoPayload.requestMetadata.callerIp= は共有されたユーザーの IP アドレス xxx.xxx.xxx.57 です。

但し、protoPayload.authenticationInfo.principalEmail="looker-studio-sa@<プロジェクトID>.iam.gserviceaccount.com" となっており、実行はサービスアカウントがしていることが確認できます。

{
  "protoPayload": {
    "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
    "status": {},
    "authenticationInfo": {
      "principalEmail": "looker-studio-sa@<プロジェクトID>.iam.gserviceaccount.com"
    },
    "requestMetadata": {
      "callerIp": "xxx.xxx.xxx.57"
    },
    "serviceName": "bigquerybiengine.googleapis.com",
    "methodName": "ExecutionService.Query",
    "authorizationInfo": [
      {
        "resource": "projects/<プロジェクトID>/datasets/fujioka_dataset_01/tables/table-01",
        "permission": "bigquery.tables.getData",
        "granted": true
      }
    ],
    "resourceName": "projects/<プロジェクトID>/datasets/fujioka_dataset_01/tables/table-01",
    "request": {
      "@type": "type.googleapis.com/google.cloud.bi.v1.QueryRequest"
    }
  },
  "insertId": "fjx8nse21hx8",
  "resource": {
    "type": "audited_resource",
    "labels": {
      "project_id": "<プロジェクトID>",
      "method": "ExecutionService.Query",
      "service": "bigquerybiengine.googleapis.com"
    }
  },
〜省略〜
}

参考:AuditLog

Looker Studio のログイベント

監査ログでは閲覧元 IP アドレスはわかりますが、閲覧ユーザーは表示されません

閲覧ユーザーを確認したい場合は、Google Workspace 管理コンソール admin.google.com の Looker Studio のログイベント から確認できます。

管理コンソールの Looker Studio のログイベント画面

参考:Looker Studio のログイベント

以下の記事で Workspace レポートと監査ログについて触れていますので、ご参照ください。

blog.g-gen.co.jp

注意点

VPC Service Controls は Cloud Shell をサポートしていません 。Cloud Shell は境界外として扱われます。そのため、今回の構成で IP アドレスが許可されているアクセス元の Cloud Shell から以下のようなコマンドを実行したとしてもエラーになります。

fujioka@cloudshell:~ (fujiokaxxxx)$ bq ls
BigQuery error in ls operation: VPC Service Controls: Request is prohibited by organization's policy. vpcServiceControlsUniqueIdentifier: xxxxxx
fujioka@cloudshell:~ (fujiokaxxxx)$
fujioka@cloudshell:~ (fujiokaxxxx)$ gcloud storage ls
ERROR: (gcloud.storage.ls) HTTPError 403: Request is prohibited by organization's policy. vpcServiceControlsUniqueIdentifier: xxxxxx
fujioka@cloudshell:~ (fujiokaxxxx)$

エラー文

参考:Cloud Shell

藤岡 里美 (記事一覧)

クラウドソリューション部

数年前までチキン売ったりドレスショップで働いてました!2022年9月 G-gen にジョイン。ハイキューの映画を4回は見に行きたい。

Google Cloud All Certifications Engineer / Google Cloud Partner Top Engineer 2024