🔖

BigQueryのデータセットにタグ付けをしてIAMでアクセス制御する

2022/06/22に公開

2022年6月6日のリリースノートでBigQueryデータセットへのタグ付けおよびIAMポリシーによるリソースアクセスをできるようになりました(プレビュー)。

何がうれしいのか

BigQueryのデータセットへのIAMによるアクセス制御は従来でも可能でしたが、設定箇所がリソース(データセット)のオプション画面なので(個人的に)分かりづらいです。また、一覧性に乏しく、どのユーザー(またはグループ)がどのデータセットに権限が付与されているのかがIAMコンソール画面では分からず、データセットの権限設定まで見に行かないと分かりませんでした[1]。タグ+IAM Conditionsによるアクセス制御によって、IAM上で設定が完結できるうえに、IPアドレスや特定の時刻のみアクセスを許可することもできます。

タグとは

ここでタグについて復習です。

「あれ?リソースにつけるやつだよね?前からデータセットにつけることはできてたよね?」
それはラベルです。

AWSでは「タグ」によってリソースへの付与とIAMによる制御ができますが、GCPは「ラベル」と「タグ」で機能が分かれます。違いについては比較表を参照してほしいのですが、当記事で簡単にまとめます。

ラベル

  • ラベル単体は存在せず、リソースのメタデータとして付与する
  • 各リソースによってラベルが定義される
  • IAMポリシーによる制御はできない
  • プロジェクトレベルの権限
    • ラベルの追加・更新:resourcemanager.projects.update
    • ラベルの取得:resourcemanager.projects.get
  • 用途
    • 請求料金の分類・フィルタリング、分析
    • リソースのフィルタリング

タグ

  • タグキー、タグ値、タグ バインディングはそれぞれ個別のリソース
  • 組織レベルでタグが定義される
    • タグ定義の作成・変更:タグ管理者ロール(roles/resourcemanager.tagAdmin
    • リソースへのタグ追加・削除:タグユーザーロール(roles/resourcemanager.tagUser
    • タグ定義とリソースに添付されたタグの表示:タグ閲覧者ロール(roles/resourcemanager.tagViewer
  • 用途
    • リソースへの条件付きのポリシー許可・拒否

タグを定義、リソースへの追加をするには組織レベルでロールもしくはIAM権限を付与する必要があるため、プロジェクトレベルでしか権限をもらえない環境では敷居が高く使いづらいです。

やってみた

ドキュメント例を実際に試してみました。

従業員タイプ(employee_type)というタグキーと、internfull-timeというタグ値を作成し、employee_type:intern が付与されたBigQueryデータセットのみアクセスできるようにIAMを設定します。

権限付与

組織レベルでタグ管理者ロールとタグユーザーロールを付与します。

bigquery-dataset-iam

タグキーとタグ値を作成する

Cloud Consoleからタグページを開きます。

「作成」をクリックします。
bigquery-dataset-create-tag

タグキーとタグ値を下図のように作成します。
bigquery-dataset-create-tag

作成後、タグ値IDを控えておきます。
bigquery-dataset-create-tag

BigQueryデータセット、テーブルの作成

プロジェクト:foo-project
リージョン:asia-northeast1(東京)
データセット:access_tag_test1
テーブル:test-table1

以下のようにテストデータを入れておきます。
bigquery-dataset-data

タグの付与

Cloud Shellを起動してデータセットにタグ(employee_type:intern)を付与します。

# gcloudコマンドのバージョン確認
$ gcloud version | grep 'Google Cloud SDK'
Google Cloud SDK 388.0.0

$ gcloud config set project <PROJECT_ID>

# タグ付け
$ gcloud alpha resource-manager tags bindings create \
    --tag-value=TAGVALUE_NAME \
    --parent=RESOURCE_ID \
    --location=LOCATION
  • TAGVALUE_NAME:付与するタグ値もしくは名前空間付きの名前
    • 例:tagValues/123456789045678901234/employee_type/intern
  • RESOURCE_ID:データセットのリソースID
    • 例://bigquery.googleapis.com/projects/foo-project/datasets/access_tag_test1
  • LOCATION:データセットのリージョン

今回の場合、以下のようになります。

$ gcloud alpha resource-manager tags bindings create \
    --tag-value=tagValues/348436703784 \
    --parent=//bigquery.googleapis.com/projects/foo-project/datasets/access_tag_test1 \
    --location=asia-northeast1
done: true
response:
  '@type': type.googleapis.com/google.cloud.resourcemanager.v3.TagBinding
  name: tagBindings/%2F%2Fbigquery.googleapis.com%2Fprojects%2Ffoo-project%2Fdatasets%2Faccess_tag_test1/tagValues/348436703784
  parent: //bigquery.googleapis.com/projects/foo-project/datasets/access_tag_test1
  tagValue: tagValues/348436703784

gcloud alpha resource-manager tags bindings listでタグが付与されたかを確認します。

$ gcloud alpha resource-manager tags bindings list \
    --parent=//bigquery.googleapis.com/projects/foo-project/datasets/access_tag_test1 \
    --location=asia-northeast1
---
name: tagBindings/%2F%2Fbigquery.googleapis.com%2Fprojects%2Ffoo-project%2Fdatasets%2Faccess_tag_test1/tagValues/348436703784
parent: //bigquery.googleapis.com/projects/foo-project/datasets/access_tag_test1
tagValue: tagValues/348436703784

Cloud Console上でもタグが付与されていることが確認できます。
bigquery-dataset-confirm-tag

IAMの設定

別のユーザーに対して、データセットにemployee_type:internタグが設定されている場合のみアクセスできるようにします。
IAMのコンソール画面に行き、ロールから「BigQueryデータセット閲覧者」を選択し、「条件を追加」をクリックして下図のように入力します。
bigquery-dataset-iam-conditions

  • 条件タイプ:タグTag
  • Operator:値があるhas value
  • 値のパス:組織のドメイン/employee_type/intern

また、BigQueryへクエリ実行できるように「BigQueryジョブユーザー」ロールを追加します。
bigquery-dataset-iam-role

確認

BigQueryにクエリ実行できるかを確認します。先ほどIAMを設定したユーザーでログインし、Cloud Shellからbqコマンドを実行します。次のようにデータが返ってくればOKです。

$ bq query \
  --use_legacy_sql=false \
  'select * from `access_tag_test1.test-table1`'
+----+
| id |
+----+
|  1 |
|  2 |
+----+

他のデータセットには許可していないため、アクセスできません。

bq query \
  --use_legacy_sql=false \
  'select * from `access_tag_test2.test-table1`'
Access Denied: Table foo-project:access_tag_test2.test-table1:
User does not have permission to query table foo-project:access_tag_test2.test-table1.

最後に

BigQueryデータセットにタグを付与してIAMでアクセス制御する方法を紹介しました。本機能は現時点ではプレビューとなりますのでご注意ください。使いこなせれば便利な機能ですが、タグの追加・削除するために組織レベルの権限が必要となるため、権限が厳格に分かれている環境では難しいかと思いますので、タグの制御をプロジェクトレベルで、できるようにしてほしいですね。

参考URL

脚注
  1. Terraformなどコード管理されていれば別ですが。 ↩︎

Discussion