标记和条件式访问权限

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

如需详细了解标记,请参阅标记概览

标记概览

标记是关联到 Google Cloud 资源的键值对。您可以根据资源是否具有特定标记来有条件地授予 IAM 角色有条件地拒绝 IAM 权限

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

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

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

标记定义和标识符

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

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

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

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

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

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

    在某些情况下,此行为可能会导致主账号获得您不希望其拥有的访问权。

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

    这就是永久性 ID 有助于降低风险的原因:假设您删除一个标记键或值,然后创建一个具有相同名称但不同意义的新键。如果您的条件指的是永久 ID,则该条件不会应用于新的键或值。因此,主账号不太可能获得您不希望其拥有的访问权。

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

访问已标记的资源

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

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

后续步骤