条件(Condition) 是可选的元素,定义了权限声明的生效条件。IAM区别于RBAC模型的关键在于提供了基于属性的访问控制(ABAC),定义权限时不再局限于定义“何种主体通过何种操作访问何种客体”,而是可以进一步通过主客体的属性信息及请求中的属性信息进行访问控制,基于此特性,您可定义出十分精细的访问权限,从而最大化保障云上各类复杂访问场景的安全性。了解当前支持的条件键及使用说明请参考 Condition条件键说明;如需了解云服务对Condition的支持情况可参考 云服务支持的条件键列表。 原理
请求上下文
用户访问云服务的API请求中包含着丰富的请求上下文信息,这些信息可以分类为“身份属性”(主体属性)、“资源属性”(客体属性)、“请求属性”、“环境属性”。
- 身份属性: 请求身份的属性,例如PrincipalTag(身份标签)、PrincipalTrn(身份资源标识);
- 请求属性: 请求中定义对资源的操作信息,一般通过请求参数进行传递。请求参数分为公共参数和非公共参数。公共参数是构造签名请求中的必填参数(参考API调用指南 - 公共参数)。非公共参数为云服务提供的API参数,通常放置于Query或Body中进行传递,例如RequestTag(请求为云资源附加的标签);
- 环境属性: 请求发生时的环境信息,例如IP(访问的IP地址);
- 资源属性: 资源上的属性,例如ResourceTag(资源标签)。
权限策略
IAM的基于属性的访问控制是通过策略声明中的Condition元素定义的,以下是一条带有Condition的策略示例:
解读: 该条策略限制仅能从IP地址8.8.8.8(仅作为示例,非真实IP)中访问应用型负载均衡的全部操作。
Condition语法
策略中单条Condition由Operator(运算符)、Condition Key(条件键)、Condition Value(条件值) 三个部分组成。其中对于多值类型的Condition Key,需要在Operator前添加多值匹配符。当判断条件需要满足Condition Key在请求上下文中存在的前提时,需要在Operator前添加IfExists运算符。
以下面这条Condition为例,StringEquals为Operator,volc:RequestTag/apartment为Condition Key,财务为Condition Value:
在策略声明中可以有多条condition,一个condition中可以有多对条件键,每个条件键对应的条件值可以是多个(表达为数组形式),例如:
Condition运算逻辑可参考下图:
- AND代表“逻辑与”关系,OR代表“逻辑或”关系。
对应上述的策略示例中,Condition的组成结构如下:
运算符(Operator)
指条件运算符,例如StringEquals代表字符串精确匹配。运算符包括基本运算符和运算修饰符。运算符大小写敏感,需要确保在策略中正确书写;
基本运算符
支持的基本运算符如下:
运算修饰符
IfExists修饰符
在某些场景里,请求上下文中条件键可能不存在,当希望条件键不存在可跳过匹配时,可以在Operator中添加IfExists修饰符,例如以下条件代表当求上下文中包含volc:UserName条件键时,仅在条件值等于bob时可通过匹配;当请求上下文中不包含volc:UserName条件键时,条件可直接通过匹配:
多值修饰符
在某些场景里,同一个属性在请求上下文中可能会有多个属性值,这时候需要使用多值修饰符来定义多值的匹配方式,多值修饰符包括ForAllValues和ForAnyValue:
- ForAllValues:请求上下文中的必须包含条件键且全部条件值均匹配通过(注意:无条件值时即条件值为空集,空集是任何集合的子集,因此也可匹配通过);
- ForAnyValue:请求上下文中必须包含条件键且至少有一个条件值匹配通过 。
例如下面这条Condition同时使用了IfExists和ForAnyValue。ForAnyValue表示请求传递的标签至少需要有一个标签键等于"department",而IfExists让条件仅在请求传递了标签的情况下才会生效,所以最终的权限效果为:
- 请求中传递了一对或多对标签时,若至少有一个标签键为"department",则条件通过;
条件键(Condition key)
条件键指定了请求上下文中的待运算的属性字段,例如volc:PrincipalTrn(代表请求身份的TRN)。其中身份属性、请求属性中的公共参数部分、环境属性通常会作为全局条件键,请求属性中的非公共参数部分、资源属性通常作为服务条件键。
- 条件键格式为${ServiceCode}:${ConditonKeyName},${ServiceCode}为具体云服务的Service,全局条件键使用volc关键字(即格式为volc:${ConditionKeyName})。条件键大小写敏感,需要确保在策略中正确书写;
- 某些条件键在每次请求的上下文中可能会有多个值,这类条件键称为多值类型条件键;某些条件键在每次请求的上下文中至多会有一个值,这类条件键称为单值类型条件键。多值类型条件键需要使用多值修饰符(参考上方运算修饰符小节)。
说明
一些属性的属性值本身是key-value结构,这时候属性值中的key可以作为Condition key中的一部分。例如volc:RequestTag/${TagKey}(这里的${TagKey}需要代入具体的标签键)。
以下是访问控制支持的条件键及说明:
条件值(Condition value)
条件值限制了条件生效所需匹配成功的属性值范围,条件值可以是数组,数组中多个值之间为“逻辑或”匹配关系。条件值内支持使用通配符: