こんにちは。G-genの杉村です。
BigQuery は Google Cloud (GCP) の優れたデータウェアハウスツールです。センシティブなデータを扱うこともあるでしょう。
そのような場合でも BigQuery は Cloud IAM の機能によりきめ細かい権限設定をすることができます。しかし...
はっきり言って難しい!
IAM の仕組みがそもそも難しいですし、これに加えて ジョブ実行の権限 (そもそもジョブとは...?) と データ取得・編集の権限 が別れていたり、 デフォルトで IAM 基本ロールに特定の権限が与えられていたり と難解です。
実環境での実験結果を交えて解説していきます。
細かい話が多いので、少しの間、腰をすえてお読みいただけますと幸いです。

まずは IAM の基本概念の理解
まずは Google Cloud の IAM の仕組みをしっかり押さえておきます。
本投稿では以下のブログの内容が理解されている前提で進めて参りますので、ぜひお読みください。
リソースと IAM の関係、 IAM の継承などが大事なポイントです。
BigQuery 関連の IAM 権限の理解
ジョブ実行とデータアクセス
BigQuery でいう ジョブ とは、BigQuery のコンピューティングリソースを使って行われる以下のような操作を指します。
- データの読み込み
- データのエクスポート
- データのクエリ
- データのコピー
コンソールに SQL を入力して実行するのもジョブ実行ですし、 bq コマンドによる Cloud Storage からのデータロードもジョブ実行です。
BigQuery ではこの ジョブ自体を実行する権限 と 実際のデータにアクセスする権限 を分けています。
普段仕事で使うパソコンに例えると、パソコンにログインをする権限と、ファイルサーバへのアクセス権限とは別になっている、というようなイメージです。

なぜ別れているかは以下の例を考えると分かりやすいです。
例えば、 BigQuery で Google が公開しているパブリックデータセットを使って分析を行うことを考えてみてください。
データセットへのアクセス権限は全世界に公開されていますが、皆さんのプロジェクトの BigQuery のコンピューティングリソースを使う権限 (=ジョブ実行権限) は皆さんやその組織のメンバーにしか許可したくないはずです。
勝手に使われると、 スキャン量に応じて課金されてしまいますからね!

ジョブ実行権限
ジョブ実行関連の 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) を付与してあげればよいわけです。
ここで、少し実験をしてみました。
先ほどジョブ権限は "プロジェクトレベルで付与する必要がある" そして "データへのアクセス権限はデータセットレベルもしくはテーブルレベルで付与できる" と書きましたが、それを確かめてみます。
IAM ロールを各リソースに付けたり外したりして、実験してみました。
(IAM 設定の反映には数十秒かかるので、時間がかかりました...)

このような結果になりました。
なお BigQuery ジョブユーザー (roles/bigquery.jobUser) はデータセット単位では付与できずプロジェクトレベル以上でしか付与できない仕様のため N/A となっています。
プロジェクトレベルにジョブ実行権限がない場合にはクエリが実行不可 (N) という結果になりました。
またジョブ実行権限さえあれば、データ読み取り権限はデータセットレベルで付与すればデータが読み取れる、という結果が確かめられました。
書き込み権限
基本的な考え方は、読み取り権限と同様です。
書き込みアクセスに必要な権限は bigquery.tables.updateData
になります。
BigQuery 管理者 (roles/bigquery.admin) 、 BigQuery データオーナー (roles/bigquery.dataOwner) 、 BigQuery データ編集者 (roles/bigquery.dataEditor) などがこの権限を持っています。
なお、ある権限をどの IAM ロールが持っているか調べたい場合、以下で検索できます。
逆に、ある IAM ロールがどんな権限を持っているかは gcloud iam roles describe ${rolename}
で調べることができます。
メタデータへのアクセス権限
メタデータはデータセットやテーブルの持つ付随的な属性情報です。
テーブルのスキーマ情報などがこれに当たります。
仕事場のパソコンの例えを使うと、ファイルサーバのデータ容量の使用状況やディスクのドライブ名、またファイルシステムの設定値などですね。
データセットのメタデータに対する権限では 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 ロールを付与すればいいのか を解説付きで記載します。
一通り読むことで、 BigQuery に関する IAM 権限がある程度理解できるでしょう。
BigQuery のデータを含むプロジェクト内の全リソースの閲覧権限を与えたい
IAM 設定方法
- 付与対象リソース: プロジェクト
- 付与する IAM ロール: 閲覧者 (roles/viewer)
説明
ある Google アカウントが閲覧者 (roles/viewer) の IAM ロールをプロジェクトレベルで持っていると、 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) 相当の権限を持つように設定されています。
これは、データセットを新規作成するときに自動で設定されてしまう、 BigQuery 特有の設定です。
ドキュメントでは以下に記載があります。
これにより 閲覧者 (roles/viewer) 自体は bigquery.tables.getData
権限を持っていないので本来はデータにアクセスできないはずですが、データセット側の個別設定で BigQuery データ閲覧者 (roles/bigquery.dataViewer) 相当の権限を与えられていたためアクセスができた、ということです。
同様にプロジェクトレベルの オーナー (roles/owner) には BigQuery データオーナー (roles/bigquery.dataOwner) が割り当たり、プロジェクトレベルの 編集者 (roles/editor) には BigQuery データ編集者 (roles/bigquery.dataEditor) 権限が割り当たります。
これらの自動で割り当たる権限は、削除することが可能です。
特定のデータセットにだけ閲覧・編集権限を与えたい
IAM 設定方法
- IAM 設定 1
- 付与対象リソース: プロジェクト
- 付与する IAM ロール: BigQuery ジョブユーザー (roles/bigquery.jobUser)
- IAM 設定 2
- 付与対象リソース: データセット
- 付与する IAM ロール: BigQuery データ編集者 (roles/bigquery.dataEditor)
説明
上記両方の権限を付与する必要があります。
BigQuery ジョブユーザー (roles/bigquery.jobUser) は必ずプロジェクトレベルで設定する必要があることに注意です。
BigQuery データ編集者 (roles/bigquery.dataEditor) をプロジェクトレベルに設定すれば、プロジェクト内の全てのデータセットとテーブルに対して閲覧・編集権限を持つことができます。
特定のプロジェクトの BigQuery 全体管理者
IAM 設定方法
- 付与対象リソース: プロジェクト
- 付与する IAM ロール: BigQuery 管理者 (roles/bigquery.admin)
説明
プロジェクトレベルに上記の IAM ロールを付与すれば、ジョブの実行、データへのアクセス、データセットやテーブルの作成、など BigQuery に関する全ての権限を持たせることができます。
その他のユースケース
以下のページに事前定義の IAM ロールごとにどんな権限を持っていて、どのリソースに付与可能なのかが一覧化されています。
本投稿の内容を理解したあとは、以下のページを参照してきめ細かい権限設定を行ってください。
杉村 勇馬 (記事一覧) (Facebook)
クラウドソリューション部 部長
元・警察官という経歴を持つ現・エンジニア。クラウド管理運用やネットワークに知見。AWS 12冠、Google Cloud認定資格10冠。
2022年5月現在、ハマっているものはモンスターエナジーウルトラ。
Follow @y_sugi_it