G-gen の藤岡です。当記事では、Google Cloud(旧称 GCP)の BigQuery に特定の IP アドレスからのアクセスのみを許可する VPC Service Controls を設定しつつ、Looker Studio には IP アドレスの制限をかけずレポートを閲覧できるようにする方法を紹介します。
サービス・機能の概要
当記事で使用するサービスや機能の概要は以下の通りです。
VPC Service Controls
VPC Service Controls は Google Cloud のセキュリティ機能です。 境界 (Perimeter) と呼ばれる論理的な囲いを作り、その囲いの中のリソースへのアクセスを IP アドレスやサービスアカウント等に制限することができます。
詳細ついては以下の記事をご参照ください。
Looker Studio
Looker Studio (旧称 データポータル)は Google Cloud が提供する BI ツールです。 Google スプレッドシートや BigQuery 等のデータソースからレポートを作成し、データの可視化をすることができます。
以下の記事で Looker Studio について触れていますので、ご参照ください。
Looker Studio のデータの認証情報には以下の3種類があります。
- オーナーの認証情報
- 閲覧者の認証情報
- サービス アカウントの認証情報
後述しますが、当記事では「サービス アカウントの認証情報」を使用します。 なお、現在 サービス アカウントの認証情報はデータソースが BigQuery の場合にのみ使用できます 。
また、サービスアカウントの認証情報を利用するにあたり必要な Looker Studio サービス エージェントを取得するには、Workspace または Cloud Identity のユーザーである必要があります 。
参考:データの認証情報
Looker Studio サービス エージェントをサービスアカウントのプリンシパルに追加することで、サービスアカウントを使用して Looker Studio のレポートを閲覧および編集等ができるようになります。
参考:Looker Studio 用に Google Cloud サービス アカウントを設定する
Looker Studio サービス エージェントについては以下の記事でも触れていますので、ご参照ください。
サービスアカウントの権限借用
Identity and Access Management (以下 IAM)には サービスアカウントの権限借用 という機能があります。本機能を使用することで、特定のサービスアカウントへの権限借用を許可されているプリンシパル(ユーザー等)は、そのサービスアカウントの権限を使用してリソースへアクセスすることができます。
IAM の基本的な概念については以下の記事をご参照ください。
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 のエラー
と表示されます。
実施内容
当記事では、以下の内容を実現するための方法を紹介します。
- VPC Service Controls を設定することで、 BigQuery へのアクセスは特定の IP アドレスからのみに制限
- Looker Studio のサービスアカウントの認証情報を設定することで、ユーザーは IP アドレスの制限なく Looker Studio のレポートの操作および閲覧が可能
構成図
以下の3パターンを順に設定および確認していきます。
なお今回は VPC Service Controls と Looker Studio に焦点を当てて紹介するため、他の部分の設定についての詳細は割愛します。
事前準備
Cloud Storage の設定
Cloud Storage(以下 GCS)でバケットの作成およびオブジェクトをアップロードします。
今回はオブジェクトに「sample-data.csv」としてランダムに生成された販売実績データの csv ファイルを使用しています。
BigQuery の設定
BigQuery でデータセット「fujioka_dataset_01」を作成し、GCS の「sample-data.csv」をソースとするテーブル「table-01」を作成します。
テーブルの中身は以下のようになっています。
Looker Studio でレポートの作成
Looker Studio にログインし、レポートを作成します。
データのレポートへの追加 で [BigQuery] を選択します。
対象のプロジェクト、データセット、テーブルを選択します。
円グラフを作成しました。
ここまでで、以下の構成が出来上がりました。
パターン1
VPC Service Controls の設定
Access Context Manager でアクセスレベルの作成をします。
今回はアクセスポリシーに default policy
を使用するため、VPC Service Controls および Access Context Manager は組織レベルで設定をします。
コンソールで [セキュリティ] > [Access Context Manager] > [+ アクセスレベルを作成] を選択します。
新しいアクセスレベル を以下のように設定します。
なお、この IP サブネットワークに プライベート IP 範囲を含めることはできません。
参考:アクセスレベルの属性
項目 | 設定値 | 備考 |
---|---|---|
アクセスレベルのタイトル | fujioka-home |
任意の名前 |
IP サブネットワーク | xxx.xxx.xxx.6/32 |
アクセスを許可する IPv4 または IPv6 を設定 |
次に [セキュリティ] > [VPC Service Controls] > [+ 新しい境界] を選択します。
新しい VPC サービス境界 を以下のように設定します。
① Details
項目 | 設定値 | 備考 |
---|---|---|
境界のタイトル | fujioka-vpcsc |
任意の名前 |
境界のタイプ | 標準境界(デフォルト) |
② Projects
項目 | 設定値 | 備考 |
---|---|---|
保護するプロジェクト | fujioka |
対象のプロジェクト |
③ Restricted Services
項目 | 設定値 | 備考 |
---|---|---|
保護するサービス | BigQuery API Google Cloud Storage API |
BigQuery と GCS を境界内に入れる |
④ VPC accessible services
[すべてのサービス] を選択します。
⑤ Access Levels
設定しないで進みます。
⑥ 内向きポリシー
今回は、GCP サービス / リソースの TO 属性 のメソッドを All methods
にしていますが、Selected method
にすることでより細かに操作を絞ることができます。
⑦ 下り(外向き)ポリシー
設定しないで進みます。
確認
ここまでで、以下の構成が出来上がりました。
アクセスレベルで 許可されていない IP アドレスからレポートを見ると Service Control のエラー
と表示されます。
エラー画面が表示されない場合は、ブラウザの更新やディメンションの変更等をお試しください。
パターン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 に新しく作成したサービスアカウントからのアクセスを許可する設定を入れます。
[境界を編集] を選択します。
⑥ 内向きポリシー で [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-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-sa@<プロジェクト ID>.iam.gserviceaccount.com
を入力します。
ここで [サービスアカウント認証情報] が選択肢にない場合は、Looker Studio のレポートを開き直してください。
データの認証情報が以下のようにサービスアカウントに変更されました。
確認
ここまでで、以下の構成が出来上がりました。
パターン1では、アクセスレベルで 許可されていない IP アドレスからレポートを見ると Service Control のエラー
と表示されていましたが、問題なく閲覧ができるようになりました。
但し、構成図の通りアクセスレベルで 許可されていない IP アドレスから境界内の BigQuery や GCS は閲覧ができません。
パターン3
最後のパターンは、Looker Studio のレポートを他のユーザーに共有した場合についてです。
Looker Studio でレポートの共有
レポートの画面から [共有] > [他のユーザーを招待] を選択します。
今回は fujioka-dev
ユーザーを 閲覧者
として共有しました。
確認
共有されたユーザーで、アクセスレベルで 許可されていない IP アドレスからもレポートが閲覧できます。
ここまでで、以下の構成が出来上がりました。
監査ログ
以下は、共有されたユーザーが 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 のログイベント から確認できます。
以下の記事で Workspace レポートと監査ログについて触れていますので、ご参照ください。
注意点
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
Follow @fujioka57621469