You need to enable JavaScript to run this app.
导航
条件(Condition)
最近更新时间:2024.09.06 12:09:16首次发布时间:2023.09.05 16:43:00

条件(Condition) 是可选的元素,定义了权限声明的生效条件。IAM区别于RBAC模型的关键在于提供了基于属性的访问控制(ABAC),定义权限时不再局限于定义“何种主体通过何种操作访问何种客体”,而是可以进一步通过主客体的属性信息及请求中的属性信息进行访问控制,基于此特性,您可定义出十分精细的访问权限,从而最大化保障云上各类复杂访问场景的安全性。如需了解云服务对Condition的支持情况可参考 云服务支持的条件键列表

原理

请求上下文

用户访问云服务的API请求中包含着丰富的请求上下文信息,这些信息可以分类为“身份属性”(主体属性)、“资源属性”(客体属性)、“请求属性”、“环境属性”。
alt

  • 身份属性: 请求身份的属性,例如PrincipalTag(身份标签)、PrincipalTrn(身份资源标识);

  • 请求属性: 请求中定义对资源的操作信息,一般通过请求参数进行传递。请求参数分为公共参数和非公共参数。公共参数是构造签名请求中的必填参数(参考API调用指南 - 公共参数)。非公共参数为云服务提供的API参数,通常放置于Query或Body中进行传递,例如RequestTag(请求为云资源附加的标签);

  • 环境属性: 请求发生时的环境信息,例如IP(访问的IP地址);

  • 资源属性: 资源上的属性,例如ResourceTag(资源标签)。

权限策略

IAM的基于属性的访问控制是通过策略声明中的Condition元素定义的,以下是一条带有Condition的策略示例:

{
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "alb:*"
      ],
      "Resource": [
        "*"
      ],
      "Condition": {
        "IpAddress": {
          "volc:SourceIp":"8.8.8.8"
        }
      }
    }
  ]
}

解读: 该条策略限制仅能从IP地址8.8.8.8(仅作为示例,非真实IP)中访问应用型负载均衡的全部操作。

Condition语法

说明

特殊情况:火山引擎对象存储(TOS)的策略语法及功能逻辑可能存在不同,如需对对象存储配置Condition权限,请参考对象存储的帮助文档

策略中单条Condition由Operator(运算符)Condition Key(条件键)Condition Value(条件值) 三个部分组成。其中对于多值类型的Condition Key,需要在Operator前添加多值匹配符。当判断条件需要满足Condition Key在请求上下文中存在的前提时,需要在Operator前添加IfExists运算符。

alt

以下面这条Condition为例,StringEquals为Operator,volc:RequestTag/apartment为Condition Key,财务为Condition Value:

{
      "Condition": {
        "StringEquals": {
          "volc:RequestTag/apartment": "财务"
        }
      }
}

在策略声明中可以有多条condition,一个condition中可以有多对条件键,每个条件键对应的条件值可以是多个(表达为数组形式),例如:

{
      "Condition": {
        "StringEqualsIgnoreCase": {
          "volc:RequestTag/apartment": ["财务","行政","研发"],
          "volc:ResourceTag/project":["游戏项目","短视频项目"]
        },
        "IpAddress": {
          "volc:SourceIp": "203.0.113.0/24"
        }
      }
}

Condition运算逻辑可参考下图:

  • AND代表“逻辑与”关系,OR代表“逻辑或”关系。

alt

对应上述的策略示例中,Condition的组成结构如下:

运算符(Operator)

指条件运算符,例如StringEquals代表字符串精确匹配。运算符包括基本运算符和运算修饰符。运算符大小写敏感,需要确保在策略中正确书写

基本运算符

支持的基本运算符如下:

运算符类型
运算符类型说明
运算符
运算符说明

String

字符串运算

StringEquals

字符串精确匹配(大小写敏感)

