GCPリソースのタグ付けによるIAMアクセス制御 #GCP #IAM
はじめに
先日の2024/1/29頃に、BigqueryへのtableレベルのIAM タグ付与が Public Preview になりました。組織やフォルダ、プロジェクトやリソースなど、様々な階層でIAMアクセス制御が実施できるGoogle Cloudですが、「細かいIAMアクセス制御」と聞くと、個々のリソースごとに毎回「プリンシパル」と「ロール」を紐づける作業が思い浮かびますが、もう一つの手段として「タグ付けによるIAMアクセス制御」が考えられますので、この機会にご紹介いたします。
タグとは?
公式ドキュメントからの引用です
タグを使用すると、リソースのアノテーションを作成できます。場合によっては、リソースに特定のタグが付加されているかどうかに基づいて、条件付きでポリシーの許可や拒否を行えます。リソース階層全体にわたるきめ細かい管理のために、タグとポリシーの条件付き適用を使用できます。
https://cloud.google.com/resource-manager/docs/tags/tags-overview?hl=ja
簡単にまとめると、リソースをグループ分けしたり、条件をつけて管理できるのがタグになります。タグはkey-value形式で定義され、タグ自体もGoogle Cloudにおいては1つのリソースとして位置付けられます。
似たような概念として「ラベル」が存在しますが、こちらは特定のリソースに付随する「メタデータ」であり、「ラベル」自体はリソースではありません。また「タグ」とは異なり、「ラベル」に基づいてIAMアクセス制御することもできません。こちらも公式ドキュメントで「タグ」と「ラベル」の比較表がありますので、詳細はそちらをご確認ください。
また、タグはIAMポリシー同様、リソース階層の概念が存在しており、例えば組織レベルの上位の階層で定義したタグは、より下位のフォルダ、プロジェクトレベルの階層に継承されていきます。またIAMポリシー同様、上位で定義されたタグについて、さらに下位で新たにタグを定義することで、タグのオーバーライドも可能です。
タグ付けによるIAMアクセス制御 実践
今回のユースケースでは、Bigquery の tableレベルでタグ付けによるIAMアクセス制御を実施したいと思います。具体的には table ごとに閲覧できるチームをタグで設定して、IAMコンソール画面でロール付与時にタグを用いて条件を追加します。Bigqueryについて、今回のハンズオンでは tableレベルでのタグ付与となりますが、Datasetレベルでのタグ付けも可能となっています。
アクセス先のBigquery Datasetは、事前に以下のように用意されている前提でハンズオンを進めます(tableへのタグ付け実施前)
タグの作成
実際にタグを作成していきます。タグの作成は組織レベルで「タグユーザー」と「タグ管理者」ロールが必要になりますので、無い場合は事前にタグを作成するユーザーにロールを付与してください。タグ作成自体は 組織/フォルダ/プロジェクト のどの階層でも作成することができますが、今回は組織レベルでタグを作成します。
- Google Cloudコンソール画面で組織を選択して、「IAMと管理」 > 「タグ」 画面にて、タグキーの [作成] をクリックします。
- 「タグキー」「タグキーの説明」を以下のように入力して、タグの値を「team A」「team B」用に追加していきます。入力が完了したら [タグキーを作成] をクリックします。
作成が完了すると以下のように「タグキーID」が出力されます。
タグ名「team」をクリックして、タグの詳細画面に遷移すると、タグの値ごとの「タグ値ID」が出力されます。もし後続の「Bigquery tableへのタグ付け」や、他のリソースへのタグ付けをgcloudコマンドで実施する場合は、コマンド実行時に利用するので、出力された「タグ値ID」を控えておきます。
ちなみに、gcloudコマンド では、タグの作成は以下のようなコマンドになります。
<タグキーの作成>
gcloud resource-manager tags keys create team \
--parent=organizations/${組織IDを指定} \
--description="所属チームを表すタグ"
<タグキーに紐づける値の作成>
gcloud resource-manager tags values create A \
--parent=tagKeys/${タグキーIDを指定} \
--description="チームA"
gcloud resource-manager tags values create B \
--parent=tagKeys/${タグキーIDを指定} \
--description="チームB"
Bigquery tableへのタグ付け
事前に作成されている Bigquery table にタグを付与します。「チームA」の所有物にはタグ「team: A」を、「チームB」の所有物にはタグ「team: B」を付与するイメージとなります。
- 対象のDatasetが存在するプロジェクトに移動し、「Bigquery」画面から対象のtableを選択後、[詳細]タブ > [詳細を編集] をクリックします。
- 「タグ」の欄にて、[スコープの選択] > [現在の組織を選択] をクリックします。スコープの選択では、タグを作成した階層(組織、フォルダ、プロジェクトなど)を選択するようにします。
- 「キー」に、先ほど作成した「team」を、「値」には「チームA」の所有物を表す「A」を選択して、[SAVE]をクリックします。
作成が完了すると以下のようにタグが付与されます。「<数字>/team: A」の <数字> の部分は、先ほど選択したスコープ(今回は組織)のIDが入ります。
チームBについても同様の手順でタグを付与します。
ちなみに、現時点(2024/2/2)では、gcloudによるtableに対するタグ付けはpreviewのためサポートされていません。datasetへのタグ付けについてはgcloudコマンドがサポートされおり、以下のようなコマンドになります。「タグ値ID」は先程タグキーに値を設定した際に出力されたIDを、「resourceID」にはタグ紐付け先のリソースID(例://bigquery.googleapis.com/projects/foo-project/datasets/test_dataset)を、「location」にはタグ紐付け先のリソースが置かれているリージョンを選択します。
gcloud resource-manager tags bindings create \
--tag-value=${タグ値ID} \
--parent=${resourceID}\
--location=${location}
リソースにどのようなタグが付与されているかは、以下のようなコマンドで確認できます。
gcloud resource-manager tags bindings list \
--parent=${resourceID}\
--location=${location}
IAM設定
Bigquery tableを閲覧するメンバーに、IAMにて必要なロールを付与します。ロール付与の際に、特定のタグが付与されているリソースのみ閲覧可能とする条件も追加します。
- Datasetが置かれているプロジェクトと同じプロジェクトを選択し、IAM画面の [アクセス権を付与]をクリックします。
- チームAに所属するメンバーをプリンシパルに指定して、dataset/tableのデータ閲覧に必要なロール「BigQueryデータセット閲覧者」と、クエリの実行に必要なロール「BigQueryジョブユーザー」を付与します。その後、ロール「BigQueryデータセット閲覧者」の [IAM の条件を追加]をクリックします。
- 条件の「タイトル」、「説明」適宜入力し、「条件ビルダー」にて、先程作成したタグのパスを指定して、[保存]をクリックします。
- 条件の保存が完了すると、ロールの割り当て画面で対象ロールに条件が付与されているのを確認し、再度 [保存] をクリックします。
ちなみに、gcloudコマンドでは以下のように「--condition」オプションで条件を指定できます。expressionの指定方法はこちらの公式ドキュメントをご参考いただけます。
gcloud projects add-iam-policy-binding CloudSolution-Blog \
--member=${ロール付与する対象アカウント} \
--role='roles/bigquery.dataViewer' \
--condition=' \
expression=resource.matchTag("160894454393/team", "A"), \
title=only access to resource belongs to team A, \
description=team A 所有のリソースのみアクセス許可'
動作確認
先程の手順で、条件付きのロールを付与したアカウントから、実際にBigquery tableにアクセスできるかどうか確認します。
- 条件にマッチした(タグ「team:A」が付与された) team_a_table に対して、schema情報を取得します。
bq show \
--schema \
--format=prettyjson \
cloudsolution-blog:test_dataset.team_a_table
IAM roleの条件にマッチしているため、以下のような出力が得られるはずです。
[
{
"mode": "NULLABLE",
"name": "team_a",
"type": "STRING"
}
]
- 次に、条件にマッチしない(タグ「team:A」が付与されていない) team_b_table に対して、同様にschema情報を取得します。
bq show \
--schema \
--format=prettyjson \
cloudsolution-blog:test_dataset.team_b_table
条件にマッチしないため、以下のようなエラーが表示されます。
BigQuery error in show operation: Access Denied: Table cloudsolution-blog:test_dataset.team_b_table: Permission bigquery.tables.get denied on table cloudsolution-
blog:test_dataset.team_b_table (or it may not exist).
以上のように、条件に沿って適切にIAMアクセス制御が実施されているのが確認できます。
まとめ
今回は Bigquery tableに対するタグの付与と、タグを用いたtableに対するIAMアクセス制御を実施しました。現時点(2024/2/2)において、tableに対するタグ付けはpublic previewのため、一部機能(gcloudによるtableに対するタグ付け)は利用できませんが、コンソール経由であれば今のところ問題無くtableについてもタグ付けが利用できそうです。そう遠く無い将来にGAもされると(筆者は勝手に)思っています。次回もお楽しみに。
宣伝
クリエーションラインは2023年度からクラウドサービスを提供するチーム「クラウドソリューションチーム」を発足致しました。
クラウドソリューションチームは、お客様に対してクラウドインフラの設計~構築~運用を幅広くカバーするクラウドエンジニアリングサービスを提供し、クラウド利用に関する様々な課題を解決するソリューションとサービスを提供させていただくチームです。
クラウドソリューションサービスに興味を持たれた方はこちらのサイトも覗いてみてください。ご質問や気になる事ありましたらお問い合わせフォームでのご連絡歓迎しております。