タグを使用してリソースへのアクセスを制御する

このドキュメントでは、タグを使用して Cloud Monitoring ダッシュボードとアラート ポリシーへのアクセスを制御する方法について説明します。タグは、作成してリソースにアタッチする Key-Value ペアです。タグを Identity and Access Management(IAM)条件または拒否ポリシーと組み合わせることで、特定のダッシュボードとアラート ポリシーを編集または削除できるユーザーを制限できます。

アクセス制御パターン

次のいずれかのパターンを使用して、ダッシュボードとアラート ポリシーのアクセス制御を実装できます。

  • Terraform で管理されるリソースへのアクセスを制御する: タグと IAM 拒否ポリシーを使用して、タグ付きリソースを Terraform でのみ編集できるようにします。Terraform で管理されるリソースは、 Google Cloud コンソールまたは他のクライアントを介して行われる手動の未承認の変更から保護されます。

  • チーム管理リソースへのアクセスを制御する: チームごとのタグと条件付き IAM ロールの付与を使用して、特定のチームのメンバーのみがチーム管理のダッシュボードとアラート ポリシーを編集または削除できるようにします。

Terraform で管理されたリソースを保護する

このセクションでは、タグと IAM 拒否ポリシーを使用して、タグ付きのダッシュボードとアラート ポリシーを Terraform を使用するように構成されたサービス アカウントでのみ編集または削除できるようにする方法について説明します。

始める前に

プロジェクトのタグと IAM 拒否ポリシーの構成に必要な権限を取得するには、プロジェクトまたは組織に対する次の IAM ロールを付与するよう管理者に依頼してください。

ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

拒否ポリシーを使用してリソースを保護する

Google Cloud コンソール

  1. リソースが Terraform によって管理されていることを示すタグを作成します。たとえば、タグ値 terraform_only を持つタグキー edit_restriction を作成します。
  2. リソースに edit_restriction:terraform_only タグがある場合、Terraform サービス アカウントを除くすべてのプリンシパルに対して更新権限と削除権限を拒否する IAM 拒否ポリシーを作成します

    拒否ポリシーには、次の構成が含まれている必要があります。

    • 拒否する権限:
      • monitoring.dashboards.update
      • monitoring.dashboards.delete
      • monitoring.alertPolicies.update
      • monitoring.alertPolicies.delete
    • 条件: リソースにタグ edit_restriction:terraform_only が付いている必要があります。
    • 免除: Terraform サービス アカウントのプリンシパル ID を拒否ルールの例外リストに追加します。
  3. 保護するダッシュボードまたはアラート ポリシーを作成し、リソースにタグを関連付けます。

Terraform

Terraform を使用して制限を構成する手順は次のとおりです。

  1. プロジェクトに Terraform をインストールして構成します。
  2. タグキーとタグ値を作成します
  3. IAM 拒否ポリシーを作成します
  4. 保護するアラート ポリシーまたはダッシュボードを作成します。詳細については、Terraform を使用してアラート ポリシーを作成するTerraform を使用してダッシュボードを作成するをご覧ください。
  5. タグをリソースにバインドします。Terraform を使用してダッシュボードまたはアラート ポリシーにタグを付けるには、google_tags_tag_binding を使用してタグ バインディング リソースを作成します。

たとえば、次の Terraform 構成では次の処理が行われます。

  • タグキーと値を作成します。
  • 拒否ポリシーを作成します。
  • アラート ポリシーを作成します。
  • タグをアラート ポリシーにバインドします。

リソースを作成してタグをバインドすることは、同じコマンドではできません。リソースとタグ バインディングは個別に作成する必要があります。

# Create the tag key.
resource "google_tags_tag_key" "lock_key" {
  parent     = "projects/PROJECT_ID"
  short_name = "edit_restriction"
}

# Create the tag value.
resource "google_tags_tag_value" "restricted_value" {
  parent     = "tagKeys/${google_tags_tag_key.lock_key.name}"
  short_name = "terraform_only"
}

