标记和访问权限控制

本页简要介绍标记。此外,它还介绍了如何将标记与 Identity and Access Management (IAM) 搭配使用,帮助您控制对 Google Cloud 资源的访问权限。

标记概览

标记是关联到组织、文件夹或项目的键值对。您可以根据资源是否拥有特定标记,有条件地授予 IAM 角色

其他资源会从其父级组织、文件夹和项目中继承标记值。因此,您可以使用标记来管理对任何 Google Cloud 资源的访问权限。

标记的常见用途

以下是管理通过标记访问的一些常见用例:

  • 开发环境、模拟环境和生产环境。 例如,您可以将 environment: dev 标记添加到开发环境中,以将 environment: prod 添加到您的生产环境中。
  • 组件类型。例如,您可以将 component: frontend 标记添加到前端资源,将 component: batch 添加到资源以进行批量处理。
  • 项目名称。例如,如果您的团队正在处理代号为 Atlas 的项目,则可以将 project: atlas 标记添加到团队的开发资源中。

标记和资源层次结构

在 Google Cloud 中,资源是层次结构的一部分,较低级层的资源可以沿用更高级别的资源的属性。标记是资源可继承的属性之一。例如,如果您将标记关联到组织,则该组织中的文件夹、项目和服务专属资源将继承该标记。

为防止资源沿用标记值,请使用与具有相同较高级别组织或文件夹中的标记相同的键,将另一个标记关联到文件夹或项目。实际上,组织或文件夹上的每个标记均提供默认值,而较低级层资源(例如文件夹或项目)上的每个标记都会替换默认值。

例如,假设您将标记 environment: dev 应用于文件夹,并且该文件夹有两个名为 team-ateam-b 的子文件夹。您还可以将不同的标记 environment: test 应用于 team-b 文件夹。因此,team-a 文件夹中的资源会沿用标记 environment: dev,而 team-b 文件夹中的资源会继承标记 environment: test

如果您从 team-b 文件夹中移除 environment: test 标记,则该文件夹及其资源将继承 environment: dev 标记。

标记定义和标识符

在将标记关联到资源之前,必须定义标记的键,以及标记允许的值。这些定义与您的组织相关联。您可以使用 Resource Manager 来管理标记定义。如需了解详情,请参阅创建和定义新标记

每个标记键和值都有几种不同的标识符:

  • 永久 ID,它是全局唯一的,并且永远不能重复使用。例如,标记键可以具有永久 ID tagKeys/123456789012,而标记值可以是永久 ID tagValues/567890123456
  • 短名称。每个键的短名称必须在您的组织内具有唯一性,并且每个值的简短名称对于关联的键而言必须是唯一的。例如,标记键可以具有短名称 env,标记值可以简称为 prod
  • 命名空间名称,用于将组织的数字 ID 添加到标记键的短名称。例如,标记键可以具有命名空间名称 123456789012/env了解如何获取组织 ID

如本页所述,将标记关联到资源后,您可以编写条件以根据标记授予访问权限。如需写入条件,您必须选择要在条件中使用的标识符类型。 请遵循以下指南选择:

  • 要试用标记,请考虑使用命名空间名称(对于键)和短名称(用于值)。这些标识符更容易理解和记住,尤其是在您开始使用时。
  • 如果您以声明方式来管理配置,请使用 Terraform 等工具,请考虑使用命名空间名称(如果是密钥)和简称(用于值)。您可以随着时间的推移重复使用这些标识符,这意味着某个声明工具可以删除并重新创建它们,您的条件将继续有效。

    这种方法存在权衡:假设您删除一个标记键或值,然后创建一个具有相同名称但具有相同含义的新键或值。如果您的条件指的是命名空间名称或短名称,则条件将继续应用于新键或值。

    在某些情况下,此行为可能会导致成员获得您原本不想拥有的访问权限。

  • 为最大限度地降低风险,请考虑使用永久重复使用的永久 ID。

    这就是永久性 ID 有助于降低风险的原因:假设您删除一个标记键或值,然后使用相同的名称或新的方式创建新键或值。如果您的条件引用永久 ID,则该条件不会应用于新的键或值。因此,他们不太可能获得您原本不打算拥有的访问权限。

    一个缺点是,如果您删除并重新创建键和值,并且希望保留成员的访问权限,则还必须更新 IAM 政策以引用新的永久 ID。

访问已标记的资源

您可以根据 IAM 条件使用标记来授予角色,具体取决于资源关联到或继承的标记。如果某个条件计算结果为 true,则授予访问权限;否则,系统不会授予访问权限。如需了解详情,请参阅 IAM 条件概览

下面的部分显示了检查资源标记的条件表达式示例。该条件会调用不同的函数,具体取决于它是检查永久 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')

后续步骤