生效条件

最近更新时间:2019-08-12 17:06:37

使用场景

在很多场景下,我们需要对创建的策略进一步约束生效的条件 condition 。
场景1: CAM 用户调用云 API 时,需要限制用户访问来源,则要求在现有的策略基础上加上 IP 条件。
场景2:当 CAM 用户在调用 VPC 对等连接 API 时,除了需要判断 CAM 用户是否拥有对等连接 API 和对等连接资源的访问权限外,还需要确认 CAM 用户是否拥有对等连接关联的 VPC 的访问权限。

语法结构

生效条件的语法结构如下图所示。一个条件块可以由若干个子条件块 sub block 构成,每个子条件块 sub block 对应一个条件操作符和若干个多个条件键,每个条件键对应了若干个条件值。

评估逻辑

条件生效的评估逻辑如下所述:

  1. 条件键会对应到多个条件值,只要上下文信息中的对应键值在关联的条件操作符作用下满足其中任意一个条件值,则条件生效。

  2. 对于一个子条件块中存在多个条件键的情况下,只有每个条件键对应的条件都生效时,该子条件块才生效。

  3. 对于包含多个子条件块的情况,只有每个子条件块都生效时,整个条件才生效。

  4. 对于包含 ifexist 后缀的条件操作符,即使上下文信息中不包含条件操作符所关联的条件键,该条件依然生效。

  5. 对于 for_all_value :限定词约束的条件操作符,适用于上下文信息中的条件键包括多个值的场景。只有当上下文信息中的条件键的每个值在关联的条件操作符作用下生效时,整个条件才生效。

  6. 对于 for_any_value :限定词约束的条件操作符,适用于上下文信息中的条件键包括多个值的场景。只要上下文信息中的条件键的任意一个值在关联的条件操作符作用下生效时,整个条件就可以生效。

使用示例

  1. 以下示例表示用户必须在 10.217.182.3/24 或者 111.21.33.72/24 网段才能调用云 API 。
    {
    "version": "2.0",
    "statement": {
     "effect": "allow",
     "action": "cos:PutObject",
     "resource": "*",
     "condition": {"ip_equal": {"qcs:ip": ["10.217.182.3/24", "111.21.33.72/24"]}}
    }
    }
  2. 以下示例描述允许 VPC 绑定指定的 NAT 网关, VPC 的地域必须是上海。
    {
    "version": "2.0",
    "statement": {
    "effect": "allow",
    "action": "name/vpc:AcceptVpcPeeringConnection",
    "resource": "qcs::vpc:sh::pcx/2341",
    "condition": {"string_equal_if_exist": {"vpc:region": "sh"}}
    }
    }

条件操作符列表

下表是条件操作符、条件名以及示例的信息。每个产品自定义的条件键,请参阅对应的产品文档。

条件操作符 含义 条件名 举例
string_equal 字符串等于(区分大小写) qcs:tag {"string_equal":{"qcs:tag/tag_name1":"tag_value1"}}
string_not_equal 字符串不等于(区分大小写) qcs:tag {"string_not_equal":{"qcs:tag/tag_name1":"tag_value1"}}
string_equal_ignore_case 字符串等于(不区分大小写) qcs:tag {"string_equal_ignore_case":{"qcs:tag/tag_name1":"tag_value1"}}
string_not_equal_ignore_case 字符串不等于(不区分大小写) qcs:tag {"string_not_equal_ignore_case":{"qcs:tag/tag_name1":"tag_value1"}}
string_like 字符串匹配(区分大小写) qcs:tag {"string_like":{"qcs:tag/tag_name1":"tag_value1"}}
string_not_like 字符串不匹配等于(区分大小写) qcs:tag {"string_not_like":{"qcs:tag/tag_name1":"tag_value1"}}
date_not_equal 时间不等于 qcs:current_time {"date_not_equal":{"qcs:current_time":"2016-06-01T00:01:00Z"}}
date_greater_than 时间大于 qcs:current_time {" date_greater_than ":{"qcs:current_time":"2016-06-01T00:01:00Z"}}
date_greater_than_equal 时间大于等于 qcs:current_time {" date_greater_than_equal ":{"qcs:current_time":"2016-06-01T00:01:00Z"}}
date_less_than 时间小于 qcs:current_time {" date_less_than ":{"qcs:current_time":"2016-06-01T 00:01:00Z"}}
date_less_than_equal 时间小于等于 qcs:current_time {" date_less_than ":{"qcs:current_time":"2016-06-01T 00:01:00Z"}}
date_less_than_equal 时间小于等于 qcs:current_time {"date_less_than_equal ":{"qcs:current_time":"2016-06-01T00:01:00Z"}}
ip_equal ip等于 qcs:ip {"ip_equal":{"qcs:ip ":"10.121.2.10/24"}}
ip_not_equal ip不等于 qcs:ip {"ip_not_equal":{"qcs:ip ":["10.121.2.10/24", "10.121.2.20/24"]}}
numeric_not_equal 数值不等于 qcs:mfa {" numeric_not_equal":{"mfa":1}}
numeric_greater_than 数值大于 - {"numeric_greater_than ":{"cvm_system_disk_size":10}}
numeric_greater_than_equal 数值大于等于 - {"numeric_greater_than_equal ":{"cvm_system_disk_size":10}}
numeric_less_than 数值小于 - {"numeric_less_than ":{"cvm_system_disk_size":10}}
numeric_less_than_equal 数值小于等于 - {"numeric_less_than_equal ":{"cvm_system_disk_size":10}}
numeric_equal 数值等于 qcs:mfa {" numeric_equal":{"mfa":1}}
numeric_greater_than 数值大于 - {"numeric_greater_than ":{"some_key":11}}
bool_equal 布尔值匹配 - -
null_equal 条件键为空匹配 - -

说明:

  1. 日期格式按照 ISO8601 标准表示,并需要使用 UTC 时间。

  2. IP 格式要符合 CIDR 规范。

  3. 条件操作符(null_equal除外)加上后缀 ifexist,表示上下文信息中即便不包含对应的键值依然生效。

  4. for_all_value :限定词搭配条件操作符使用,表示上下文信息中条件键的每个值都满足要求时才生效。

  5. for_any_value :限定词搭配条件操作符使用,表示上下文信息中条件键的任意一个值满足要求时就可以生效。

  6. 部分业务不支持条件,或仅支持部分条件。具体信息参考业务文档说明。