本文档介绍了条件表达式中支持的属性。
支持的条件属性
以下几个部分总结了支持的属性,并指出了可识别每个属性的Cloud de Confiance by S3NS 服务。
资源特性
以下特性与作为请求主体的资源有关。
| 属性 | 用途摘要 | 支持的 Cloud de Confiance 服务 |
|---|---|---|
| 资源服务属性 |
根据正在使用的 Cloud de Confiance 服务管理访问权限。 您可以在允许政策角色绑定中使用此属性。 |
|
| 资源类型特性 |
根据资源类型管理访问权限。 您可以在允许政策角色绑定中使用此属性。 |
|
| 资源名称特性 |
根据资源名称管理访问权限。 您可以在允许政策角色绑定中使用此属性。 |
|
| 资源标记 |
根据关联到资源的标记管理访问权限。 您可以在以下位置使用此属性:
|
所有 Cloud de Confiance 服务(请参阅对继承条件的支持) |
如需详细了解资源属性,请参阅本页面上的资源属性。
请求属性
以下特性与请求的详细信息有关。
| 属性 | 用途摘要 | 支持的 Cloud de Confiance 服务 |
|---|---|---|
|
根据特定 Cloud de ConfianceAPI 或服务提供的数据管理访问权限。 您可以在允许政策角色绑定中使用此属性。 |
|
|
|
设置对 Cloud de Confiance 资源的可过期、计划的或限时的访问权限。 您可以在允许政策角色绑定中使用这些属性。 |
所有 Cloud de Confiance 服务(请参阅对继承条件的支持) |
|
|
指定主账号可以创建的转发规则的类型。例如,您可以允许主账号为内部 Cloud de Confiance by S3NS 负载均衡器(用于处理源自 Cloud de Confiance 网络的流量)创建转发规则,但不允许为外部 Cloud de Confiance 负载均衡器(用于处理源自互联网的流量)创建转发规则。 您可以在允许政策角色绑定中使用这些属性。 |
|
如需详细了解请求特性,请参阅本页面上的请求特性。
支持继承条件
某些类型的 Cloud de Confiance 资源不允许在其允许政策中使用条件。不过,您可以在组织、文件夹或项目级层添加条件角色绑定,其他资源将通过资源层次结构沿用这些角色绑定。如需了解详情,请参阅接受有条件角色绑定的资源类型。
在组织、文件夹或项目级使用特性时,请注意,大多数特性仅适用于特定资源类型。如果条件的一部分使用的属性不可用,则系统绝不会将该部分条件解释为授予访问权限。例如,条件 resource.name.endsWith == devResource 绝不会授予对任何 IAM 资源的访问权限,因为 IAM 资源不提供资源名称。
要避免此问题,请使用本页面介绍的资源类型和资源服务属性来限制条件的范围。例如,对于除 Compute Engine 实例之外的所有资源类型,以下条件的计算结果为 true;而对于 Compute Engine 实例,该条件会检查资源名称:
resource.type != 'compute.googleapis.com/Disk' ||
resource.name.endsWith('devResource')
您不必限制用于检查附加到资源的标记的条件范围。当某个条件检查标记键和值时,无法检查任何其他特性,包括资源类型和资源服务。
资源特性
资源服务、资源类型和资源名称特性通常用于更改角色绑定提供的访问授权的范围。如果角色包含适用于不同资源特定特性的权限,则可以使用基于资源的条件,授予角色权限中针对特定类型或特定服务的一部分权限。
resource.service 属性
借助 resource.service 属性,您可以根据正在使用的Cloud de Confiance 服务设置条件。例如,您可以设置条件,限制用户访问使用 cloudresourcemanager.googleapis.com 服务的资源。如需查看支持的值列表,请参阅资源服务值。
您可以在允许政策角色绑定中使用 resource.service 属性。
| 特性变量 | resource.service |
|---|---|
| 特性类型 |
如需查看支持的值列表,请参阅资源服务值。 |
| 支持的运算符 | , |
| 详细信息 |
在条件中使用 resource.type 特性时,检查与特性完全相等 () 还是完全不相等 ()。其他比较(例如检查前缀或后缀)可能会造成意外的结果。 |
| 示例 |
对 Compute Engine 资源返回 resource.service == "compute.googleapis.com" |
| 支持的服务 |
|
resource.type 特性
借助 resource.type 特性,您可以根据资源类型设置条件。例如,您可以设置条件,限制用户访问 storage.googleapis.com/Object 类型的资源。 如需查看支持的值列表,请参阅资源类型值。
如果您的条件使用 resource.name 特性,我们强烈建议您使用 resource.type 特性来控制条件适用的资源类型。如需了解详情,请参阅本页面上的 resource.name 特性。
您可以在允许政策角色绑定中使用 resource.type 属性。
| 特性变量 | resource.type |
||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 特性类型 |
如需查看支持的值列表,请参阅资源类型值。 |
||||||||||||||||||||||
| 支持的运算符 | , |
||||||||||||||||||||||
| 详细信息 |
在条件中使用 resource.type 特性时,检查与特性完全相等 () 还是完全不相等 ()。其他比较(例如检查前缀或后缀)可能会造成意外的结果。 |
||||||||||||||||||||||
| 示例 |
除非资源是 Compute Engine 映像,否则返回 resource.type != "compute.googleapis.com/Image"
仅当资源是 Compute Engine 映像或永久性磁盘时,才返回 (resource.type == "compute.googleapis.com/Image" || resource.type == "compute.googleapis.com/Disk") |
||||||||||||||||||||||
| 支持的资源类型 |
1 Cloud Key Management Service 将此资源类型用作密钥环资源的父级。 |
resource.name 特性
借助 resource.name 属性,您可以根据资源名称的全部或部分内容设置条件。如需查看资源名称格式列表,请参阅资源名称格式。
resource.name 属性仅适用于本部分表格中列出的特定资源类型。我们强烈建议您将条件的适用范围限制为目标资源类型。如果角色包含对未提供 resource.name 属性的资源类型的权限,您应确保这些权限不受检查 resource.name 的条件的一部分限制。
以下示例演示如何确保此行为。在此示例中,条件允许访问除 Cloud Storage 存储桶和对象以外的所有资源类型。相比之下,对于存储桶和对象,条件仅允许访问存储桶 example-bucket 及其包含的对象:
(resource.type != 'storage.googleapis.com/Bucket' &&
resource.type != 'storage.googleapis.com/Object') ||
resource.name.startsWith('projects/_/buckets/example-bucket')
请注意,条件的第一部分会检查资源是否不是存储桶和对象。如果资源的类型不同,则无论资源名称如何,整个条件求得的值为 true。
另请注意,条件会检查 resource.type 特性而非 resource.service 特性。检查 resource.type 特性有以下几个好处:
- 它会将
resource.name检查限制为适当的资源集。例如,如果您要授予具有特定名称的 Compute Engine 实例的访问权限,则可以排除 Compute Engine 实例以外的所有资源类型。 - 如果服务将来添加了新的资源类型,它将阻止条件范围更改。
最后,请注意,条件使用 startsWith() 函数来评估资源名称,而不是使用 运算符检查是否相等。由于该条件查看资源名称的开头,因此它与存储桶以及该存储桶中的对象匹配。如果检查是否相等,则仅匹配存储桶。
您不能使用 * 等通配符字符来匹配多个资源名称。请考虑以下替代方案:
使用
extract()函数从资源名称中提取值。例如,您可以从 Compute Engine 虚拟机实例的资源名称中提取项目 ID,然后编写引用该项目 ID 的条件表达式。如需了解详情,请参阅本页面上的从特性中提取值。
使用
startsWith()或endsWith()函数编写一个条件,用于评估资源名称的开始或结束。
您可以在允许政策角色绑定中使用 resource.name 属性。
| 特性变量 | resource.name |
||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 特性类型 |
每种资源类型都为资源名称使用一种特定格式。如需查看这些格式的列表,请参阅资源名称格式。 |
||||||||||||||||
| 支持的函数和运算符 |
startsWith(), endsWith(), extract(), ,
|
||||||||||||||||
| 详细信息 |
|
||||||||||||||||
| 示例 |
除非资源名称标识名为 resource.name != "projects/_/buckets/secret-bucket-123"
如果资源名称以指定前缀开头并采用 Compute Engine 虚拟机实例使用的格式,则返回
resource.name.startsWith("projects/project-123/zones/us-east1-b/instances/prod-")
如果资源名称以指定的前缀开头并采用 Cloud Storage 存储桶使用的格式,返回
resource.name.startsWith("projects/_/buckets/my_bucket/objects/test-object-")
如果资源名称以指定的后缀(例如 Cloud Storage 对象的文件扩展名)结尾,则返回
resource.name.endsWith(".jpg")返回项目名称或编号(如果存在):
resource.name.extract("projects/{project}/") |
||||||||||||||||
| 支持的资源类型 |
|
资源标记
借助资源标记函数,您可以根据附加到受支持资源或由这些资源的后代继承的标记设置条件。例如,您可以设置条件,以仅对附加了标记 env: prod 的资源授予角色。如需详细了解如何使用标记控制访问权限,请参阅标记和访问权限控制。
每个标记由一个键和一个值组成。每个键和值都有几种不同类型的标识符:
-
永久 ID,它是全局唯一的,并且永远不能重复使用。例如,标记键可以具有永久 ID
tagKeys/123456789012,而标记值可以是永久 IDtagValues/567890123456。 -
短名称。每个键的短名称必须在定义键的项目或组织内具有唯一性,并且每个值的短名称对于关联的键而言必须是唯一的。例如,标记键可以具有短名称
env,标记值可以简称为prod。 -
命名空间名称,将组织的数字 ID 或项目的 ID 添加到标记键的短名称。例如,为组织创建的标记键可以具有命名空间名称
123456789012/env。如需了解如何获取组织 ID,请参阅获取组织资源 ID。为项目创建的标记键可以具有命名空间名称myproject/env。如需了解如何获取项目 ID,请参阅识别项目。
如需了解如何选择要在条件中使用的标识符类型,请参阅标记定义和标识符。
您可以使用基于标记的条件来限制对任何资源的访问权限。这包括具有其自身标记的资源,以及从其他资源继承标记的资源。如需详细了解如何通过资源层次结构继承标记,请参阅标记继承。
但是, Cloud de Confiance 控制台的某些区域无法识别具有基于标记的条件的允许政策角色绑定。因此,如果您的某个角色具有基于标记的条件, Cloud de Confiance 控制台可能会错误地阻止您执行某些操作。如果您遇到此问题,请使用其他方法(例如 gcloud CLI)来执行相应操作。
您可以在以下情况下使用基于标记的条件:
- 允许政策角色绑定
- 拒绝政策拒绝规则
您可以使用以下函数根据标记设置条件:
| 函数 | 说明 |
|---|---|
resource.hasTagKey(
bool
|
检查请求的资源是否包含具有指定键的标记。标记键通过其命名空间名称查找。如需使用标记键的永久 ID 检查是否存在标记键,请使用函数
|
resource.hasTagKeyId(
bool
|
检查请求的资源是否包含具有指定键的标记。标记键通过其永久 ID 查找。如需使用标记键的命名空间名称检查是否存在标记键,请使用函数
|
resource.matchTag(
bool
|
检查请求的资源是否包含带有指定键和值的标记。键通过其命名空间名称查询,值通过其短名称查询。如需使用永久 ID 检查标记键和值,请使用函数
|
resource.matchTagId(
bool
|
检查请求的资源是否包含带有指定键和值的标记。键和值通过其永久 ID 查找。如需使用标记键的命名空间名称和使用其短名称的值检查标记键,请使用函数
|
请求属性
通过“请求属性”,您可以创建条件来评估请求的详细信息,例如请求修改的角色或请求的日期和时间。
API 特性
API 属性可帮助您根据特定Cloud de Confiance API 或服务提供的数据管理访问权限。您可以在允许政策角色绑定中使用 API 属性。
如需查看何时可能需要在条件中使用 API 属性的示例,请参阅以下页面:
并非所有服务都可以识别 API 特性。以下部分介绍了哪些服务可识别每个 API 特性。
适用于 API 特性的函数
您可以使用以下函数来处理 API 特性:
| 函数 | 说明 | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
api.getAttribute(
V<T>
|
获取请求的 API 属性。
|
||||||||||||
hasOnly(
bool |
检查列表是仅包含允许的项,还是其中部分项。您可以对
|
IAM API 特性
IAM 提供以下 API 属性:
| 特性变量 | iam.googleapis.com/modifiedGrantsByRole |
|---|---|
| 特性类型 | list<string> |
| 详细信息 |
对于用于设置资源的允许政策的请求,此特性包含请求修改的角色绑定中的角色名称。 对于其他类型的请求,该特性未定义。 |
| 接受此特性的资源类型 |
以下资源类型接受其允许政策中具有
|
| 可识别此特性的服务 |
以下服务可识别
|
日期/时间属性
日期/时间属性用于设置对 Cloud de Confiance 资源的可过期、计划的或限时的访问权限。您可以在允许政策角色绑定中使用日期/时间属性。
所有 Cloud de Confiance 服务和资源类型都支持此属性。如需了解如何将日期/时间条件应用于不直接支持它们的资源,请参阅本页面上的对继承条件的支持。
request.time 特性包含请求的时间戳。您可以将此时间戳与另一个时间戳或时长进行比较。
以下部分列出了可用于根据时间戳和时长设置条件的函数。
创建、比较和修改时间戳和时长
| 函数或运算符 | 说明 |
|---|---|
date(
Timestamp |
将日期从
|
duration(
Duration |
将时长从
|
timestamp(
Timestamp |
将
|
, , , |
比较两个
|
|
|
从时间戳中提取信息
您可以使用本部分中的函数从时间戳中提取信息,例如时间戳所在的星期几。
在 IAM Conditions 中,所有时间戳均采用世界协调时间 (UTC)。但是,您可能希望根据其他时区提取信息。例如,您可能想知道某个世界协调时间 (UTC) 时间戳是否是德国柏林时区的星期一。
如需指定其他时区,请将时区传递给函数。使用 IETF 时区数据库中的名称或世界协调时间 (UTC) 偏移量。例如,您可以使用 Europe/Berlin 或 +01:00 表示中欧时间 (CET)。
| 支持的函数和运算符 | 说明 |
|---|---|
Timestamp.getDate(
int
|
从
|
Timestamp.getDayOfMonth(
int
|
从
|
Timestamp.getDayOfWeek(
int
|
从
|
Timestamp.getDayOfYear(
int
|
从
|
Timestamp.getFullYear(
int
|
从
|
Timestamp.getHours(
int
|
从
您可以将此函数与
|
Timestamp.getMilliseconds(
int
|
从
|
Timestamp.getMinutes(
int
|
从
|
Timestamp.getMonth(
int
|
从
|
Timestamp.getSeconds(
int
|
从
|
, , , |
比较此表中两个函数的输出。 |
转发规则特性
借助转发规则属性,您可以指定主账号可以创建的转发规则的类型。例如,您可以允许主账号为内部 Cloud de Confiance by S3NS负载均衡器(用于处理源自 Cloud de Confiance 网络的流量)创建转发规则,但不允许为外部 Cloud de Confiance负载均衡器(用于处理源自互联网的流量)创建转发规则。您可以在允许政策角色绑定中使用转发规则属性。
对于 Cloud Load Balancing,转发规则属性不会影响创建 Cloud de Confiance 负载均衡器的其他组件(例如后端服务、目标代理、健康检查和网址映射)的能力。
支持的函数
| 函数 | 说明 |
|---|---|
compute.isForwardingRule
bool
|
检查请求是否正在创建转发规则。
|
compute.matchLoad
bool
|
检查请求是否会影响指定类型的负载均衡方案。如需查找每种负载均衡方案的标识符以及更多详细信息,请参阅在 Cloud de Confiance 负载均衡器上使用 IAM Conditions。
|
支持的资源类型
此特性适用于创建以下资源类型的请求:
| 服务 | 资源类型 |
|---|---|
| Cloud Load Balancing | 转发规则 |
| Cloud VPN | 转发规则(全球和区域) |
| Compute Engine | 转发规则(用于协议转发) |
| Cloud Service Mesh1 | 转发规则 |
1 使用 Compute Engine 的资源特性。
从特性中提取值
您可以使用 extract() 函数从特性中提取值。例如,您可以提取资源名称的任意部分,然后编写引用您所提取的文本的条件表达式。
如需使用 extract() 函数,请提供一个提取模板,用于指定要提取的特性部分。例如,如果您要从 Compute Engine 虚拟机实例的资源名称中提取项目 ID,可以使用模板 projects/{project}/。
提取模板包含以下组成部分:
括号内的标识符,用于标识要提取的子字符串。
请选择一个有意义的简短标识符,明确指出要提取的值。您可以使用从
A到Z的大写和小写字母、数字和下划线 (_)。在模板
projects/{project}/中,标识符为project。可选:前缀,它必须出现在要提取的子字符串之前。
在模板
projects/{project}/中,前缀为projects/。可选:后缀,它必须出现在要提取的子字符串之后。
在模板
projects/{project}/中,后缀为/。
extract() 函数会根据提取模板具有前缀、后缀还是两者兼有来提取不同属性部分:
| 有前缀 | 有后缀 | 提取的值 |
|---|---|---|
| — | — | 整个属性 |
| — | 第一处出现的前缀后的字符,如果前缀后面没有字符,则为空字符串 | |
| — | 第一处出现的后缀前的字符,如果后缀前面没有字符,则为空字符串 | |
| 第一处出现的前缀与其后第一处出现的后缀之间的字符,如果该前缀与该后缀之间没有字符,则为空字符串 |
如果您指定的前缀或后缀未出现在属性中,或后缀仅出现在前缀之前,则 extract() 函数会返回空字符串。
以下示例展示了几个不同提取模板的输出结果。这些示例引用了 Cloud Storage 对象的资源名称 projects/_/buckets/acme-orders-aaa/objects/data_lake/orders/:
| 提取模板 | 输出 |
|---|---|
/order_date={date}/ |
2019-11-03 |
buckets/{name}/ |
acme-orders-aaa |
/orders/{empty}order_date |
“string”为空 |
{start}/objects/data_lake |
projects/_/buckets/acme-orders-aaa |
orders/{end} |
order_date=2019-11-03/aef87g87ae0876 |
{all} |
projects/_/buckets/acme-orders-aaa/objects/data_lake/orders/ |
/orders/{none}/order_date= |
“string”为空 |
/orders/order_date=2019-11-03/ |
“string”为空 |
如果您提取表示日期的字符串,则可以使用本页面上的日期/时间函数和运算符将提取的值转换为 Timestamp。如需查看示例,请参阅配置基于资源的访问权限。