StringNotEquals字符串精确不匹配(大小写敏感)
StringEqualsIgnoreCase字符串精确匹配(忽略大小写)
StringNotEqualsIgnoreCase字符串不匹配(忽略大小写)
StringLike字符串模糊匹配(大小写敏感)(使用该运算符时符号*或?会作为通配符处理,使用StringEquals时会作为普通字符处理)
StringNotLike字符串模糊不匹配(大小写敏感)(使用该运算符时符号*或?会作为通配符处理,使用StringNotEquals时会作为普通字符处理)

IP Address

IP地址运算
(IP v4 或IP v6,支持地址段)

IpAddress

IP地址或地址段匹配

NotIpAddressIP地址或地址段不匹配

Numeric

数字运算
(Integer 或Decimal)

NumericEquals

数值等于

NumericNotEquals数值不等于
NumericLessThan数值小于
NumericLessThanEquals数值小于等于
NumericGreaterThan数值大于
NumericGreaterThanEquals数值大于等于

Date and time

日期与时间运算
(使用UTC时间,精确到秒,支持遵循ISO 8601的标准格式:YYYY-MM-DD'T'HH:MM:SS'Z'或UNIX时间戳,例如2023-08-30T23:59:59Z)

DateEquals

日期时间等于

DateNotEquals日期时间不等于
DateLessThan日期时间早于
DateLessThanEquals日期时间不晚于
DateGreaterThan日期时间晚于
DateGreaterThanEquals日期时间不早于

Boolean

布尔运算
(true 或false)

Bool

布尔匹配(true 或false)

TRN

全局资源名称(TRN)运算

TrnEquals

TRN精确匹配(大小写敏感)。TRN中可包含通配符,在匹配逻辑上与StringLike相同,但使用TrnEquals时,系统会对Condition value进行格式的合法性检查

TrnNotEqualsTRN精确不匹配(大小写敏感)。TRN中可包含通配符,在匹配逻辑上与StringNotLike相同,但使用TrnNotEquals时,系统会对Condition value进行格式的合法性检查

Null

条件键存在性运算
(比对值为true或false)

Null

检查条件键在请求上下文中是否存在,当不存在时返回true,存在时返回false。使用该运算符时,Condition value必须为true或false,以对Null检查的返回结果进行比对

运算修饰符

IfExists修饰符

在某些场景里,请求上下文中条件键可能不存在,当希望条件键不存在可跳过匹配时,可以在Operator中添加IfExists修饰符,例如以下条件代表当求上下文中包含volc:UserName条件键时,仅在条件值等于bob时可通过匹配;当请求上下文中不包含volc:UserName条件键时,条件可直接通过匹配:

{
      "Condition": {
        "StringEqualsIfExists": {
          "volc:UserName":"bob"
        }
      }
}

多值修饰符

在某些场景里,同一个属性在请求上下文中可能会有多个属性值,这时候需要使用多值修饰符来定义多值的匹配方式,多值修饰符包括ForAllValuesForAnyValue
- ForAllValues:请求上下文中的必须包含条件键且全部条件值均匹配通过(注意:无条件值时即条件值为空集,空集是任何集合的子集,因此也可匹配通过);
- ForAnyValue:请求上下文中必须包含条件键且至少有一个条件值匹配通过 。

例如下面这条Condition同时使用了IfExistsForAnyValue,表示当请求传递了标签(RequestTagKeys)时,标签键必须是"department"(IfExists让未传递标签的情况依然可以通过Condition的匹配,ForAnyValue要求请求中传递多对标签时,每一对标签键都必须等于"department"。因标签键在请求时无法重复,因此这条Condition等同于限制了用户若传递标签则仅能传递标签键为"department"的标签)。

{
      "Condition": {
        "ForAnyValue:StringEqualsIfExists": {
          "volc:RequestTagKeys": "department"
        }
      }
}

条件键(Condition key)

