G-genの杉村です。BigQuery への認証・認可は Cloud IAM によって制御されますが、その仕組みは複雑です。当記事では、仕組みを詳細に解説します。
はじめに
BigQuery と認証・認可
Google Cloud (旧称 GCP) のデータウェアハウスサービスである BigQuery では、認証・認可が Cloud IAM によって制御されます。
IAM の仕組みがそもそも難しいことに加えて、ジョブ実行の権限とデータ取得・編集の権限が別れていたり、デフォルトで IAM 基本ロールに特定の権限が与えられていたりと難解です。
当記事では、実環境での検証結果も交えて解説します。
IAM の基本概念
まずは Google Cloud の IAM の基本的な仕組みを理解する必要があります。本投稿では以下の記事の内容が理解されている前提で記載しておりますので、ご確認ください。特に「リソースと IAM Policy、IAM ロールの関係」「IAM の継承」などが重要なポイントです。
BigQuery 関連の IAM 権限の理解
ジョブ実行とデータアクセス
BigQuery でいう ジョブ とは、BigQuery のコンピューティングリソースを使って行われる以下のような操作を指します。
- データの読み込み
- データのエクスポート
- データのクエリ
- データのコピー
コンソールに SQL を入力して実行するのもジョブ実行ですし、 bq コマンドによる Cloud Storage からのデータロードもジョブ実行です。BigQuery ではこの ジョブ自体を実行する権限 と 実際のデータにアクセスする権限 を区別しています。
普段仕事で使うパソコンに例えると、パソコンにログインをする権限と、ファイルサーバへのアクセス権限とは別になっている、というようなイメージです。
なぜ別れているかは、以下の例を考えると分かりやすくなります。
例えば Google が公開しているパブリックデータセットを使って分析を行うケースを考えます。データセットへのアクセス権限は全世界に公開されており、データの保管料金は、データを保持している会社 (プロジェクト) に課金されています。しかしクエリジョブはデータ利用者側の Google Cloud プロジェクトに投入する必要があり、コンピュート料金もデータを利用する側が負担します。
ジョブ実行権限
ジョブ実行関連の IAM 権限には bigquery.jobs.create
、 bigquery.jobs.get
、 bigquery.jobs.list
といったものがあります。
ジョブを実行するには bigquery.jobs.create
の権限が必要で、事前定義の IAM ロールでは BigQuery 管理者 (roles/bigquery.admin)、 BigQuery ジョブユーザー (roles/bigquery.jobUser)、 BigQuery ユーザー (roles/bigquery.user) などに含まれています。
これらのロールは プロジェクト レベルで付与する必要があります。
つまり、クエリを実行する人のアカウントには プロジェクト に対して BigQuery ジョブユーザー (roles/bigquery.jobUser) などを付与してあげる必要があるわけです。
…ただし、ジョブの実行権限だけがあってもデータにアクセスすることはできません。次に記載するデータへのアクセス権限が必要です。
データへのアクセス権限
読み取り権限
先ほどの仕事用パソコンの例えを使うと、こちらはファイルサーバへのアクセス権限です。
テーブル内のデータに読み取りアクセスするには bigquery.tables.getData
の権限が必要で、これは事前定義の IAM ロールでは BigQuery 管理者 (roles/bigquery.admin)、BigQuery データオーナー (roles/bigquery.dataOwner)、BigQuery データ編集者 (roles/bigquery.dataEditor)、 BigQuery データ閲覧者 (roles/bigquery.dataViewer) などに含まれています。
これらのロールはプロジェクトレベル、データセットレベル、あるいはテーブルレベルで付与できます。
例えばあるデータセット内のデータに読み出しクエリをさせたい場合、その人のアカウントに先述の通りプロジェクトレベルで BigQuery ジョブユーザー (roles/bigquery.jobUser) などを付与するのに加えて、該当データセットレベルで BigQuery データ閲覧者 (roles/bigquery.dataViewer) を付与してあげればよいわけです。
ここで、検証結果を共有します。
先ほどジョブ権限は "プロジェクトレベルで付与する必要がある" そして "データへのアクセス権限はデータセットレベルもしくはテーブルレベルで付与できる" と書きましたが、それを実証します。
※ BigQuery ジョブユーザー (roles/bigquery.jobUser) はデータセット単位では付与できずプロジェクトレベル以上でしか付与できない仕様のため N/A となっている
プロジェクトレベルにジョブ実行権限がない場合にはクエリが実行不可 (N) という結果になりました。
またジョブ実行権限さえあれば、データ読み取り権限はデータセットレベルで付与すればデータが読み取れる、という結果が確かめられました。
書き込み権限
基本的な考え方は、読み取り権限と同様です。
書き込みアクセスに必要な権限は bigquery.tables.updateData
になります。
BigQuery 管理者 (roles/bigquery.admin)、BigQuery データオーナー (roles/bigquery.dataOwner)、BigQuery データ編集者 (roles/bigquery.dataEditor) などがこの権限を持っています。
メタデータへのアクセス権限
メタデータはデータセットやテーブルの持つ付随的な属性情報です。テーブルのスキーマ情報などがこれに当たります。
仕事場のパソコンの例えを使うと、ファイルサーバのデータ容量の使用状況やディスクのドライブ名、またファイルシステムの設定値などが当たります。
データセットのメタデータに対する権限では bigquery.datasets.get
、 bigquery.datasets.update
がありテーブルのメタデータに対する権限では bigquery.tables.get
、 bigquery.tables.update
などがあります。
メタデータの閲覧・編集権限があっても、テーブル内のデータ自体を閲覧・編集することはできません。
事前定義の IAM ロール BigQuery データ編集者 (roles/bigquery.dataEditor) や BigQuery データ閲覧者 (roles/bigquery.dataViewer) などはデータに対する権限に加えて、メタデータに対する権限も持っています。
一方で BigQuery メタデータ閲覧者 (roles/bigquery.metadataViewer) はメタデータに対する読み取り権限を持っていますがデータ自体は見えないので、 BigQuery 基盤の管理者・運用者などが使うことを想定されています。
ロールが持つ IAM 権限
ある権限をどの IAM ロールが持っているか調べたい場合、以下で検索できます。
逆に、ある IAM ロールがどんな権限を持っているかは、以下のドキュメントで調べることができます。
- 参考 : ロールについて
ユースケース別 IAM 設定
BigQuery のデータを含むプロジェクト内の全リソースの閲覧権限を与えたい
設定
- 付与対象リソース: プロジェクト
- 付与する IAM ロール: 閲覧者 (roles/viewer)
説明
ある Google アカウントが閲覧者 (roles/viewer) の IAM ロールをプロジェクトレベルで持っていると、 BigQuery の全データセット・テーブルのデータとメタデータを閲覧することができます。なお閲覧者は、BigQuery 以外のほとんどのサービスの閲覧権限も得られてしまうため、注意が必要です。
深堀り
ここで少し詳しく深堀りしていきます。
IAM ロール 閲覧者 (roles/viewer)
がどんな権限を持っているかを調べてみると、少しおかしなことに気が付きます。
sugimura@cloudshell:~ (gcp-dev-yuma-sugimura)$ gcloud iam roles describe roles/viewer | grep bigquery - bigquery.bireservations.get - bigquery.capacityCommitments.get - bigquery.capacityCommitments.list - bigquery.config.get - bigquery.connections.get - bigquery.connections.getIamPolicy - bigquery.connections.list - bigquery.connections.use - bigquery.datasets.get - bigquery.datasets.getIamPolicy - bigquery.jobs.create - bigquery.jobs.get - bigquery.jobs.list - bigquery.models.export - bigquery.models.getData - bigquery.models.getMetadata - bigquery.models.list - bigquery.readsessions.create - bigquery.readsessions.getData - bigquery.readsessions.update - bigquery.reservationAssignments.list - bigquery.reservationAssignments.search - bigquery.reservations.get - bigquery.reservations.list - bigquery.routines.get - bigquery.routines.list - bigquery.rowAccessPolicies.getIamPolicy - bigquery.rowAccessPolicies.list - bigquery.savedqueries.get - bigquery.savedqueries.list - bigquery.tables.createSnapshot - bigquery.tables.getIamPolicy - bigquery.transfers.get
BigQuery のテーブルに関する権限は以下の2つだけです。
- bigquery.tables.createSnapshot - bigquery.tables.getIamPolicy
これではテーブルのメタデータやデータに対するアクセス権限はないはずです。前述の通り、データにアクセスするには bigquery.tables.getData
の権限が必要です。bigquery.jobs.create
権限はあるのでジョブ実行はできるはずですが、データの中身は見えないはず (Access Denied になるはず) です。
しかし、試してみると実際にはクエリを発行してデータを取得することができてしまいます。これは BigQuery が新規データセットに対してデフォルトで付与するある設定が関係しています。
上記のスクリーンショットの通り、プロジェクトレベルで 閲覧者 (roles/viewer) が付与されている人は、データセットに対して BigQuery データ閲覧者 (roles/bigquery.dataViewer) 相当の権限を持つように設定されています。これは IAM の仕組みとは異なる、レガシーなアクセス権限の仕組みに起因しています。
これは、データセットを新規作成するときに自動で設定されてしまう、 BigQuery 特有の設定です。ドキュメントでは以下に記載があります。
- 参考 : 基本ロールと権限
これにより 閲覧者 (roles/viewer) 自体は bigquery.tables.getData
権限を持っていないので本来はデータにアクセスできないはずですが、データセット側の個別設定で BigQuery データ閲覧者 (roles/bigquery.dataViewer) 相当の権限を与えられていたためアクセスができた、ということです。
同様にプロジェクトレベルの オーナー (roles/owner) には BigQuery データオーナー (roles/bigquery.dataOwner) が割り当たり、プロジェクトレベルの 編集者 (roles/editor) には BigQuery データ編集者 (roles/bigquery.dataEditor) 権限が割り当たります。
これらの自動で割り当たる権限は、削除することが可能です。
特定のデータセットにだけ閲覧・編集権限を与えたい
設定
- IAM 設定 1
- 付与対象リソース: プロジェクト
- 付与する IAM ロール: BigQuery ジョブユーザー (roles/bigquery.jobUser)
- IAM 設定 2
- 付与対象リソース: データセット
- 付与する IAM ロール: BigQuery データ編集者 (roles/bigquery.dataEditor)
説明
上記の両方の権限を付与する必要があります。
BigQuery ジョブユーザー (roles/bigquery.jobUser) は必ずプロジェクトレベルで設定する必要があります。
BigQuery データ編集者 (roles/bigquery.dataEditor) をプロジェクトレベルに設定すれば、プロジェクト内の全てのデータセットとテーブルに対して閲覧・編集権限を持つことができます。
特定のプロジェクトの BigQuery 全体管理者
設定
- 付与対象リソース: プロジェクト
- 付与する IAM ロール: BigQuery 管理者 (roles/bigquery.admin)
説明
プロジェクトレベルに上記の IAM ロールを付与すれば、ジョブの実行、データへのアクセス、データセットやテーブルの作成、など BigQuery に関する全ての権限を持たせることができます。
その他のユースケース
以下のページに事前定義の IAM ロールごとにどんな権限を持っていて、どのリソースに付与可能なのかが一覧化されています。
本投稿の内容を理解したあとは、以下のページを参照してきめ細かい権限設定を行ってください。
- 参考 : IAM の概要
杉村 勇馬 (記事一覧)
執行役員 CTO / クラウドソリューション部 部長
元警察官という経歴を持つ現 IT エンジニア。クラウド管理・運用やネットワークに知見。AWS 12資格、Google Cloud認定資格11資格。X (旧 Twitter) では Google Cloud や AWS のアップデート情報をつぶやいています。
Follow @y_sugi_it