条件(Condition) 是可选的元素,定义了权限声明的生效条件。IAM区别于RBAC模型的关键在于提供了基于属性的访问控制(ABAC),定义权限时不再局限于定义“何种主体通过何种操作访问何种客体”,而是可以进一步通过主客体的属性信息及请求中的属性信息进行访问控制,基于此特性,您可定义出十分精细的访问权限,从而最大化保障云上各类复杂访问场景的安全性。如需了解云服务对Condition的支持情况可参考 云服务支持的条件键列表。
用户访问云服务的API请求中包含着丰富的请求上下文信息,这些信息可以分类为“身份属性”(主体属性)、“资源属性”(客体属性)、“请求属性”、“环境属性”。
身份属性: 请求身份的属性,例如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)中访问应用型负载均衡的全部操作。
说明
特殊情况:火山引擎对象存储(TOS)的策略语法及功能逻辑可能存在不同,如需对对象存储配置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": { "StringEquals": { "volc:RequestTag/apartment": "财务" } } }
在策略声明中可以有多条condition,一个condition中可以有多对条件键,每个条件键对应的条件值可以是多个(表达为数组形式),例如:
{ "Condition": { "StringEqualsIgnoreCase": { "volc:RequestTag/apartment": ["财务","行政","研发"], "volc:ResourceTag/project":["游戏项目","短视频项目"] }, "IpAddress": { "volc:SourceIp": "203.0.113.0/24" } } }
Condition运算逻辑可参考下图:
对应上述的策略示例中,Condition的组成结构如下:
指条件运算符,例如StringEquals
代表字符串精确匹配。运算符包括基本运算符和运算修饰符。运算符大小写敏感,需要确保在策略中正确书写;
支持的基本运算符如下:
运算符类型 | 运算符类型说明 | 运算符 | 运算符说明 |
---|---|---|---|
String | 字符串运算 | StringEquals | 字符串精确匹配(大小写敏感) |
StringNotEquals | 字符串精确不匹配(大小写敏感) | ||
StringEqualsIgnoreCase | 字符串精确匹配(忽略大小写) | ||
StringNotEqualsIgnoreCase | 字符串不匹配(忽略大小写) | ||
StringLike | 字符串模糊匹配(大小写敏感)(使用该运算符时符号*或?会作为通配符处理,使用StringEquals时会作为普通字符处理) | ||
StringNotLike | 字符串模糊不匹配(大小写敏感)(使用该运算符时符号*或?会作为通配符处理,使用StringNotEquals时会作为普通字符处理) | ||
IP Address | IP地址运算 | IpAddress | IP地址或地址段匹配 |
NotIpAddress | IP地址或地址段不匹配 | ||
Numeric | 数字运算 | NumericEquals | 数值等于 |
NumericNotEquals | 数值不等于 | ||
NumericLessThan | 数值小于 | ||
NumericLessThanEquals | 数值小于等于 | ||
NumericGreaterThan | 数值大于 | ||
NumericGreaterThanEquals | 数值大于等于 | ||
Date and time | 日期与时间运算 | DateEquals | 日期时间等于 |
DateNotEquals | 日期时间不等于 | ||
DateLessThan | 日期时间早于 | ||
DateLessThanEquals | 日期时间不晚于 | ||
DateGreaterThan | 日期时间晚于 | ||
DateGreaterThanEquals | 日期时间不早于 | ||
Boolean | 布尔运算 | Bool | 布尔匹配(true 或false) |
TRN | 全局资源名称(TRN)运算 | TrnEquals | TRN精确匹配(大小写敏感)。TRN中可包含通配符,在匹配逻辑上与StringLike相同,但使用TrnEquals时,系统会对Condition value进行格式的合法性检查 |
TrnNotEquals | TRN精确不匹配(大小写敏感)。TRN中可包含通配符,在匹配逻辑上与StringNotLike相同,但使用TrnNotEquals时,系统会对Condition value进行格式的合法性检查 | ||
Null | 条件键存在性运算 | Null | 检查条件键在请求上下文中是否存在,当不存在时返回true,存在时返回false。使用该运算符时,Condition value必须为true或false,以对Null检查的返回结果进行比对 |
在某些场景里,请求上下文中条件键可能不存在,当希望条件键不存在可跳过匹配时,可以在Operator中添加IfExists
修饰符,例如以下条件代表当求上下文中包含volc:UserName
条件键时,仅在条件值等于bob
时可通过匹配;当请求上下文中不包含volc:UserName
条件键时,条件可直接通过匹配:
{ "Condition": { "StringEqualsIfExists": { "volc:UserName":"bob" } } }
在某些场景里,同一个属性在请求上下文中可能会有多个属性值,这时候需要使用多值修饰符来定义多值的匹配方式,多值修饰符包括ForAllValues
和ForAnyValue
:
- ForAllValues
:请求上下文中的必须包含条件键且全部条件值均匹配通过(注意:无条件值时即条件值为空集,空集是任何集合的子集,因此也可匹配通过);
- ForAnyValue
:请求上下文中必须包含条件键且至少有一个条件值匹配通过 。
例如下面这条Condition同时使用了IfExists
和ForAnyValue
,表示当请求传递了标签(RequestTagKeys)时,标签键必须是"department"(IfExists
让未传递标签的情况依然可以通过Condition的匹配,ForAnyValue
要求请求中传递多对标签时,每一对标签键都必须等于"department"。因标签键在请求时无法重复,因此这条Condition等同于限制了用户若传递标签则仅能传递标签键为"department"的标签)。
{ "Condition": { "ForAnyValue:StringEqualsIfExists": { "volc:RequestTagKeys": "department" } } }
条件键指定了请求上下文中的待运算的属性字段,例如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
| 使用账号内IAM身份请求时均存在 | 单值 | String和TRN |
volc:RequestTagKeys | 请求传递的全部标签键,包括涉及标签附加或标签解除的请求传递的标签,不包含查询接口按标签过滤时传递的标签 | 涉及标签附加、标签解除的请求中存在 | 多值 | String |
volc:RequestTag/tag_key | 请求时传递的标签中标签键为tag_key 的标签值,包括涉及标签附加或标签解除的请求传递的标签,不包含查询接口按标签过滤时传递的标签 | 涉及标签附加、标签解除的请求中存在 | 单值 | String |
volc:PrincipalTag/ | 请求的IAM身份标签中标签键为
| 使用IAM子用户或角色访问时存在 | 单值 | String |
volc:ResourceTag/tag_key | 请求访问的资源的标签中标签键为tag_key 的标签值。该条件要求请求中必须传递资源ID,对于部分列表类接口,请求不传递资源ID时代表查询全部资源,此时请求将无法鉴权通过 | 请求的支持标签的云资源时存在 | 单值 | String |
条件值限制了条件生效所需匹配成功的属性值范围,条件值可以是数组,数组中多个值之间为“逻辑或”匹配关系。条件值内支持使用通配符:
*
:匹配0个、1个或多个字符。?
:匹配一个字符(不能为0个)。