You need to enable JavaScript to run this app.
导航

条件(Condition)

最近更新时间2024.02.19 13:34:47

首次发布时间2023.09.05 16:43:00

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

原理

请求上下文

用户访问云服务的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":"210.22.1**.***"
        }
      }
    }
  ]
}

解读: 该条策略限制仅能从IP地址210.22.1**.***中访问应用型负载均衡的全部操作。

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:SouceIp

请求的IP,不包含同Region的内网访问。支持IP v4和IP v6,支持地址段。

通过公网请求时存在,不包括同Region的内网访问

单值

IP Address

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的标签值请求的支持标签的云资源时存在单值String

条件值(Condition value)

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

  • 通配符*:匹配0个、1个或多个字符。
  • 通配符?:匹配一个字符(不能为0个)。
云服务支持的条件键

说明

对象存储服务(TOS)支持的条件键请参考对象存储帮助文档

产品服务
SeviceCode
volc:SourceIp
volc:ResourceTag/tag_key
volc:PrincipalTrn
volc:UserName
volc:RequestedRegion
volc:CurrentTime
NAT网关natgateway✔️✔️✔️✔️✔️✔️
公网IPvpc✔️
私有网络vpc✔️
VPN连接vpn✔️✔️
专线连接directconnect✔️✔️✔️✔️✔️✔️
负载均衡clb✔️
云企业网cen✔️✔️✔️✔️✔️✔️
应用型负载均衡alb✔️✔️✔️✔️✔️
云服务器ecs✔️✔️
弹性伸缩auto_scaling✔️✔️✔️✔️✔️✔️
veLinuxvelinux✔️✔️✔️✔️
云搜索服务ESCloud✔️✔️✔️✔️✔️
日志服务TLS
消息队列 Kafka版Kafka✔️✔️✔️✔️✔️✔️
消息队列 RabbitMQ版RabbitMQ✔️✔️✔️✔️✔️✔️
消息队列 RocketMQ版RocketMQ✔️✔️✔️✔️✔️✔️
时序数据库 InfluxDB 版influxdb
文档数据库 MongoDB 版mongodb✔️✔️✔️✔️✔️✔️
表格数据库 HBase 版hbase✔️✔️✔️✔️✔️
数据库传输服务dts✔️✔️✔️✔️✔️✔️
云数据库 MySQL 版rds_mysql✔️✔️✔️✔️✔️✔️
云数据库 PostgreSQL 版rds_postgresql✔️✔️✔️✔️✔️✔️
云数据库 RDS SQL Server 版rds_mssql✔️✔️✔️✔️✔️✔️
云数据库 veDB MySQL 版vedbm✔️✔️✔️✔️✔️
缓存数据库 Redis 版Redis✔️✔️✔️✔️✔️✔️
图数据库 veGraphgraph✔️✔️✔️✔️
数据库工作台 DBWdbw✔️✔️✔️✔️✔️✔️
配置中心configcenter✔️✔️✔️✔️
云数据库 MySQL Sharding 版mysql_sharding✔️✔️✔️✔️✔️
存储迁移服务dms✔️✔️✔️✔️✔️
数据闪送服务des✔️✔️✔️✔️
弹性块存储storage_ebs✔️✔️✔️✔️✔️✔️
文件存储 NASFileNAS✔️✔️✔️✔️✔️✔️
文件存储 vePFSvepfs✔️✔️✔️✔️✔️✔️
大数据文件存储cfs
服务网格ams✔️✔️✔️✔️
持续交付cp
应用观测服务aos✔️✔️✔️✔️
API网关apig✔️✔️✔️✔️
镜像仓库cr
容器服务vke✔️✔️✔️✔️✔️
云堡垒机vbh✔️✔️✔️✔️
函数服务vefaas✔️✔️✔️✔️✔️
应用韧性增强服务ares
制品仓库artifacts
微服务引擎mse✔️✔️✔️✔️✔️
托管Prometheusvmp
物联网平台iot
应用性能监控全链路版apmplus_api
云监控Volc_Observe✔️✔️✔️✔️✔️
代码托管 veCodevecode
云安全中心seccenter✔️✔️✔️✔️✔️
DDoS高防AdvDefence✔️✔️✔️✔️✔️
DDoS基础防护DDoS✔️✔️✔️✔️✔️
DDoS原生防护origin_defence✔️✔️✔️✔️
Web应用防火墙waf✔️✔️✔️✔️✔️
高级网络威胁检测系统nta✔️✔️✔️✔️✔️
云防火墙fw_center✔️✔️✔️✔️✔️
密钥管理系统kms
云加密机hsm✔️✔️✔️✔️✔️
智慧听鉴igh✔️✔️✔️✔️✔️
国际化翻译平台i18n_console✔️✔️✔️✔️
机器学习平台ml_platform✔️✔️✔️✔️✔️✔️
API开放平台cv✔️✔️✔️✔️
机器翻译translate
飞连corplink✔️✔️✔️✔️✔️
域名服务domain_service✔️✔️✔️✔️✔️
公共解析 PublicDNSpublic_dns
云解析 DNSdns✔️✔️✔️✔️✔️
SSL证书certificate_service✔️✔️✔️✔️
私有CApca✔️✔️✔️✔️
智能处理imp✔️✔️✔️✔️
企业直播livesaas
视频直播live✔️✔️✔️✔️✔️
视频点播vod
veImageXImageX✔️✔️✔️✔️✔️
实时音视频rtc✔️✔️✔️✔️✔️
云手机ACEP
云游戏vegame✔️✔️✔️✔️
边缘计算节点veen_edge✔️✔️✔️✔️
边缘容器veecp_openapi✔️✔️✔️✔️
内容分发网络CDN✔️✔️✔️✔️
全站加速dcdn✔️✔️✔️✔️✔️
全球加速ga✔️✔️✔️✔️✔️
多云CDN管理平台mcdn
流式计算 Flink 版flink✔️✔️✔️✔️
E-MapReduceemr✔️✔️✔️✔️✔️✔️
湖仓一体分析服务 LASlas
大数据研发治理套件dataleap✔️✔️✔️✔️✔️
ByteHouse(云数仓版)bytehouse
智能创意CreativeManagementPlatform✔️✔️✔️✔️✔️
智能推荐平台air
云原生消息引擎-公共云服务bmq
生信操作系统Bio-OS-云平台bio✔️✔️✔️✔️
短信服务volcSMS✔️✔️✔️✔️✔️
语音服务vms✔️✔️✔️✔️✔️
Anycast弹性公网IPanycasteip✔️✔️✔️✔️
网际快车fasttrack✔️✔️✔️✔️