条件键指定了请求上下文中的待运算的属性字段,例如volc:PrincipalTrn(代表请求身份的TRN)。其中身份属性、请求属性中的公共参数部分、环境属性通常会作为全局条件键,请求属性中的非公共参数部分、资源属性通常作为服务条件键

  • 条件键格式为${ServiceCode}:${ConditonKeyName},${ServiceCode}为具体云服务的Service,全局条件键使用volc关键字(即格式为volc:${ConditionKeyName})。条件键大小写敏感,需要确保在策略中正确书写
  • 某些条件键在每次请求的上下文中可能会有多个值,这类条件键称为多值类型条件键;某些条件键在每次请求的上下文中至多会有一个值,这类条件键称为单值类型条件键。多值类型条件键需要使用多值修饰符(参考上方运算修饰符小节)。

说明

一些属性的属性值本身是key-value结构,这时候属性值中的key可以作为Condition key中的一部分。例如volc:RequestTag/${TagKey}(这里的${TagKey}需要代入具体的标签键)。

以下是访问控制支持的条件键及说明:

条件键
说明
存在性
值类型
支持的运算符
volc:RequestedRegion请求的Region,例如cn-beijing所有请求均存在单值String
volc:CurrentTime请求的时间,使用UTC时间,精确到秒,支持遵循ISO 8601的标准格式:YYYY-MM-DD'T'HH:MM:SS'Z'或UNIX时间戳,例如2023-08-30T23:59:59Z所有请求均存在单值Date and time

volc:SourceIp

请求的IP。支持IP v4和IP v6,支持地址段。注意:该条件键支持公网IP地址,对于内网访问当前仅支持cn-beijing

所有请求均存在

单值

IP Address

volc:ViaConsole

请求是否来自于控制台,true代表登录控制台访问,false代表编程请求API

所有请求均存在

单值

Boolean

volc:UserName请求的IAM子用户的用户名当使用IAM子用户直接进行请求时存在单值String

volc:PrincipalTrn

请求身份的TRN

  • User身份访问(包括用户sso):trn:iam::${AccountId}:user/${UserName}

  • 角色扮演后的临时凭证访问(包括角色sso):trn:iam::${AccountId}:role/${RoleName}

  • Root user身份访问(必须是主账号/根用户访问,主账号内的子用户、角色等身份访问不在生效范围内):trn:iam::${AccountId}:root

使用账号内IAM身份请求时均存在

单值

String和TRN

volc:RequestTagKeys请求传递的全部标签键,包括涉及标签附加或标签解除的请求传递的标签,不包含查询接口按标签过滤时传递的标签涉及标签附加、标签解除的请求中存在多值String
volc:RequestTag/tag_key请求时传递的标签中标签键为tag_key的标签值,包括涉及标签附加或标签解除的请求传递的标签,不包含查询接口按标签过滤时传递的标签涉及标签附加、标签解除的请求中存在单值String

volc:PrincipalTag/tag_key

请求的IAM身份标签中标签键为tag_key的标签值

  • User直接访问时,PrincipalTag为User上绑定的标签

  • User扮演角色访问时,PrincipalTag为Role上绑定的标签+Session Tag(当Role上的TagKey和Session Tag的TagKey存在重复时,Session Tag将覆盖Role Tag)

使用IAM子用户或角色访问时存在

单值

String

volc:ResourceTag/tag_key请求访问的资源的标签中标签键为tag_key的标签值。该条件要求请求中必须传递资源ID,对于部分列表类接口,请求不传递资源ID时代表查询全部资源,此时请求将无法鉴权通过请求的支持标签的云资源时存在单值String

条件值(Condition value)

条件值限制了条件生效所需匹配成功的属性值范围,条件值可以是数组,数组中多个值之间为“逻辑或”匹配关系。条件值内支持使用通配符:

  • 通配符*:匹配0个、1个或多个字符。
  • 通配符?:匹配一个字符(不能为0个)。