更新时间:2024-02-29 GMT+08:00

桶策略参数说明

一个Policy由JSON描述,格式定义为:

{ 
"Statement" : [{
     statement1
  },
  {
     statement2
  },
  ......
 ]
}
实例如下所示:
{ 
"Statement" : [{
     "Sid": "ExampleStatementID1",
     "Principal": "*",
     "Effect": "Allow",   
     "Action": "ListBucket",
     "Resource": "examplebucket",
     "Condition": "some conditions"
  },
  {
     "Sid": "ExampleStatementID2",
     "Principal": "*",
     "Effect": "Allow",   
     "Action": "PutObject",
     "Resource": "examplebucket",
     "Condition": "some conditions"
  },
......
]
}

Policy由多条statement组成,也可以是一条。每条statement的结构包括下表内容:

表1 statement结构

元素

描述

是否必选

Sid

statement Id,可选关键字,描述statement的字符串。

可选

Principal

可选关键字,被授权人,指定本条statement权限针对的Domain以及User,支持通配符“*”,表示所有用户。当对Domain下所有用户授权时,Principal格式为domain/domainid:user/*当对某个User进行授权时,Principal格式为domain/domainid:user/userId或者domain/domainid:user/userName。

可选,Principal与NotPrincipal选其一

NotPrincipal

可选关键字,不被授权人,statement匹配除此之外的其他人。取值同Principal。

可选,NotPrincipal与Principal选其一

Action

可选关键字,指定本条statement作用的操作,Action字段为OBS支持的所有操作集合,以字符串形式表示,不区分大小写。支持通配符“*”,表示该资源能进行的所有操作。例如:"Action":["List*", "Get*"]。

可选,Action与NotAction选其一

NotAction

可选关键字,指定一组操作,statement匹配除该组操作之外的其他操作。 取值同Action。

可选,NotAction与Action选其一

Effect

必选关键字,效果,指定本条statement的权限是允许还是拒绝,Effect的值必须为Allow或者Deny。

必选

Resource

可选关键字,指定statement起作用的一组资源,支持通配符“*”,表示所有资源。

可选,Resource与NotResource选其一

NotResource

可选关键字,指定一组资源,statement匹配除该组资源之外的其他资源。 取值同Resource。

可选,NotResource与Resource选其一

Condition

可选关键字,本条statement生效的条件。

可选

在单条statement中,Action与NotAction必须二选一,Resource与NotResource必须二选一,Principal与NotPrincipal必须二选一。

Principal / NotPrincipal

OBS支持的Principal或NotPrincipal有匿名用户、特定租户、特定用户、联合身份用户,委托用户。

  • 所有人(匿名用户)
    "Principal": {"ID": "*"}

    在示例中,使用星号 (*) 作为Everyone/Anonymous的占位符。我们还强烈建议您不要在角色的信任策略中的Principal元素里使用通配符,除非您在该策略中通过Condition元素对访问进行了限制。

  • 特定租户

    当在策略中使用租户标识符作为授权人时,可将策略语句中的权限授给该租户中包含的所有身份。这包括该租户下所有用户。以下示例演示了将租户指定为授权人的不同方法。

    "Principal": { "ID": " domain/domainIdxxxx:user/*" }

    您可以授权给多个租户,如以下示例所示:

    "Principal": { 
      "ID": [
        "domain/domainIDxx1:user/useridxxxx",
        "domain/domainIDxx2:user/*"
      ]
    }
  • 特定用户

    在 Principal 元素中,用户名区分大小写。

    "Principal": {"ID": "domain/domainIDxxx:user/user-name" }
    "Principal": {
      "ID": [
        "domain/domainIDxxx:user/UserID1", 
        "domain/domainIDxxx:user/UserID2"
      ]
    }
  • 联合身份用户 (使用SAML身份提供商)
    "Principal": { "Federated": "domain/domainIDxxx:identity-provider/provider-name" }
    "Principal": { "Federated": "domain/domainIDxxx:group/groupname" }
  • 委托用户
    *表示对应租户下的所有委托
    "Principal": { "ID": "domain/domainIDxxx:agency/agencyname" }
    "Principal": { "ID": "domain/domainIDxxx:agency/*" }

OBS控制台支持的被授权用户指桶策略作用的用户,这里的用户可以是账号,也可以是IAM用户。被授权用户可以通过包含和排除两种方式来指定:

  • 包含:桶策略对指定的用户生效。
  • 排除:桶策略对除指定用户外的其他用户生效。

指定当前账号的IAM用户

当桶策略的“被授权用户”类型设置“当前账号”时,可以选择配置当前账号下的IAM用户(可多选),即为当前账号的IAM用户授权桶策略。

指定其他账号

当桶策略的“被授权用户”类型设置“其他账号”时,可以为设置一个其他账号。如果只想为其他账号下的IAM用户授权,则需再配置用户ID,可以指定多个IAM用户,用户ID使用(,)分隔。

账号ID和用户ID需要由被授权用户使用IAM用户登录至控制台,前往“我的凭证”页面获取。

指定任何人(匿名用户)

要将桶访问权限授予给任何人,桶策略的“被授权用户”类型设置“其他账号”,账号ID输入“*”通配符。

为匿名用户设置桶访问权限需谨慎使用。如果您授予匿名用户桶访问权限,则意味着世界上任何人都可以访问您的桶,而由此产生的流量、存储费用,都将由桶拥有者(云服务账号)自己承担。在一定要使用的情况下,我们建议您在条件中对访问请求进行限制,比如限制只能某一个IP地址的用户可以访问。

Action / NotAction

桶策略动作与资源相关,当资源为当前整个桶时,桶策略动作需配置为桶相关的动作;当资源为桶内对象时,桶策略动作需配置为对象相关的动作。

桶策略动作可以通过包含和排除两种方式来指定:

  • 包含:桶策略对指定的动作生效。
  • 排除:桶策略对除指定动作外的其他动作生效。

与桶相关的动作

表2 桶相关动作含义

类型

描述

通用(General)

*

通配符,表示该资源能进行的所有操作。

Get*

表示该资源能进行的所有的获取操作。

Put*

表示该资源能进行的所有的设置操作。

List*

表示该资源能进行的所有的列举操作。

桶(Bucket)

CreateBucket

创建桶。

DeleteBucket

删除桶。

ListBucket

列举桶内对象,获取桶元数据。

ListBucketVersions

列举桶内多版本对象。

ListBucketMultipartUploads

列举多段上传任务。

GetBucketAcl

获取桶ACL的相关信息。

PutBucketAcl

设置桶ACL。

GetBucketCORS

获取桶CORS配置的相关信息。

PutBucketCORS

设置桶CORS。

GetBucketVersioning

获取桶多版本的相关信息。

PutBucketVersioning

设置多版本。

GetBucketLocation

获取桶位置。

GetBucketLogging

获取桶日志记录的相关信息。

PutBucketLogging

设置桶日志记录。

GetBucketWebsite

获取桶的静态网站配置的相关信息。

PutBucketWebsite

设置桶的静态网站托管。

DeleteBucketWebsite

删除桶的静态网站托管配置。

GetLifecycleConfiguration

获取桶生命周期规则。

PutLifecycleConfiguration

设置桶生命周期规则。

与对象相关的动作

表3 对象相关动作含义

类型

描述

通用(General)

*

通配符,表示该资源能进行的所有操作。

Get*

表示该资源能进行的所有的获取操作。

Put*

表示该资源能进行的所有的设置操作。

List*

表示该资源能进行的所有的列举操作。

对象(Object)

GetObject

可用作于获取对象内容,获取对象元数据。

GetObjectVersion

可用作于获取指定版本对象内容,获取指定版本对象元数据。

PutObject

可用作于PUT上传,POST上传,上传段,初始化上传段任务,合并段。

GetObjectAcl

获取对象ACL的相关信息。

GetObjectVersionAcl

获取指定版本对象ACL。

PutObjectAcl

设置对象ACL。

PutObjectVersionAcl

设置指定版本对象ACL。

DeleteObject

删除对象。

DeleteObjectVersion

删除对象(针对特定版本的对象)。

ListMultipartUploadParts

列举已上传段。

AbortMultipartUpload

取消多段上传任务。

Resource / NotResource

OBS支持的Resource表示在相应的资源上操作:

  • bucketname(桶操作):在上面Action中有“支持的桶Action”列表,如果要对桶执行列表中的操作,则Resource中只填写桶名。
  • bucketname/objectname(对象操作):在上面Action中有“支持的对象Action”列表,如果要对桶中对象执行相应的操作,则Resource需要填写“bucketname/objectname”。objectname支持通配符,比如对桶下directory目录对象有权限,则Resource填写为“bucketname/directory/*”;如果对桶下所有对象都有权限,则Resource填写为“bucketname/*”;如果同时需要对桶和桶下对象都有权限,则Resource填写为["examplebucket/*","examplebucket"]。

以下示例策略向租户b4bf1b36d9ca43d984fbcb9491b6fce9(域ID)下的用户ID为71f3901173514e6988115ea2c26d1999的user1用户授予examplebucket的所有操作权限(包含桶操作与对象操作)。

{ 
    "Statement":[ 
    { 
      "Sid":"test", 
      "Effect":"Allow", 
      "Principal": {"ID": ["domain/b4bf1b36d9ca43d984fbcb9491b6fce9:user/71f3901173514e6988115ea2c26d1999"]}, 
      "Action":["*"], 
      "Resource":["examplebucket/*","examplebucket"]
    } 
  ] 
}

OBS控制台在指定资源时,资源可以是当前整个桶,也可以是桶内对象。

资源可以通过包含和排除两种方式来指定:

  • 包含:桶策略对指定的OBS资源生效。
  • 排除:桶策略对除设置外的其他OBS资源生效。

指定资源为桶

指定资源为当前整个桶时,桶策略动作需配置为桶相关的动作,配置方法为在资源输入框中不输入任何内容。

指定资源为对象

指定资源为桶内对象时,桶策略动作需配置为对象相关的动作,配置格式如下:

  • 对象:直接输入对象名称(包括文件夹名称)。例如,指定的资源是桶中imgs-folder文件夹下的example.jpg文件,则在资源输入框中输入以下内容。

    imgs-folder/example.jpg

  • 对象集:当指定给对象集时,使用通配符“*”。通配符“*”表示0个或多个字符的任意组合。其输入格式为:
    • 仅使用一个通配符“*”,表示桶中所有对象。
    • 使用“对象名称前缀”+“*”,表示桶中所有以此前缀开头的对象。示例:

      imgs*

    • 使用“*”+“对象名后缀”,表示桶中所有以此后缀结尾的对象。示例:

      *.jpg

多个对象或对象集使用英文逗号“,”分隔。

Condition

除了指定效果、被授权用户、资源、动作外,桶策略还可以指定生效条件。只有当条件设置的表达式与访问请求中的值匹配时,桶策略才生效。条件是可选参数,用户可以根据业务需要选择是否使用。

例如,账号A拥有example桶,账号B会向账号A的example桶中上传对象,账号A想要拥有账号B向example桶中上传对象的完全控制权限(因为默认情况下对象由上传该对象的账号B拥有),则可以指定上传请求中必须包含x-obs-acl键,以及显式授予完全控制权限,完整的条件表达式如下:

条件运算符

StringEquals

x-obs-acl

bucket-owner-full-control

条件由条件运算符、条件键、条件值三部分组成,最终组成一个条件表达式,决定桶策略生效的条件。同一个条件运算符中,如果存在多个相同的键,则只会保留最后一个键。条件运算符、键两者之间存在互相限制的关联关系,例如:条件运算符选择了一个String类型的,比如StringEquals,键就只能选择String类型的,比如UserAgent。键选择了一个Date类型,比如CurrentTime,条件运算符就只能选择Date类型的,比如DateEquals。

  • 条件运算符

    运算符与条件键、条件值一起构成完整的条件判断语句,当请求信息满足该条件时,策略才能生效。Statement中可选的条件运算符参见表4,String型运算符如未增加说明,不区分大小写。

表4 各条件运算符含义

类型

关键字

说明

String

StringEquals

字符串匹配,简化为:streq

StringNotEquals

字符串不匹配,简化为:strneq

StringEqualsIgnoreCase

忽略大小写的字符串匹配,简化为:streqi

StringNotEqualsIgnoreCase

忽略大小写的字符串不匹配,简化为:strneqi

StringLike

宽松的区分大小写的匹配。这些值可以在字符串中的任何地方包括一个多字符匹配的通配符(*)和单字符匹配通配符(?)。简化为:strl

StringNotLike

非宽松区分大小写的匹配。这些值可以在字符串中的任何地方包括一个多字符匹配的通配符(*)和单字符匹配通配符(?)。简化为:strnl

Numeric

NumericEquals

相等,简化为:numeq

Numeric表示数值类型

NumericNotEquals

不相等,简化为:numneq

NumericLessThan

小于,简化为:numlt

NumericLessThanEquals

小于等于,简化为:numlteq

NumericGreaterThan

大于,简化为:numgt

NumericGreaterThanEquals

大于等于,简化为:numgteq

Date

DateEquals

日期时间相等,简化为:dateeq

DateNotEquals

日期时间不相等,简化为:dateneq

DateLessThan

日期时间小于,简化为:datelt

DateLessThanEquals

日期时间小于等于,简化为:datelteq

DateGreaterThan

日期时间大于,简化为:dategt

DateGreaterThanEquals

日期时间大于等于,简化为:dategteq

Boolean

Bool

严格布尔值相等

IP address

IpAddress

指定的IP或IP范围

NotIpAddress

除指定的IP或IP范围外所有IP

条件的关键字区分大小写。Date格式符合ISO 8601规范,例如:2015-07-01T12:00:00Z

每个条件可以包含多个key-value的组合。如下图的条件组合表示的判断条件为请求时间从2015-07-01T12:00:00Z到2018-04-16T15:00:00Z,请求的IP地址范围是192.168.176.0/24"或"192.168.143.0/24"网段的请求。

"Condition" : { 
  "DateGreaterThan" : { 
  "CurrentTime" : "2015-07-01T12:00:00Z" 
  }, 
  "DateLessThan": { 
  "CurrentTime" : "2018-04-16T15:00:00Z" 
  }, 
  "IpAddress" : { 
  "SourceIp" : ["192.168.176.0/24","192.168.143.0/24"] 
  } 
}
  • 条件键

条件中可选的键包括以下三种:动作无关的通用键、与桶动作有关的键和与对象动作有关的键。

动作无关的通用键包括:

表5 通用键

类型

描述

CurrentTime

Date

服务器接收请求的时间,格式满足ISO 8601标准。

EpochTime

Numeric

服务器接收请求的时间,格式为1970.01.01 00:00:00 UTC开始所经过的秒数,不考虑闰秒。

SecureTransport

Bool

请求是否使用SSL加密。

说明:

值为非“true”时,服务端会默认修正为“false”。

SourceIp

IP address

请求发起的源IP,即客户端IP。

UserAgent

String

请求的客户端软件代理程序。

Referer

String

请求从哪个链接发起。

条件中的键需要在一定的Action才能使用,Action和条件中的键配对使用关系如下表所示:

表6 与桶动作有关的键

Action

可选键

描述

说明

ListBucket

prefix

String类型,列举以指定的字符串prefix开头的对象。

配置prefix、delimiter、max-keys后,执行List操作时需要带上符合条件的键值对信息,桶策略才生效。

例如,某桶配置了匿名用户可读的桶策略,且条件运算符=NumericEquals,键=max-keys,值=100。则匿名用户列举对象时需要在桶访问域名末尾加上?max-keys=100,才能完成对象列举,且列举的对象将是按照字典顺序的前100个对象。

delimiter

String类型,用来分组桶内对象的字符串。

max-keys

Numeric类型,指定返回的最大数,返回的对象列表将是按照字典顺序的最多前max-keys个对象。

ListBucketVersions

prefix

String类型,列举以指定的字符串prefix开头的多版本对象。

delimiter

String类型,用来分组桶内多版本对象的字符串。

max-keys

Numeric类型,指定返回的最大数,返回的对象列表将是按照字典顺序的最多前max-keys个对象。

PutBucketAcl

x-obs-acl

String类型,设置桶ACL。修改桶ACL时在头域中可以包含的Canned ACL,取值范围为private|public-read|public-read-write|bucketowner-read|log-delivery-write。

表7 与对象动作相关的键

Action

可选键

描述

PutObject

x-obs-acl

String类型,设置对象ACL。上传对象时在头域中可以包含的Canned ACL,取值范围为private|public-read|public-read-write|bucketowner-read|bucket-owner-full-control|log-delivery-write。

x-obs-copy-source

String类型,用来指定复制对象时对象操作的源桶名以及源对象名。格式如/bucketname/keyname。

x-obs-metadata-directive

String类型,用来指定新对象的元数据是从元对象中复制,还是用请求中的元数据替换,取值范围为COPY|REPLACE。

x-obs-server-side-encryption

String类型,用来指定桶中对象以SSE-KMS方式加密存储,取值为kms。

PutObjectAcl

x-obs-acl

String类型,设置对象ACL。上传对象时在头域中可以包含的Canned ACL,取值范围为private|public-read|public-read-write|bucketowner-read|bucket-owner-full-control|log-delivery-write。

GetObjectVersion

versionId

String类型,获取versionId为xxx版本的对象。

GetObjectVersionAcl

versionId

String类型,获取versionId为xxx版本的对象ACL。

PutObjectVersionAcl

versionId

String类型,设置versionId。

x-obs-acl

String类型,设置versionId为xxx版本的对象ACL。上传对象时在头域中可以包含的Canned ACL,取值范围为private|public-read|public-read-write|bucketowner-read|bucket-owner-full-control|log-delivery-write。

DeleteObjectVersion

versionId

String类型,删除versionId为xxx版本的对象。

Policy权限判断逻辑

Policy在做权限判断时,每条statement会有3种结果,Explicit Deny、Allow和Default Deny。Bucket Policy对于Policy中的多条statement采用以下规则进行判定:Bucket Policy对Policy中包含的每条statement都要进行Explicit Deny、Allow和Default Deny的判断,最终的判决结果遵循Explicit Deny>Allow>Default Deny的规则;

1.如果没有显式的Deny和Allow,则请求权限判别为Default Deny

2.显式的Deny覆盖Allow;

3.Allow覆盖默认的Default Deny;

4.statement的顺序没有影响。

表8 Statement Result

名称

说明

explicit deny

显式拒绝访问,资源匹配的statement中effect="deny",表明Request无法进行访问,此时直接返回无权限失败。

allow

允许访问,资源匹配的statement中effect="allow",表明Request可以进行访问,继续下一条statement判断。

default deny

默认拒绝访问,在没有任何一条statement与Request匹配上,默认本次Request无法进行访问。

如果ACL和Bucket Policy同时使用, 则ACL对某个租户的授权结果allow,可以被Bucket Policy的显式Deny覆盖。

如果Bucket Policy和IAM Policy同时使用,同样遵循explicit deny>allow>default deny的规则。

SSE-KMS服务端加密对象,不支持Bucket ACL/Policy进行跨租户授权访问。