# Define the IAM deny policy.
resource "google_iam_deny_policy" "terraform_lock" {
  parent       = urlencode(
    "cloudresourcemanager.googleapis.com/projects/PROJECT_ID"
  )
  name         = "terraform-exclusive-lock"
  display_name = "Deny modifications except for Terraform service account"

  rules {
    deny_rule {
      denied_principals = ["principalSet://goog/public:all"]

      # Exempt the Terraform service account.
      exception_principals = [
        join("", [
          "principal://iam.googleapis.com/projects/-/",
          "serviceAccounts/TERRAFORM_SERVICE_ACCOUNT_EMAIL"
        ])
      ]

      denied_permissions = [
        "monitoring.googleapis.com/alertPolicies.update",
        "monitoring.googleapis.com/alertPolicies.delete",
        "monitoring.googleapis.com/dashboards.update",
        "monitoring.googleapis.com/dashboards.delete"
      ]

      denial_condition {
        title      = "is_restricted_resource"
        expression = join("", [
          "resource.matchTag(",
          "'PROJECT_ID/edit_restriction', ",
          "'terraform_only')"
        ])
      }
    }
  }
}

# Create the alerting policy.
resource "google_monitoring_alert_policy" "protected_policy" {
  display_name = "Restricted Alert Policy"
  combiner     = "OR"
  conditions {
    display_name = "High CPU"
    condition_threshold {
      filter     = join(" AND ", [
        "metric.type=\"compute.googleapis.com/instance/cpu/utilization\"",
        "resource.type=\"gce_instance\""
      ])
      duration   = "60s"
      comparison = "COMPARISON_GT"
      threshold_value = 0.9
    }
  }
}

# Bind the tag to the alerting policy.
resource "google_tags_tag_binding" "policy_binding" {
  parent    = join("", [
    "//monitoring.googleapis.com/",
    google_monitoring_alert_policy.protected_policy.name
  ])
  tag_value = google_tags_tag_value.restricted_value.id
}

チームスコープのアクセスを構成する

複数のチームのアプリケーションをモニタリングするプロジェクトの管理者であるとします。チームメンバーがダッシュボードとアラート ポリシーを作成できるようにし、自分のチームのリソースのみを編集できるようにします。チームメンバーに広範なモニタリング編集者ロール(roles/monitoring.editor)を付与することは望ましくありません。このロールは、プロジェクト内のすべてのモニタリング リソースを編集する権限を付与するためです。

このセクションでは、タグを使用して、チーム所有のダッシュボードとアラート ポリシーのみを編集するために必要な権限をチームメンバーに付与する方法について説明します。

始める前に

プロジェクトのタグと IAM ロールを構成するために必要な権限を取得するには、プロジェクトまたは組織に対する次の IAM ロールを付与するよう管理者に依頼してください。

ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

チーム固有のタグを適用する

