语法结构

最近更新时间:2019-04-30 16:18:57

整个策略的语法结构如下图所示。策略 policy 由版本 version 和语句 statement 构成,还可以包含委托人信息 principal,委托人仅限于策略管理 API 中策略语法相关的参数中使用。
语句 statement 是由若干个子语句构成。每条子语句包括操作 action、资源 resource、生效条件 condition 以及效力 effect 四个元素,其中 condition 是非必填项。

JSON 格式

策略语法以 JSON 格式为基础。创建或更新的策略不满足 JSON 格式时,将无法提交成功,所以用户必须要确保 JSON 格式正确。 JSON 格式标准在 RFC7159 中定义,您也可以使用在线 JSON 验证程序检查策略格式。

语法约定

语法描述中有如下约定:

  • 以下字符是包含在策略语法中的 JSON 字符:

    { } [ ] " , :
  • 以下字符是用于描述策略语法中的特殊字符,不包含在策略中:

    = < > ( ) |
  • 当一个元素允许多个值时,使用逗号分隔符和省略号进行表示。例如:

    [<resource_string>, < resource_string>, ...]  
    <principal_map> = { <principal_map_entry>, > <principal_map_entry>, ... }

    允许多个值时,也可以只包含一个值。当元素只有一个值时,尾部的逗号必须去掉,且中括号"[]"标记可选。例如:

    "resource": [<resource_string>]     
    "resource": <resource_string>
  • 元素后的问号 (?) 表示该元素是非必填项。例如:

    <condition_block?>
  • 元素是枚举值的情况下,枚举值之间用竖线 "|" 表示,并用 "()" 括号定义枚举值的范围。例如:

    ("allow" | "deny")
  • 字符串元素用双引号包括起来。例如:

    <version_block> = "version" : "2.0"

语法描述

policy  = {
     <version_block>
     <principal_block?>,
     <statement_block>
}

<version_block> = "version" : "2.0"

<statement_block> = "statement" : [ <statement>, <statement>, ... ]

<statement> = {     
    <effect_block>,
    <action_block>,
    <resource_block>,
    <condition_block?>
}

<effect_block> = "effect" : ("allow" | "deny")  

<principal_block> = "principal": ("*" | <principal_map>)

<principal_map> = { <principal_map_entry>, <principal_map_entry>, ... }

<principal_map_entry> = "qcs":   
    [<principal_id_string>, <principal_id_string>, ...]

<action_block> = "action": 
    ("*" | [<action_string>, <action_string>, ...])

<resource_block> = "resource": 
    ("*" | [<resource_string>, <resource_string>, ...])

<condition_block> = "condition" : { <condition_map> }
<condition_map> { 
  <condition_type_string> : { <condition_key_string> : <condition_value_list> },
  <condition_type_string> : { <condition_key_string> : <condition_value_list> }, ...
}  
<condition_value_list> = [<condition_value>, <condition_value>, ...]
<condition_value> = ("string" | "number")

语法说明:

  • 一个策略 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

示例如下所示:

// COS 产品的 object 资源,上海地域,资源拥有者的 uid 是10001234,资源名是 bucket1/object2 ,资源前缀是 prefix
qcs::cos:sh:uid/10001234:prefix//10001234/bucket1/object2
// CMQ 产品的队列,上海地域,资源拥有者的 uin 是12345678,资源名是12345678/queueName1,资源前缀是 queueName
qcs::cmqqueue:sh:uin/12345678:queueName/12345678/queueName1
// CVM 产品的云服务器,上海地域,资源拥有者的 uin 是12345678,资源名是 ins-abcdefg,资源前缀是 instance
qcs::cvm:sh:uin/12345678: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":{
         "string_equal":{"cvm:region":["sh","gz"]},
         "ip_equal":{"qcs:ip":"10.131.12.12/24"}
}

condition_key_string

条件键,表示将对其值采用条件操作符进行操作,以便确定条件是否满足。CAM 定义了一组在所有产品中都可以使用的条件键,包括 qcs:current_time、qcs:ip 、qcs:uin 和 qcs:owner_uin 等。具体信息请参阅 生效条件

principal_id_string

对于 CAM 而言,用户也是它的资源。因此委托人 principal 也采用六段式描述。示例如下,具体信息请参阅 资源描述方式

"principal":   {"qcs":["qcs::cam::uin/1238423:uin/3232",
             "qcs::cam::uin/1238423:groupid/13"]}