fbpx

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つのリソースとして位置付けられます。

<key-value形式でタグが定義され、1つのkeyに複数のvalueを紐付けられる>

似たような概念として「ラベル」が存在しますが、こちらは特定のリソースに付随する「メタデータ」であり、「ラベル」自体はリソースではありません。また「タグ」とは異なり、「ラベル」に基づいてIAMアクセス制御することもできません。こちらも公式ドキュメントで「タグ」と「ラベル」の比較表がありますので、詳細はそちらをご確認ください。

また、タグはIAMポリシー同様、リソース階層の概念が存在しており、例えば組織レベルの上位の階層で定義したタグは、より下位のフォルダ、プロジェクトレベルの階層に継承されていきます。またIAMポリシー同様、上位で定義されたタグについて、さらに下位で新たにタグを定義することで、タグのオーバーライドも可能です。

タグ付けによるIAMアクセス制御 実践

今回のユースケースでは、Bigquery の tableレベルでタグ付けによるIAMアクセス制御を実施したいと思います。具体的には table ごとに閲覧できるチームをタグで設定して、IAMコンソール画面でロール付与時にタグを用いて条件を追加します。Bigqueryについて、今回のハンズオンでは tableレベルでのタグ付与となりますが、Datasetレベルでのタグ付けも可能となっています。

<ユースケースイメージ図:各チームのtableにのみ閲覧できるようにする>

アクセス先の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年度からクラウドサービスを提供するチーム「クラウドソリューションチーム」を発足致しました。

クラウドソリューションチームは、お客様に対してクラウドインフラの設計~構築~運用を幅広くカバーするクラウドエンジニアリングサービスを提供し、クラウド利用に関する様々な課題を解決するソリューションとサービスを提供させていただくチームです。

クラウドソリューションサービスに興味を持たれた方はこちらのサイトも覗いてみてください。ご質問や気になる事ありましたらお問い合わせフォームでのご連絡歓迎しております。

新規CTA