BigQueryのデータセットにタグ付けをしてIAMでアクセス制御する
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
)というタグキーと、intern
、full-time
というタグ値を作成し、employee_type:intern
が付与されたBigQueryデータセットのみアクセスできるようにIAMを設定します。
権限付与
組織レベルでタグ管理者ロールとタグユーザーロールを付与します。
タグキーとタグ値を作成する
Cloud Consoleからタグページを開きます。
「作成」をクリックします。
タグキーとタグ値を下図のように作成します。
作成後、タグ値IDを控えておきます。
BigQueryデータセット、テーブルの作成
プロジェクト:foo-project
リージョン:asia-northeast1
(東京)
データセット:access_tag_test1
テーブル:test-table1
以下のようにテストデータを入れておきます。
タグの付与
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/1234567890
、45678901234/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上でもタグが付与されていることが確認できます。
IAMの設定
別のユーザーに対して、データセットにemployee_type:intern
タグが設定されている場合のみアクセスできるようにします。
IAMのコンソール画面に行き、ロールから「BigQueryデータセット閲覧者」を選択し、「条件を追加」をクリックして下図のように入力します。
- 条件タイプ:
タグ
(Tag
) - Operator:
値がある
(has value
) - 値のパス:
組織のドメイン/employee_type/intern
また、BigQueryへクエリ実行できるように「BigQueryジョブユーザー」ロールを追加します。
確認
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
-
Terraformなどコード管理されていれば別ですが。 ↩︎
Discussion