Google Cloud コンソール

  1. チームごとにタグを作成します。新しいタグキーを作成し、そのキーのタグ値を作成します。たとえば、値 team_ateam_b を持つ owner という名前のタグキーを作成すると、owner:team_aowner:team_b の 2 つのタグが作成されます。各タグのタグキー ID と値 ID を記録します。
  2. 「Dashboard and Alerting Policy Creator」という名前のカスタムロールを作成し、次の権限を追加します。

    • monitoring.alertPolicies.create
    • monitoring.alertPolicies.createTagBinding
    • monitoring.dashboards.create
    • monitoring.dashboards.createTagBinding
    • resourcemanager.tagValueBindings.create

    このロールを使用すると、ダッシュボードとアラート ポリシーを作成し、タグを適用できます。

  3. すべてのチームメンバーに次のロールを付与します。

    • ダッシュボードとアラート ポリシーの作成者(作成したカスタムロール)
    • モニタリング閲覧者(roles/monitoring.viewer
    • タグ閲覧者(roles/resourcemanager.tagViewer
  4. チームごとに、IAM 条件を付加して、チームメンバーに次のロールを付与します。

    • Tag User(roles/resourcemanager.tagUser)。チームのタグをリソースに適用できます。
    • モニタリング編集者(roles/monitoring.editor)。チームのタグが付いているダッシュボードとアラート ポリシーを編集できます。

    次のように、ロール付与に IAM 条件を追加します。

    • 条件タイプ: Tag
    • 演算子: has value ID
    • keyID: KEY_ID
    • valueID: TEAM_VALUE_ID

    Resource Manager でタグキー ID と値 ID を見つけます。詳細については、タグ付きリソースへのアクセスをご覧ください。

  5. アクセスを制限するダッシュボードまたはアラート ポリシーを作成し、リソースにタグをアタッチします。

Terraform

Terraform を使用してチーム スコープのアクセスを構成するには、次の操作を行います。

  1. プロジェクトに Terraform をインストールして構成します。
  2. チームごとにタグキーとタグ値を作成します。
  3. カスタムロールを作成し、次の権限を追加します。
    • monitoring.alertPolicies.create
    • monitoring.alertPolicies.createTagBinding
    • monitoring.dashboards.create
    • monitoring.dashboards.createTagBinding
    • resourcemanager.tagValueBindings.create
  4. カスタムロール、モニタリング閲覧者のロール(roles/monitoring.viewer)、タグ閲覧者のロール(roles/resourcemanager.tagViewer)をすべてのメンバーに付与します。
  5. チームごとに、チームのタグ値に基づく条件付きバインディングを使用して、Tag User ロール(roles/resourcemanager.tagUser)とモニタリング編集者ロール(roles/monitoring.editor)を付与します。
  6. アクセスを制限するアラート ポリシーまたはダッシュボードを作成します。詳細については、Terraform を使用してダッシュボードを作成するTerraform を使用してアラート ポリシーを作成するをご覧ください。
  7. タグをリソースにバインドします。Terraform を使用してダッシュボードまたはアラート ポリシーにタグを付けるには、google_tags_tag_binding を使用してタグ バインディング リソースを作成します。

たとえば、次の Terraform 構成では次の処理が行われます。

  • タグキーと値を作成します。
  • カスタムロールを作成します。
  • 必要なロールと条件付き権限を付与する IAM バインディングを適用します。
  • ダッシュボードを作成します。
  • タグをダッシュボードにバインドして、チームの所有権を確立します。

リソースを作成してタグをバインドすることは、同じコマンドではできません。リソースとタグ バインディングは個別に作成する必要があります。

# Create the tag key.
resource "google_tags_tag_key" "res_tag_key" {
  parent      = "projects/PROJECT_ID"
  short_name  = "owner"
  description = "Identifies the team that owns the resource"
}

# Create the tag value.
# Note: You must create a tag value resource for each team.
resource "google_tags_tag_value" "team_a_value" {
  parent      = "tagKeys/${google_tags_tag_key.res_tag_key.name}"
  short_name  = "team_a"
  description = "Team A ownership tag value"
}

# Create the custom Creator role.
resource "google_project_iam_custom_role" "creator_role" {
  role_id     = "dashboardAndPolicyCreator"
  title       = "Dashboard and Alerting Policy Creator"
  permissions = [
    "monitoring.alertPolicies.create",
    "monitoring.alertPolicies.createTagBinding",
    "monitoring.dashboards.create",
    "monitoring.dashboards.createTagBinding",
    "resourcemanager.tagValueBindings.create"
  ]
}

# Grant the Custom Creator role to all members.
resource "google_project_iam_binding" "creator_grant" {
  project = "PROJECT_ID"
  role    = join("/", [
    "projects",
    "PROJECT_ID",
    "roles",
    google_project_iam_custom_role.creator_role.role_id
  ])
  members = ["group:ALL_MEMBERS_GROUP_EMAIL"]
}

# Grant the Monitoring Viewer role to all members.
resource "google_project_iam_binding" "viewer_grant" {
  project = "PROJECT_ID"
  role    = "roles/monitoring.viewer"
  members = ["group:ALL_MEMBERS_GROUP_EMAIL"]
}

# Grant the Tag Viewer role to all members.
resource "google_project_iam_binding" "tag_viewer_grant" {
  project = "PROJECT_ID"
  role    = "roles/resourcemanager.tagViewer"
  members = ["group:ALL_MEMBERS_GROUP_EMAIL"]
}

# Grant the Tag User role with a condition.
# Note: You have to configure this team-specific binding for each team.
resource "google_project_iam_binding" "tag_user_grant" {
  project = "PROJECT_ID"
  role    = "roles/resourcemanager.tagUser"
  members = ["group:TEAM_A_GROUP_EMAIL"]

  condition {
    title       = "restrict_to_team_a"
    description = "Allow Tag User only for team_a tag"
    expression  = join("", [
      "resource.matchTagId('",
      google_tags_tag_key.res_tag_key.name,
      "', '",
      google_tags_tag_value.team_a_value.id,
      "')"
    ])
  }
}

# Grant the Monitoring Editor role with a condition.
# Note: You have to configure this team-specific binding for each team.
resource "google_project_iam_binding" "editor_grant" {
  project = "PROJECT_ID"
  role    = "roles/monitoring.editor"
  members = ["group:TEAM_A_GROUP_EMAIL"]

  condition {
    title       = "restrict_to_team_a"
    description = "Allow Monitoring Editor only for team_a tag"
    expression  = join("", [
      "resource.matchTagId('",
      google_tags_tag_key.res_tag_key.name,
      "', '",
      google_tags_tag_value.team_a_value.id,
      "')"
    ])
  }
}

# Create the dashboard.
resource "google_monitoring_dashboard" "example_dashboard" {
  dashboard_json = jsonencode({
    "displayName": "System Health Overview",
    "gridLayout": { "columns": "2", "widgets": [] }
  })
}

# Apply the tag binding to the dashboard to give team A ownership.
resource "google_tags_tag_binding" "dashboard_tag" {
  parent    = join("", [
    "//monitoring.googleapis.com/",
    google_monitoring_dashboard.example_dashboard.id
  ])
  tag_value = google_tags_tag_value.team_a_value.id
}

ダッシュボードとアラート ポリシーのタグを管理する

Google Cloud コンソールまたは gcloud CLI を使用して、ダッシュボードとアラート ポリシーのタグの追加、一覧表示、削除を行うことができます。

始める前に

Cloud Monitoring リソースのタグを管理するために必要な権限を取得するには、プロジェクトまたは組織に対する次の IAM ロールを付与するよう管理者に依頼してください。

  • モニタリング閲覧者 roles/monitoring.viewer
  • タグ閲覧者 roles/resourcemanager.tagViewer
  • 必要なタグ オペレーションと、それらのオペレーションが必要なリソースタイプに必要な最小限の権限を持つカスタムロール。詳細については、[必要な権限] セクションを開いてください。

カスタムロールを設定するときに各タグ オペレーションに必要な権限を確認するには、「必要な権限」セクションを開きます。

必要な権限

リストされているタグ オペレーションごとに、次の権限が必要です。

  • ダッシュボードにタグを関連付けます。
    • resourcemanager.tagValueBindings.create
    • monitoring.dashboards.createTagBinding
  • アラート ポリシーにタグを付加します。
    • resourcemanager.tagValueBindings.create
    • monitoring.alertPolicies.createTagBinding
  • ダッシュボードからタグを削除します。
    • resourcemanager.tagValueBindings.delete
    • monitoring.dashboards.deleteTagBinding
  • アラート ポリシーからタグを削除します。
    • resourcemanager.tagValueBindings.delete
    • monitoring.alertPolicies.deleteTagBinding

タグを付ける

ダッシュボードまたはアラート ポリシーにタグを適用する手順は次のとおりです。

Google Cloud コンソール

タグを付加するリソースタイプを選択します。

ダッシュボード

  1. Google Cloud コンソールで [ダッシュボード] ページに移動します。

    [ダッシュボード] に移動

    検索バーを使用してこのページを検索する場合は、小見出しが [Monitoring] である結果を選択します。

  2. タグを適用するダッシュボードを選択します。
  3. [タグ] をクリックします。
  4. ダイアログの [直接タグ] セクションで、タグが作成された組織またはプロジェクトを選択してタグを探します。たとえば、プロジェクト レベルで作成されたタグを使用するには、スコープとして [現在のプロジェクトを選択] を選択します。

    [手動入力] オプションを選択して、プロジェクト ID、組織 ID、タグ ID を手動で検索することもできます。

  5. 適切な Key-Value ペアを選択し、[保存] をクリックします。
  6. 変更内容を確認するダイアログが表示されます。[確認] をクリックして変更を確定します。

アラート ポリシー

  1. Google Cloud コンソールで、[ ポリシー] ページに移動します。

    [アラート ポリシー] に移動

    検索バーを使用してこのページを検索する場合は、小見出しが [Monitoring] である結果を選択します。

  2. タグを適用するアラート ポリシーを選択します。
  3. [タグ] をクリックします。
  4. ダイアログの [直接タグ] セクションで、タグが作成された組織またはプロジェクトを選択してタグを探します。たとえば、プロジェクト レベルで作成されたタグを使用するには、スコープとして [現在のプロジェクトを選択] を選択します。

    [手動入力] オプションを選択して、プロジェクト ID、組織 ID、タグ ID を手動で検索することもできます。

  5. 適切な Key-Value ペアを選択し、[保存] をクリックします。
  6. 変更内容を確認するダイアログが表示されます。[確認] をクリックして変更を確定します。

gcloud

後述のコマンドデータを使用する前に、次のように置き換えます。

  • TAG_VALUE_ID: タグ値の永続 ID または名前空間付きの名前。例: tagValues/4567890123タグ識別子の詳細については、タグの定義と識別子をご覧ください。
  • PARENT: 親リソースの完全修飾名。たとえば、//monitoring.googleapis.com/projects/PROJECT_ID_OR_NUMBER/dashboards/DASHBOARD_ID//monitoring.googleapis.com/projects/PROJECT_ID_OR_NUMBER/alertPolicies/POLICY_ID です。

resource-manager tags bindings create コマンドを実行します。

Linux、macOS、Cloud Shell

gcloud resource-manager tags bindings create \
    --tag-value=TAG_VALUE_ID \
    --parent=PARENT

Windows(PowerShell)

gcloud resource-manager tags bindings create `
    --tag-value=TAG_VALUE_ID `
    --parent=PARENT

Windows(cmd.exe)

gcloud resource-manager tags bindings create ^
    --tag-value=TAG_VALUE_ID ^
    --parent=PARENT

次のようなレスポンスが返されます。

'@type': type.googleapis.com/google.cloud.resourcemanager.v3.TagBinding
name: tagBindings/%2F%2Fmonitoring.googleapis.com%2Fprojects%2F1234567890%2FalertPolicies%2F0987654321/tagValues/1029384756
parent: //monitoring.googleapis.com/projects/1234567890/alertPolicies/0987654321
tagValue: tagValues/1029384756
tagValueNamespacedName: my-project/owner/team_a

タグを表示する

ダッシュボードまたはアラート ポリシーに適用されているタグを表示する手順は次のとおりです。

Google Cloud コンソール

タグを表示するリソースタイプを選択します。

ダッシュボード

  1. Google Cloud コンソールで [ダッシュボード] ページに移動します。

    [ダッシュボード] に移動

    検索バーを使用してこのページを検索する場合は、小見出しが [Monitoring] である結果を選択します。

  2. タグを表示するダッシュボードを選択します。
  3. [タグ] をクリックします。ダイアログが開き、関連付けられているすべてのタグが一覧表示されます。

アラート ポリシー

  1. Google Cloud コンソールで、[ ポリシー] ページに移動します。

    [アラート ポリシー] に移動

    検索バーを使用してこのページを検索する場合は、小見出しが [Monitoring] である結果を選択します。

  2. タグを表示するアラート ポリシーを選択します。
  3. [タグ] をクリックします。ダイアログが開き、関連付けられているすべてのタグが一覧表示されます。

gcloud

後述のコマンドデータを使用する前に、次のように置き換えます。

  • PARENT: 親リソースの完全修飾名。たとえば、//monitoring.googleapis.com/projects/PROJECT_ID_OR_NUMBER/dashboards/DASHBOARD_ID//monitoring.googleapis.com/projects/PROJECT_ID_OR_NUMBER/alertPolicies/POLICY_ID です。

resource-manager tags bindings list コマンドを実行します。

Linux、macOS、Cloud Shell

gcloud resource-manager tags bindings list \
    --parent=PARENT

Windows(PowerShell)

gcloud resource-manager tags bindings list `
    --parent=PARENT

Windows(cmd.exe)

gcloud resource-manager tags bindings list ^
    --parent=PARENT

リソースによって継承されたタグを表示するには、--effective フラグを追加します。このフラグを追加すると、次のようなレスポンスが返されます。

  namespacedTagKey: my-project/owner
  namespacedTagValue: my-project/owner/team_a
  tagKey: tagKeys/5647382910
  tagValue: tagValues/1029384756
  inherited: true
  

すべてのタグがリソースに明示的に接続され、タグが継承されていない場合、inherited フィールドは省略されます。

リソースからタグを削除する

ダッシュボードまたはアラート ポリシーに適用されているタグを削除するには、タグ バインディングを削除する必要があります。リソースからタグを削除しても、タグは削除されません。タグを削除する手順については、タグを削除するをご覧ください。

Google Cloud コンソール

タグを削除するリソースタイプを選択します。

ダッシュボード

  1. Google Cloud コンソールで [ダッシュボード] ページに移動します。

    [ダッシュボード] に移動

    検索バーを使用してこのページを検索する場合は、小見出しが [Monitoring] である結果を選択します。

  2. タグを削除するダッシュボードを選択します。
  3. [タグ] をクリックします。
  4. ダイアログで、削除するタグの上にポインタを置き、 [項目を削除] をクリックします。[保存] をクリックして、変更を保存します。
  5. 変更内容を確認するダイアログが表示されます。[確認] をクリックして変更を確定します。

アラート ポリシー

  1. Google Cloud コンソールで、[ ポリシー] ページに移動します。

    [アラート ポリシー] に移動

    検索バーを使用してこのページを検索する場合は、小見出しが [Monitoring] である結果を選択します。

  2. タグを削除するアラート ポリシーを選択します。
  3. [タグ] をクリックします。
  4. ダイアログで、削除するタグの上にポインタを置き、 [項目を削除] をクリックします。[保存] をクリックして、変更を保存します。
  5. 変更内容を確認するダイアログが表示されます。[確認] をクリックして変更を確定します。

gcloud

後述のコマンドデータを使用する前に、次のように置き換えます。

  • TAG_VALUE_ID: タグ値の永続 ID または名前空間付きの名前。例: tagValues/4567890123タグ識別子の詳細については、タグの定義と識別子をご覧ください。
  • PARENT: 親リソースの完全修飾名。たとえば、//monitoring.googleapis.com/projects/PROJECT_ID_OR_NUMBER/dashboards/DASHBOARD_ID//monitoring.googleapis.com/projects/PROJECT_ID_OR_NUMBER/alertPolicies/POLICY_ID です。

resource-manager tags bindings delete コマンドを実行します。

Linux、macOS、Cloud Shell

gcloud resource-manager tags bindings delete \
    --tag-value=TAG_VALUE_ID \
    --parent=PARENT

Windows(PowerShell)

gcloud resource-manager tags bindings delete `
    --tag-value=TAG_VALUE_ID `
    --parent=PARENT

Windows(cmd.exe)

gcloud resource-manager tags bindings delete ^
    --tag-value=TAG_VALUE_ID ^
    --parent=PARENT
レスポンスは空です。

制限事項

ダッシュボードやアラート ポリシーを、関連付けられたタグでフィルタすることはできません。特定のタグが添付されたリソースを一覧表示する場合は、タグとともにラベルを添付し、ラベルでフィルタすることをおすすめします。ラベルの追加については、アラートにラベルでアノテーションを付けるダッシュボードにラベルを追加または削除するをご覧ください。