タグとアクセス制御

このページでは、タグの概要について説明します。また、Identity and Access Management(IAM)でタグを使用して、Google Cloud リソースへのアクセスを制御する方法についても説明します。

タグの概要

タグは、組織、フォルダ、プロジェクトに関連付けられた Key-Value ペアです。リソースに特定のタグが設定されているかどうかに応じて、IAM のロールを条件付きで付与できます。

他のリソースは、親組織、フォルダ、プロジェクトからタグ値を継承します。その結果、タグを使用して任意の Google Cloud リソースへのアクセスを管理できます。

タグの一般的な使用例

タグを使用してアクセスを管理する一般的なユースケースは次のとおりです。

  • 開発環境、ステージング環境、本番環境。たとえば、開発環境に environment: dev、本番環境に environment: prod のタグを追加できます。
  • コンポーネントのタイプたとえば、タグの component: frontend をフロントエンド リソースに、component: batch をバッチ処理のリソースに追加します。
  • プロジェクト名。たとえば、チームが Codename Atlas を使用するプロジェクトで作業している場合、タグ project: atlas をチームの開発リソースに追加できます。

タグとリソース階層

Google Cloud では、リソースは階層の一部であり、下位レベルのリソースは上位レベルのリソースからプロパティを継承できます。タグは、リソースが継承できるプロパティの 1 つです。たとえば、組織にタグを適用すると、その組織内のフォルダ、プロジェクト、サービス固有のリソースがそのタグを継承します。

リソースでタグの値を継承しないようにするには、フォルダまたはプロジェクトに別のタグを追加します。ただし、同じキーを別の組織やフォルダのものとは異なる値で使用します。実際には、組織またはフォルダ上の各タグがデフォルト値を提供し、フォルダやプロジェクトなどの下位レベルのリソースで、デフォルト値をオーバーライドします。

たとえば、タグ environment: dev をフォルダに適用して、そのフォルダに team-ateam-b という 2 つの子フォルダがあるとします。また、別のタグ environment: testteam-b フォルダに適用することもできます。その結果、team-a フォルダ内のリソースはタグ environment: dev を継承し、team-b フォルダ内のリソースはタグ environment: test を継承します。

team-b フォルダから environment: test タグを削除すると、そのフォルダとそのリソースはタグ environment: dev を継承します。

タグの定義と識別子

リソースにタグを付ける前に、タグのキーと、タグで許可する値を定義する必要があります。これらの定義は組織に関連付けられます。Resource Manager を使用してタグの定義を管理します。詳細については、新しいタグの作成と定義をご覧ください。

タグのキーと値にはいくつかの異なる ID があります。

  • 永続的な ID。グローバルに一意であり、再利用できません。たとえば、タグキーに永続的な ID tagKeys/123456789012 を割り当て、タグ値に永続的な ID tagValues/567890123456 を持たせることができます。
  • 略称各キーの短い名前は、組織内で一意である必要があり、また各値の略称は、関連付けられているキーに対して一意である必要があります。たとえば、タグキーに短縮名 env を指定し、タグ値に prod という短縮名を付けることができます。
  • 名前空間名。組織の数値 ID をタグキーの略称に追加します。たとえば、タグキーに名前空間の名前は 123456789012/env です。組織 ID の取得方法をご覧ください

このページで説明されているように、リソースにタグを追加した後、タグに基づいてアクセス権を付与する条件を作成できます。条件を記述するには、条件で使用する識別子のタイプを選択する必要があります。次の中から選択してください。

  • タグを試すには、名前空間化された名前(キー用)と短縮名(値)の使用を検討します。特に開始時には、これらの識別子がわかりやすく、覚えやすいものになります。
  • 構成を宣言的に管理する場合には、Terraform などのツールを使用して、名前空間付きの名前(キーの場合)と略称(値)の使用を検討してください。これらの識別子は、時間の経過とともに再利用できます。つまり、宣言ツールでその ID を削除して再作成すれば、条件が機能し続けます。

    このアプローチでは、タグキーまたは値を削除して、名前は同じでも意味が異なる新しいキーまたは値を作成するとします。条件が名前空間名または略称を指す場合、条件は新しいキーまたは値に適用されます。

    この動作によっては、意図しないアクセス権が付与されることがあります。

  • リスクを最小限に抑えるため、再利用できない永続的な ID を使用することを検討してください。

    永続的な ID がリスクを最小限に抑える理由にあります。たとえば、タグキーや値を削除してから、同じ名前で別の意味を持つ新しいキーや値を作成するとします。条件が永続的な ID を参照している場合、条件は新しいキーまたは値には適用されません。その結果、メンバーにとって意図しないアクセスを得る可能性が減ります。

    1 つの欠点として、キーと値を削除して削除しても、メンバーのアクセス権を維持するには、新しい永続 ID を参照するように IAM ポリシーを更新する必要があります。

タグ付きリソースへのアクセス

IAM 条件を指定してタグを使用すると、リソースに関連付けられたタグや、リソースによって継承されるタグに応じて、条件付きで役割を付与できます。条件が true と評価されると、アクセスが許可されます。それ以外の場合、アクセス権は付与されません。詳しくは、IAM Conditions の概要をご覧ください。

以下のセクションでは、リソースのタグを確認する条件式の例を示します。この条件は、永続 ID と短縮名のどちらをチェックするかによって、異なる関数を呼び出します。これらの関数の詳細については、リソースタグをご覧ください。

永続的な ID を使用する条件

この条件は、タグ tagKeys/123456789012: tagValues/567890123456 を持つリソースに対する役割を付与します。

resource.matchTagId('tagKeys/123456789012', 'tagValues/567890123456')

この条件では、値に関係なく、キー tagKeys/123456789012 を持つタグを持つ役割を付与します。

resource.hasTagKeyId('tagKeys/123456789012')

条件は、タグ tagKeys/123456789012: tagValues/567890123456 を持つリソースと、キー tagKeys/987654321098 を使用するタグに役割を付与します。

resource.matchTagId('tagKeys/123456789012', 'tagValues/567890123456') &&
    resource.hasTagKeyId('tagKeys/987654321098')

名前空間と略称を使用する条件

この条件では、タグが env: prod のリソースに対する役割が付与されます。これは、本番環境の本番環境であることを示します。

resource.matchTag('123456789012/env', 'prod')

この条件では、値に関係なく、キー env を持つタグを持つリソースに役割を付与します。

resource.hasTagKey('123456789012/env')

この条件は、タグ env: prod を持つリソースに役割を付与します。また、キー project を使用するタグを持つリソースの役割も付与されます。

resource.matchTag('123456789012/env', 'prod') &&
    resource.hasTagKey('123456789012/project')

次のステップ