语法逻辑
最近更新时间: 2023-09-08 11:25:43
元素参考
策略(policy)由若干元素构成,用来描述授权的具体信息。核心元素包括委托人(principal)、操作(action)、资源(resource)、生效条件(condition)以及效力(effect)。元素保留字仅支持小写。它们在描述上没有顺序要求。对于策略没有特定条件约束的情况,condition 元素是可选项。在控制台中不允许写入 principal 元素,仅支持在策略管理 API 中和策略语法相关的参数中使用 principal。
1.版本(version)
描述策略语法版本。该元素是必填项。目前仅允许值为"2.0"。
2.委托人(principal)
描述策略授权的实体。包括用户(开发商、子账号、匿名用户)、用户组,未来会包括角色、联合身份用户等更多实体。仅支持在策略管理API中策略语法相关的参数中使用该元素。
3.语句(statement)
描述一条或多条权限的详细信息。该元素包括 action、resource、condition、effect 等多个其他元素的权限或权限集合。一条策略有且仅有一个statement 元素。
4.操作(action)
描述允许或拒绝的操作。操作可以是 API(以name前缀描述)或者功能集(一组特定的 API,以 permid 前缀描述)。该元素是必填项。
5.资源(resource)
描述授权的具体数据。资源是用六段式描述。每款产品的资源定义详情会有所区别。有关如何指定资源的信息,请参阅您编写的资源声明所对应的产品文档。该元素是必填项。
6.生效条件(condition)
描述策略生效的约束条件。条件包括操作符、操作键和操作值组成。条件值可包括时间、IP 地址等信息。有些服务允许您在条件中指定其他值。该元素是非必填项。
7.效力(effect)
描述声明产生的结果是“允许”还是“显式拒绝”。包括 allow(允许)和deny(显式拒绝)两种情况。该元素是必填项。
8.策略样例
该样例描述为:允许属于开发商 ID 1238423下的子账号 ID 3232523以及组 ID 18825, 对北京地域的cos存储桶bucketA和广州地域的 cos 存储桶 bucketB 下的对象 object2,在访问 IP 为10.121.2.*网段时,拥有所有 cos 读 API 的权限以及写对象的权限,以及可以发送消息队列的权限。
语法结构
整个策略的语法结构如下图所示。策略 policy 由版本 version 和语句 statement 构成,还可以包含委托人信息 principal,委托人仅限于策略管理 API 中策略语法相关的参数中使用。 语句 statement 是由若干个子语句构成。每条子语句包括操作 action、资源 resource、生效条件 condition 以及效力 effect 四个元素,其中 condition 是非必填项。
JSON 格式
策略语法以 JSON 格式为基础。创建或更新的策略不满足 JSON 格式时,将无法提交成功,所以用户必须要确保 JSON 格式正确。 JSON 格式标准在 RFC7159 中定义,您也可以使用在线 JSON 验证程序检查策略格式。
语法约定
语法描述中有如下约定:
• 以下字符是包含在策略语法中的 JSON 字符:
{ } [ ] " , :
• 以下字符是用于描述策略语法中的特殊字符,不包含在策略中:
= < > ( ) |
• 当一个元素允许多个值时,使用逗号分隔符和省略号进行表示。例如:
• [, < resource_string>, ...]
= { , > , ... }
允许多个值时,也可以只包含一个值。当元素只有一个值时,尾部的逗号必须去掉,且中括号"[]"标记可选。例如:
"resource": []
"resource":
• 元素后的问号 (?) 表示该元素是非必填项。例如:
<condition_block?>
• 元素是枚举值的情况下,枚举值之间用竖线 "|" 表示,并用 "()" 括号定义枚举值的范围。例如:
("allow" | "deny")
• 字符串元素用双引号包括起来。例如:
= "version" : "2.0"
语法描述
语法说明:
• 一个策略 policy 可以包含多条语句 statement。 策略的最大长度是 4096 个字符(不包含空格),具体信息请参阅 限制。 各个块 block 的显示顺序无限制。例如,在策略中, version_block 可以跟在 effect_block 后面等。
• 当前支持的语法版本为 2.0。
• principal_block 元素在控制台中不允许写入,仅支持在策略管理 API 中和策略语法相关的参数中使用 principal 。
• 操作 action 和资源 resource 都支持列表,其中 action 还支持各产品定义的操作集 permid。
• 生效条件可以是单个条件,或者包括多个子条件块的逻辑组合。每个生效条件包括条件操作符 condition_type、条件键 condition_key,条件值 condition_value。
• 每条语句 statement 的效力 effect 为 deny 或 allow 。当策略中包含的语句中既包含有 allow 又包含有 deny 时,遵循 deny 优先原则。
字符串说明
语法描述的元素字符串说明如下:
action_string
由描述作用域、服务类型和操作名称组成。
//所有产品所有操作
"action":"*"
"action":":"
// COS 产品所有操作
"action":"cos:*"
// COS 产品的名为 GetBucketPolicy 的操作
"action":"cos:GetBucketPolicy"
// COS 产品部分匹配 Bucket 的操作
"action":"cos:Bucket"
//操作集 ID 为 280649 的操作列表
"action":"permid/280649"
// cos 产品,名为 GetBucketPolicy\PutBucketPolicy\DeleteBucketPolicy 的操作列表
"action":["cos:GetBucketPolicy","cos:PutBucketPolicy","cos: DeleteBucketPolicy"]
其中,permid 为各产品定义的操作集合 ID ,具体信息请参阅各相关产品文档。
resource_string
资源通过六段式描述。
qcs: project :serviceType:region:account:resource
project目前不区分,不填具体字段。
示例如下所示:
// COS 产品的 object 资源,武汉地域,资源拥有者的 uid 是100004601234,资源名是 bucket1/object2 ,资源前缀是 prefix
qcs::cos:wh:uid/100004601234:prefix//100004601234/bucket1/object2
// CVM 产品的云服务器,武汉地域,资源拥有者的uin是100004601234,资源名是 ins-abcdefg,资源前缀是 instance
qcs::cvm:wh:uin/100004601234:instance/ins-abcdefg
具体信息请参阅各产品的 支持的资源级权限 页面的资源描述方法。
condition_type_string
条件操作符,描述测试条件的类型。例如 string_equal、string_not_equal、date_equal、date_not_equal、ip_equal、ip_not_equal、numeric_equal、numeric_not_equal 等。示例如下所示:
condition_key_string
条件键,表示将对其值采用条件操作符进行操作,以便确定条件是否满足。CAM 定义了一组在所有产品中都可以使用的条件键,包括 qcs:current_time、qcs:ip 、qcs:uin 和 qcs:owner_uin 等。具体信息请参阅 生效条件。
principal_id_string
对于 CAM 而言,用户也是它的资源。因此委托人 principal 也采用六段式描述。示例如下,具体信息请参阅 资源描述方式。
评估逻辑
云平台用户访问云资源时, CAM 通过以下评估逻辑决定允许或拒绝。
- 默认情况下,所有请求都将被拒绝。
- CAM 会检查当前用户关联的所有策略。
i. 判断是否匹配策略,是则进行下一步判断;否则最终判断为 deny ,不允许访问云资源。
ii. 判断是否有匹配 deny 策略,是则最终判定为 deny ,不允许访问云资源;否则进行下一步判断。
iii. 判断是否有匹配 allow 策略,是则最终判断为 allow ,允许访问云资源;否则最终判定为 deny,不允许访问云资源。
注意:
• 对于根账号,默认拥有其名下所有资源的访问权限。
• 有些通用策略,会默认关联所有 CAM 用户。具体请见下文的 通用策略表。
• 其他策略都必须显式指定,包括 allow 和 deny 策略。
• 对于支持跨帐号资源访问的业务,存在权限传递的场景,即根账号 A 授权根账号 B 下的某个子账号对其资源的访问权限。这个时候 CAM 会同时校验 A 是否授权给 B 该权限以及 B 是否授权给子帐号该权限,两者同时满足的前提下, B 的子账号才有权访问 A 的资源。
目前支持的通用策略表如下:
资源描述方式
资源 resource 元素描述一个或多个操作对象,如 CVM 资源、COS存储桶等。本文档主要介绍 CAM 的资源描述信息。
六段式
所有资源均可采用下述的六段式描述方式。每种产品都拥有其各自的资源和对应的资源定义详情。有关如何指定资源的信息,请参阅对应的产品文档。 六段式定义方式如下所示:
qcs:project_id:service_type:region:account:resource
其中:
• qcs 是 qcloud service 的简称,表示是云平台的云资源。该字段是必填项。
• project_id 描述项目信息,仅兼容 CAM 早期逻辑。当前策略语法禁止填写该信息。
• service_type 描述产品简称,如 CVM、CDN等,产品的检测具体细节请参考对应的产品文档。值为的时候表示所有产品。该字段是必填项。
• region 描述地域信息。值为空的时候表示所有地域。云平台新版地域统一命名方式请参考 地域和可用区。云平台现有的地域命名方式定义如下:
• account 描述资源拥有者的根账号信息。目前支持两种方式描述资源拥有者,uin 和 uid 方式。
o uin 方式,即根账号的 QQ 号,表示为uin/${uin},如 uin/12345678;
o uid 方式,即根账号的 APPID,表示为uid/${appid},如 uid/10001234。
o 值为空的时候表示创建策略的 CAM 用户所属的根账号。目前COS和CAS业务的资源拥有者只能用uid方式描述(如不涉及,无需关注),其他业务的资源拥有者只能用 uin 方式描述。
• resource 描述各产品的具体资源详情。
i. 有几种描述方式,该字段是必填项。
a. 表示某个资源子类下的资源 ID 。如 VPC 产品的 instance/ins-abcdefg。
/
b. 表示某个资源子类下的带路径的资源 ID 。如 COS 产品的prefix//10001234/bucket1/object2。该方式下,支持目录级的前缀匹配。如prefix//10001234/bucket1/,表示 bucket1 下的所有 Object 。
/
b. 表示某个资源子类下的所有资源。如 instance/。
/
表示某产品下的所有资源。
2. 在某些场景下,资源 resource 元素也可以用*
来描述,含义定义如下,详细信息也请参阅对应的产品文档。
3. 操作 action 是需要关联资源的操作时,resource 定义为*
,表示关联所有资源。
4. 操作 action 是不需要关联资源的操作时,resource 都需要定义为*
。
CAM 的资源定义
CAM 包含了用户、组、策略等资源,CAM 资源的描述方式如下所示:
根账号:
qcs::cam::uin/164256472:uin/164256472
或
qcs::cam::uin/164256472:root
子账号:
qcs::cam::uin/164256472:uin/73829520
组:
qcs::cam::uin/164256472:groupid/2340
所有用户:
qcs::cam::anonymous:anonymous
或
- 策略:
qcs::cam:: uin/12345678:policyid/* 或
qcs::cam:: uin/12345678:policyid/12423 - 资源的重要说明*
• 资源的拥有者一定是根账号。如果资源是子账号创建的,不会自动拥有资源的访问权限,需要由资源拥有者授权。
• COS、CAS等业务支持跨账号授权资源的访问权限。被授权账号可以通过权限传递方式将资源授权给其子账号。 - 策略变量*
使用场景
场景假设:您希望给每个 CAM 用户授予其创建资源的访问权限。例如您想要设置 COS 资源的创建者默认拥有该资源的访问权限。 如果由资源拥有者(根账号)将资源逐个授权给资源创建者,授权成本很高,需要为每种资源都编写策略并授权给创建者。在这种情况下,您可以通过使用策略变量来实现您的需求。在策略的资源定义中增加占位符描述的创建人信息,该占位符即使策略变量。当鉴权时,策略变量将被替换为来自请求本身的上下文信息。
授予创建者资源读权限的策略描述方式如下:
• 策略变量在每个资源的路径中带上创建人的 uin。如uin 为12356 的用户创建了名为 test 的 bucket,则其对应的资源描述方式为
qcs::cos::uid/1238423:prefix/12356/test
• uin 为 12356 的用户访问该资源时,鉴权过程中会把对应的策略信息的占位符替换为访问者,即
qcs::cos::uid/1238423:prefix/12356/
• 策略中的资源 qcs::cos::uid/1238423:prefix/12356/ 可以通过前缀匹配访问资源 qcs::cos::uid/1238423:prefix/12356/test 。
策略变量的位置
资源元素位置 :策略变量可以用在[资源六段式]的最后一段。 条件元素位置 :策略变量可以用在条件值中。
以下策略表示 VPC 创建者拥有访问权限。
策略变量列表
目前支持的策略变量列表如下:
生效条件
使用场景
在很多场景下,我们需要对创建的策略进一步约束生效的条件 condition 。
• 场景1: CAM 用户调用云 API 时,需要限制用户访问来源,则要求在现有的策略基础上加上 IP 条件。
• 场景2:当 CAM 用户在调用 VPC 对等连接 API 时,除了需要判断 CAM 用户是否拥有对等连接 API 和对等连接资源的访问权限外,还需要确认 CAM 用户是否拥有对等连接关联的 VPC 的访问权限。
语法结构
生效条件的语法结构如下图所示。一个条件块可以由若干个子条件块 sub block 构成,每个子条件块 sub block 对应一个条件操作符和若干个多个条件键,每个条件键对应了若干个条件值。
评估逻辑
条件生效的评估逻辑如下所述:
- 条件键会对应到多个条件值,只要上下文信息中的对应键值在关联的条件操作符作用下满足其中任意一个条件值,则条件生效。
- 对于一个子条件块中存在多个条件键的情况下,只有每个条件键对应的条件都生效时,该子条件块才生效。
- 对于包含多个子条件块的情况,只有每个子条件块都生效时,整个条件才生效。
- 对于包含 _if_exist 后缀的条件操作符,即使上下文信息中不包含条件操作符所关联的条件键,该条件依然生效。
- 对于 for_all_value :限定词约束的条件操作符,适用于上下文信息中的条件键包括多个值的场景。只有当上下文信息中的条件键的每个值在关联的条件操作符作用下生效时,整个条件才生效。
- 对于 for_any_value :限定词约束的条件操作符,适用于上下文信息中的条件键包括多个值的场景。只要上下文信息中的条件键的任意一个值在关联的条件操作符作用下生效时,整个条件就可以生效。
使用示例
以下示例描述允许 VPC 绑定指定的 NAT 网关, VPC 的地域必须是武汉。
条件操作符列表
下表是条件操作符、条件名以及示例的信息。每个产品自定义的条件键,请参阅对应的产品文档。
条件操作符 | 含义 | 条件名 | 举例 |
---|---|---|---|
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 | 条件键为空匹配 |
说明:
- 日期格式按照 ISO8601 标准表示,并需要使用 UTC 时间。
- IP 格式要符合 CIDR 规范。
- 条件操作符(null_equal除外)加上后缀 _if_exist,表示上下文信息中即便不包含对应的键值依然生效。
- for_all_value :限定词搭配条件操作符使用,表示上下文信息中条件键的每个值都满足要求时才生效。
- for_any_value :限定词搭配条件操作符使用,表示上下文信息中条件键的任意一个值满足要求时就可以生效。
- 部分业务不支持条件,或仅支持部分条件。具体信息参考业务文档说明。