本页面介绍如何将标记与 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
,而标记值可以是永久 IDtagValues/567890123456
。 -
短名称。每个键的简称必须在定义键的项目或组织内具有唯一性,并且每个值的简称对于关联的键而言必须是唯一的。例如,标记键可以具有短名称
env
,标记值可以简称为prod
。 -
命名空间名称:将组织的数字 ID 或项目的 ID 添加到标记键的简称。例如,为组织创建的标记键可以具有命名空间名称
123456789012/env
。如需了解如何获取组织 ID,请参阅获取组织资源 ID。为项目创建的标记键可以具有命名空间名称myproject/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')
后续步骤
- 了解如何管理标记并将标记附加到资源。
- 详细了解条件中的检查标记。