タグとアクセス制御

このページでは、タグの概要について説明します。また、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 を参照している場合、新しいキーまたは値に条件は適用されません。これにより、メンバーが意図しないアクセスを取得する可能性が低くなります。

    ただし、欠点もあります。キーと値を削除して再作成するときに、メンバーのアクセス権を維持するには、新しい永続 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')

次のステップ