策略语法结构
网易云基础服务访问控制使用策略来描述授权的具体内容,本文将介绍策略语言的元素和正式语法,以便理解如何构造和验证策略。
策略结构
策略结构包括策略版本号(version)及声明(statement)列表。每个授权语句又包括以下元素:effect(效果)、action(操作列表)以及resource(资源列表)。
Policy 结构简述如下:
语法
基于JSON
策略仅支持 JSON 格式表示,提交策略时将先验证 JSON 格式,若验证不通过也将给出提示。JSON 语法标准参见 RFC 7159。
语法约定
-
以下字符是 JSON 字符,包含在策略中:
{ } [ ] " , :
-
以下字符是语法中的特殊字符,不包含在策略中:
= < > ( ) |
-
允许多个值时,只包含一个值也是有效的(只有一个值时);如果元素采用数组(使用 [ 和 ] 标记)但只包含一个值,则括号也是必填。例如:
"action": [<action_string>]
-
多值之间用竖线(|)隔开,表示取值只能选取这些值中的某一个。比如:
("allow" | "deny")
-
使用双引号引起了的元素,表示它是文本串。例如:
<version_block> = "version" : "1"
语法描述
policy = {
<version_block>,
<statement_block>
}
<version_block> = "version" : "1"
<statement_block> = "statement" : [ <statement>, <statement>, ... ]
<statement> = {
<effect_block>,
<action_block>,
<resource_block>
}
<effect_block> = "effect" : ("allow" | "deny")
<action_block> = "action" :
("*" | [<action_string>, <action_string>, ...])
<resource_block> = "resource" :
("*" | [<resource_string>, <resource_string>, ...])
语法说明
- 当前支持的策略版本为 1;
- 一个策略可以包含一组语句;
- 单个元素不能包含同一个键的多个实例。例如,不能在同一语句中包含两次 effect 块;
- 各 block 顺序无关紧要;
- 每条授权语句要么是 deny,要么是 allow。一条授权语句中,action 或 resource 是一个支持多个操作的列表;
- 每条授权语句都支持独立的限制条件。一个条件块可以支持多种条件操作类型,以及对这多种条件的逻辑组合;
- 一个群组可以被授予多条策略,当这些策略中既包含 allow 又包含 deny 时,我们遵循 deny 优先(只认 deny 不认 allow)原则;
- 当元素取值为字符串值时,支持 * 的前缀匹配。 * 可以代表任意个数字符。例如:"comb:nos:*:*:*:blue*"可以表示所有以 blue 开头的桶的名称。
策略示例
{
"version": "1",
"statement":
[{
"effect": "allow",
"action": ["comb:nms:list*", "comb:nos:listBuckets"],
"resource": ["comb:nms:hz:*:*", "comb:nos:*:*:samplebucket/*"]
}]
}