使用标记控制对资源的访问权限

本文档介绍了如何使用标记来控制对 Cloud Monitoring 信息中心和提醒政策的访问权限。标记是您创建并附加到资源的键值对。通过将标记与 Identity and Access Management (IAM) 条件或拒绝政策相结合,您可以限制哪些人可以修改或删除特定信息中心和提醒政策。

访问权限控制模式

您可以使用以下任一模式为信息中心和提醒政策实现访问权限控制:

  • 控制对 Terraform 管理的资源的访问权限:使用标记和 IAM 拒绝政策,以便只有 Terraform 可以修改带有标记的资源。Terraform 管理的资源可防止在 Google Cloud 控制台中或通过其他客户端进行未经批准的手动更改。

  • 控制对团队管理资源的访问权限:使用团队专用标记和有条件的 IAM 角色授予,确保只有特定团队的成员可以修改或删除团队管理的信息中心和提醒政策。

保护由 Terraform 管理的资源

本部分介绍如何使用标记和 IAM 拒绝政策,以便只能使用配置为使用 Terraform 的服务账号来修改或删除带有标记的控制面板和提醒政策。

准备工作

如需获得为项目配置标记和 IAM 拒绝政策所需的权限,请让管理员向您授予项目或组织的以下 IAM 角色:

如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

您也可以通过自定义角色或其他预定义角色来获取所需的权限。

使用拒绝政策保护资源

Google Cloud 控制台

  1. 创建标记,指明资源由 Terraform 管理。例如,创建一个标记键 edit_restriction,并为其指定标记值 terraform_only
  2. 创建 IAM 拒绝政策,以在资源具有 edit_restriction:terraform_only 标记时,拒绝向所有主账号(您的 Terraform 服务账号除外)授予更新和删除权限。

    拒绝政策必须包含以下配置:

    • 要拒绝的权限
      • monitoring.dashboards.update
      • monitoring.dashboards.delete
      • monitoring.alertPolicies.update
      • monitoring.alertPolicies.delete
    • 条件:资源必须具有 edit_restriction:terraform_only 标记。
    • 豁免:将 Terraform 服务账号的主账号标识符添加到拒绝规则的例外列表。
  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
}

配置团队范围的访问权限

假设您是某个项目的管理员,该项目负责监控多个团队的应用。您希望团队成员能够创建信息中心和提醒政策,但只能修改自己团队的资源。您不希望向团队成员授予广泛的 Monitoring Editor 角色 (roles/monitoring.editor),因为该角色授予了修改项目中所有监控资源的权限。

本部分说明了如何使用标记向团队成员授予仅编辑团队拥有的信息中心和提醒政策所需的权限。

准备工作

如需获得为项目配置标记和 IAM 角色所需的权限,请让管理员向您授予项目或组织的以下 IAM 角色:

如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

您也可以通过自定义角色或其他预定义角色来获取所需的权限。

应用特定于团队的标记

Google Cloud 控制台

  1. 为每个团队创建标签。创建新的标记键,然后为该键创建标记值。例如,如果您创建了一个名为 owner 的标记键,其值为 team_ateam_b,那么您将获得两个标记:owner:team_aowner:team_b。记录每个标记的标记键 ID 和值 ID。
  2. 创建自定义角色,将其命名为“信息中心和提醒政策创建者”,并添加以下权限:

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

    此角色可让您创建信息中心和提醒政策,以及应用标记。

  3. 向所有团队成员授予以下角色

    • 信息中心和提醒政策创建者(您创建的自定义角色)
    • Monitoring Viewer (roles/monitoring.viewer)
    • Tag Viewer (roles/resourcemanager.tagViewer)
  4. 对于每个团队,向团队成员授予以下角色,并附加 IAM 条件

    • Tag User (roles/resourcemanager.tagUser),可让您将团队的标记应用于资源。
    • Monitoring Editor (roles/monitoring.editor),可用于修改带有您团队标记的信息中心和提醒政策。

    按如下方式向角色授予添加 IAM 条件:

    • 条件类型Tag
    • 运算符has value ID
    • keyIDKEY_ID
    • valueIDTEAM_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. 向所有成员授予自定义角色、Monitoring Viewer 角色 (roles/monitoring.viewer) 和 Tag Viewer 角色 (roles/resourcemanager.tagViewer)。
  5. 为每个团队授予 Tag User 角色 (roles/resourcemanager.tagUser) 和 Monitoring Editor 角色 (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 角色:

  • Monitoring Viewer (roles/monitoring.viewer)
  • Tag 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 控制台中,前往 信息中心页面:

    前往信息中心

    如果您使用搜索栏查找此页面,请选择子标题为监控的结果。

  2. 选择要附加标记的信息中心。
  3. 点击代码
  4. 在对话框的直接标记部分中,选择在其中创建标记的组织或项目以找到标记。例如,如需使用在项目级创建的标记,请选择选择当前项目作为范围。

    您还可以选择手动输入选项,以便手动搜索项目、组织或标记 ID。

  5. 选择相应的键值对,然后点击保存
  6. 系统会显示一个对话框,以确认您的更改。点击确认以最终完成更改。

提醒政策

  1. 在 Google Cloud 控制台中,前往 政策页面:

    前往提醒政策

    如果您使用搜索栏查找此页面,请选择子标题为监控的结果。

  2. 选择要附加标记的提醒政策。
  3. 点击代码
  4. 在对话框的直接标记部分中,选择在其中创建标记的组织或项目以找到标记。例如,如需使用在项目级创建的标记,请选择选择当前项目作为范围。

    您还可以选择手动输入选项,以便手动搜索项目、组织或标记 ID。

  5. 选择相应的键值对,然后点击保存
  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 控制台中,前往 信息中心页面:

    前往信息中心

    如果您使用搜索栏查找此页面,请选择子标题为监控的结果。

  2. 选择要查看标记的信息中心。
  3. 点击代码。系统会打开一个对话框,其中列出了所有附加的标记。

提醒政策

  1. 在 Google Cloud 控制台中,前往 政策页面:

    前往提醒政策

    如果您使用搜索栏查找此页面,请选择子标题为监控的结果。

  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 控制台中,前往 信息中心页面:

    前往信息中心

    如果您使用搜索栏查找此页面,请选择子标题为监控的结果。

  2. 选择要从中移除代码的信息中心。
  3. 点击代码
  4. 在对话框中,将指针悬停在要移除的标记上,然后点击 删除项。点击保存以保存更改。
  5. 系统会显示一个对话框,以确认您的更改。点击确认以最终完成更改。

提醒政策

  1. 在 Google Cloud 控制台中,前往 政策页面:

    前往提醒政策

    如果您使用搜索栏查找此页面,请选择子标题为监控的结果。

  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
响应为空。

限制

您无法按附加的标记过滤信息中心或提醒政策。如果您想列出附加了特定标记的资源,建议您附加一个标签以及该标记,然后按该标签进行过滤。如需了解如何添加标签,请参阅使用标签为提醒添加注释向信息中心添加标签或从信息中心移除标签