Statement为策略的主要元素,该元素为必填项。Statement中可含一条单独的JSON语句,也可包含由多条语句组成的JSON语句块,多个JSON语句块之间是逻辑或的关系。每条单独的语句块必须使用大括号{}括起来。每个JSON语句块中包括下列元素:Sid(非必填)、Effect(必填)、Action或NotAction(二选一)、Resource或NotResource(二选一)、Condition(非必填)。
如果多个JSON语句块之间有重叠或者冲突,默认情况下包含Deny的语句优先级最高,但是如果JSON语句块中包含ctyun:MuliFactorAuthPresent和ctyun:MuliFactorAuthAge的条件且请求来自OOS控制台,则优先判断该语句,通过后再判断其他Deny或者Allow的语句。
Statement语句的结构如下:
“Statement”: [ {…}, {…}, {…}, …]
例如下例为多个JSON语句块组成的示例:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowGroupToManageTrail",
"Effect": "Allow",
"Action": "cloudtrail:*",
"Resource": "*"
},
{
"Sid": "AllowGroupToSeeBucket",
"Effect": "Allow",
"Action": [
"oos:GetObject",
"oos:ListBucket"
],
"Resource": [
"arn:ctyun:oos::10rc2arpn6306:trailbucket",
"arn:ctyun:oos::10rc2arpn6306:trailbucket/*"
]
}
]
}
Sid
Sid是针对策略语句提供的可选标识符,用户可以为声明数组中的每份声明指定Sid值,Sid值是策略文件ID的子ID。在IAM中,Sid值在JSON策略中必须唯一。
Effect
Effect元素是必需具备的元素,用于指定声明所产生的结果是“允许”还是“显式拒绝”。Effect的有效值为Allow和Deny。在默认情况下,将拒绝访问资源。如要允许访问资源,必须将Effect元素设置为Allow。
Action
Action元素描述将允许或拒绝的指定操作。每个服务有对应的任务操作,用户可以使用相应服务来执行所描述的任务。目前提供的服务有:oos(对象存储)、cloudtrail(操作跟踪)、statistics(统计)和iam(访问控制)。具体每种服务包括的操作详见操作权限与API对应关系 。
Action元素的语法结构为:"Action": "服务:具体操作"。其中具体操作也可以用通配符(*)表示某类操作。
示例1 :OOS:获取文件(Object)操作。
"Action": "oos:GetObject"
示例2 :IAM:创建IAM用户。
"Action": "iam:CreateUser"
示例3 :使用通配符(*)表示执行OOS的所有服务。
"Action": "oos:*"
示例4 :使用通配符(*)表示执行IAM服务中包含AccessKey的操作。
"Action": "iam:*AccessKey*"
NotAction
NotAction元素描述与指定操作列表之外的所有内容显式匹配。使用NotAction时只列出不应匹配的一些操作。使用NotAction时:
- 如果使用Allow效果,则允许未列出的所有适用操作或服务。
- 如果使用Deny效果,则拒绝此类未列出的操作或服务。如果想允许某个已列出的操作,则必须显式允许此操作。
示例1 :除删除存储桶操作外,允许用户执行OOS其他所有操作。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"NotAction": "oos:DeleteBucket",
"Resource": "arn:ctyun:oos::10rc2arpn6306:*",
}
]
}
示例2 :允许用户执行除IAM服务外的所有操作。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"NotAction": "iam:*",
"Resource": "*",
}
]
}
示例3 :拒绝除oos、cloudtrail和statistics之外的服务。但并不是允许oos、cloudtrail和statistics服务的操作,如果允许oos、cloudtrail和statistics中的某个操作,需要再写新的策略进行显式允许。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"NotAction": [
"oos:*",
"cloudtrail:*",
"statistics:*",
],
"Resource": "*",
}
]
}
Resource
Resource元素指定执行策略的资源,可以指定一个或多个文件(Object)。
格式可以为:
- “Resource”: “arn:ctyun:service::accountid:resource”
- “Resource”: “arn:ctyun:service::accountid:resourcetype/resource”
其中:
- service :服务名。
- accountid :账户ID。
- resourcetype :资源类型。
- resource :具体资源。在指定资源时,可以使用通配符,其中*表示字符的任意组合,?表示任何单个字符。
在resource最后部分添加策略变量“${ctyun:username}”指定占位符。当策略执行时,策略变量将被替换为请求本身的用户名。
在resource最后部分添加策略变量“${ctyun:AccessKey}”指定占位符。当策略执行时,策略变量将被替换为请求本身的AccessKeyID。
如下列举例,将含有策略变量的策略附加给多个用户,当用户A发起请求时,username将替换为A的用户名;当用户B发起请求时,username将替换为B的用户名。
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"oos:GetObject",
"oos:PutObject"
],
"Effect": "Allow",
"Resource": ["arn:ctyun:oos::123456789012:mybucket/${ctyun:username}/*"]
}
]
}
NotResource
NotResource元素指除指定资源列表之外的所有内容显式匹配的策略元素。使用NotResource时,只列出不应匹配的一些资源,而不是包括将匹配的资源列表。使用NotResource时应注意,在此元素中指定的资源是受限的资源,即:
- 如果使用Allow,则将允许未列出的所有资源,包括所有其他服务中的资源;
- 如果使用Deny,则拒绝所有未列出资源。
Condition
Condition元素描述允许用户指定策略生效的条件。在Condition元素中,用户可构建表达式,并使用条件运算符将策略中的条件与请求值相匹配。
Condition元素可以由多个条件组成。条件包括:条件运算符、条件键和条件值组成,一个条件键可以对应多个条件值。
Condition的语法结构如下:
"Condition": {"条件运算符A": {"条件键A":["条件值A1", "条件值A2",…]}, "条件运算符B": {"条件键B":["条件值B1", "条件值B2",…] } } |
---|
"Condition": {"条件运算符A": {"条件键A":["条件值A1", "条件值A2",…]}, "条件运算符B": {"条件键B":["条件值B1", "条件值B2",…] } } |
---|
条件键不区分大小写。如果条件值是时间,将需要设置的时间转换为UTC+0时区的时间。
若存在多个条件,各个条件之间的约束如下:
- 存在多个条件运算符,采用逻辑AND评估这些条件;
- 若一个条件键对应多个条件值,采用逻辑OR评估这些条件值;
- 必须满足所有条件运算符才能做出允许或者拒绝。如果多个条件中的任何一个不满足,那么策略不生效。
条件键、运算符、条件值见下表:
条件键 | 运算符 | 条件值 |
---|---|---|
ctyun:CurrentTime |
| 格式为:yyyy-MM-dd’T’HH:mm:ss’Z’。例如:2019-12-18T09:00:00Z。 DateEquals和DateNotEquals精确到天,其他精确到秒。 注意 将需要设置的时间转换为UTC+0时间。 |
ctyun:SourceIp |
|
如果指定地址范围,IP地址后加掩码表示,如192.163.1.5/3。 |
ctyun:userid |
| 包含数字和小写字母的32位字符串。 运算符为StringLike和StringNotLike,可以包含通配符。 |
ctyun:username |
| 1~64个字符组成,字符只能包含字母、数字或特殊字符,特殊字符只能是:下划线(_)、中划线(-)、逗号(,)、句点(.)、加号(+)、等号(=)和at符号(@)。 说明 运算符为StringLike和StringNotLike,可以包含通配符。 |
ctyun:UserAgent |
| 字符串,可以包含特殊字符。 |
ctyun:Referer |
| 字符串,可以包含特殊字符。 |
ctyun:SecureTransport | Bool:布尔匹配。 |
|
ctyun:MultiFactorAuthPresent | Bool:布尔匹配。 说明 不建议对GetObject接口设置该条件键,否则在OOS控制台上无法下载、预览、分享文件和编辑元数据。 |
|
ctyun:MultiFactorAuthAge |
说明 不建议对GetObject接口设置该条件键,否则在OOS控制台上无法下载、预览、分享文件和编辑元数据。 | 整数形式,以秒为单位。 |
oos:prefix |
| 字符串形式。 说明 本条件键仅对ListBucket生效。 |
oos:x-amz-acl |
| 字符串形式。 取值为:
说明 创建Bucket时,通过使用此条件键可以控制存储桶ACL的类型,本条件键仅对PutBucket生效。 |
条件键 | 运算符 | 条件值 |
---|
在Condition元素中添加策略变量"${ctyun:username}"指定占位符。当策略执行时,策略变量将被替换为请求本身的用户名。
在Condition元素中添加策略变量"${ctyun:AccessKey}"指定占位符。当策略执行时,策略变量将被替换为请求本身的AccessKeyID。
示例 :将含有策略变量的策略附加给多个用户,当用户A发起请求时,条件键oos:prefix将根据用户A的username进行判断;当用户B发起请求时,条件键oos:prefix将根据用户B的username进行判断。
{
"Version": "2012-10-17",
"Statement": [
{
"Action": ["oos:ListBucket"],
"Effect": "Allow",
"Resource": ["arn:ctyun:oos::123456789012:mybucket"],
"Condition": {"StringLike": {"oos:prefix": ["${ctyun:username}/*"]}}
}
]
}
IfExists条件运算符
IfExists:如果请求的内容中存在关键字,则依照策略所述的条件来处理关键字。如果该关键字不存在,则条件元素的计算结果将为true。
目前仅Bool型和数字类型的运算符支持使用IfExists条件运算符,表达形式:运算符IfExists,例如BoolIfExists、NumericEqualsIfExists。对于…IfExists的使用见示例1和示例2。
示例1
- 拒绝没有使用MFA认证的控制台请求,不拒绝使用MFA认证的控制台请求和使用密钥的API请求。但如果允许使用MFA认证的控制台请求和使用密钥的API请求,需要再写显性允许语句。
"Effect" : "Deny",
"Condition" : { "Bool" : { "ctyun:MultiFactorAuthPresent" : false } }
- 拒绝没有使用MFA认证的控制台请求及使用密钥的API请求,不拒绝MFA认证的控制台请求。但如果允许MFA认证的控制台请求,需要再写显性允许语句。
"Effect" : "Deny",
"Condition" : { "Bool" : { "ctyun:MultiFactorAuthPresent" : false } }
示例2
- 允许使用MFA认证在1800秒内的请求及使用密钥的API请求。
"Effect" : "Allow",
"Condition" : { "NumericLessThanEqualsIfExists" : { "ctyun:MultiFactorAuthAge " : 1800 } }
- 允许使用MFA认证在1800秒内的请求,但不允许MFA认证在1800秒以上及没有使用MFA的请求(包括API请求)。
"Effect" : "Allow",
"Condition" : { "NumericLessThanEquals" : { "ctyun:MultiFactorAuthAge " : 1800 } }
策略变量
在编写策略时,如果不能确定Resource、NotResource或Condition元素中的精确值,可以使用策略变量作为占位符。目前仅支持变量“ {ctyun:username} ”、“ {ctyun:AccessKey} ”。当策略执行时,策略变量将被替换为请求本身的用户名或AccessKeyID。
示例 1 : 将含有策略变量的策略附加给多个用户,当用户A发起请求时,username将替换为A的用户名;当用户B发起请求时,username将替换为B的用户名。
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"oos:GetObject",
"oos:PutObject"
],
"Effect": "Allow",
"Resource": ["arn:ctyun:oos::123456789012:mybucket/${ctyun:username}/*"]
}
]
}
示例 2 :将含有策略变量的策略附加给多个用户,当用户A发起请求时,条件键oos:prefix将根据用户A的username进行判断;当用户B发起请求时,条件键oos:prefix将根据用户B的username进行判断。
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"oos:GetObject",
"oos:PutObject"
],
"Effect": "Allow",
"Resource": ["arn:ctyun:oos::123456789012:mybucket/${ctyun:username}/*"]
}
]
}