更新时间:2024-08-15 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取值则固定为{"Service": "obs"}。关于桶清单的详细介绍请参见桶清单说明

可选,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/*" }

如果通过控制台进行桶清单配置,控制台会自动生成目标桶的桶策略。目标桶的桶策略中Principal为:

"Principal":{"Service": "obs"}

关于桶清单的详细介绍请参见桶清单说明

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

(可选项)排除以上被授权用户:桶策略对除指定用户外的其他用户生效。

  • 不勾选:表示桶策略对指定的用户生效。
  • 勾选:表示桶策略对除指定用户外的其他用户生效。

指定当前账号的子用户

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

指定其他账号

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

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

指定委托账号

当桶策略的“被授权用户”类型设置“委托账号”时,可以设置一个或多个委托账号。创建成功后可以将账号中的资源操作权限委托给其他账号,被委托的账号可以根据权限代替您进行资源运维工作。

当勾选“其他账号”后才可添加委托账号。

指定任何人(所有账号)

要将桶访问权限授予给任何人,桶策略的“被授权用户”类型设置“所有账号”。

为所有账号设置桶访问权限需谨慎使用。如果您授予所有账号桶访问权限,则意味着世界上任何人都可以访问您的桶。在一定要使用的情况下,我们建议您在条件中对访问请求进行限制,比如限制只能某一个IP地址的用户可以访问。

Action / NotAction

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

桶策略动作可以通过排除策略来指定:

(可选项)排除以上授权操作:桶策略对除指定动作外的其他动作生效。

  • 不勾选:表示桶策略对指定的动作生效。
  • 勾选:表示桶策略对除指定动作外的其他动作生效。
  • 对于桶策略模板,“桶读写”模板默认勾选,其他模板默认不勾选。桶策略模板中的动作排除策略不支持修改。

与桶相关的动作

表2 桶相关动作含义

类型

描述

通用(General)

*

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

Get*

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

Put*

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

List*

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

桶(Bucket)

HeadBucket

判断桶是否存在,获取桶元数据。

CreateBucket

创建桶。

DeleteBucket

删除桶。

ListBucket

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

ListBucketVersions

列举桶内多版本对象。

ListBucketMultipartUploads

列举多段上传任务。

GetBucketAcl

获取桶ACL的相关信息。

PutBucketAcl

设置桶ACL。

GetBucketCORS

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

PutBucketCORS

设置桶CORS。

GetBucketVersioning

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

PutBucketVersioning

设置多版本。

GetBucketLocation

获取桶位置。

GetBucketLogging

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

PutBucketLogging

设置桶日志记录。

GetBucketWebsite

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

PutBucketWebsite

设置桶的静态网站托管。

DeleteBucketWebsite

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

GetLifecycleConfiguration

获取桶生命周期规则。

PutLifecycleConfiguration

设置桶生命周期规则。

GetBucketInventoryConfiguration

获取桶清单配置。

PutBucketInventoryConfiguration

设置桶清单配置。

DeleteBucketInventoryConfiguration

删除桶清单配置。

PutBucketPolicy

设置桶策略。

说明:

风险操作,请谨慎授权。

拥有此权限的用户可以任意更改桶策略,并可以通过此权限获取其他权限,包括删除桶策略等。

GetBucketPolicy

获取桶策略。

DeleteBucketPolicy

删除桶策略。

PutBucketNotification

设置桶事件通知。

GetBucketNotification

获取桶事件通知。

PutBucketStoragePolicy

设置桶默认存储类别。

GetBucketStoragePolicy

获取桶默认存储类别。

PutReplicationConfiguration

设置桶跨区域复制配置。

GetReplicationConfiguration

获取桶跨区域复制配置。

DeleteReplicationConfiguration

删除桶跨区域复制配置。

PutBucketTagging

设置桶标签。

GetBucketTagging

获取桶标签。

DeleteBucketTagging

删除桶标签。

PutBucketQuota

设置桶配额。

GetBucketQuota

获取桶配额。

PutBucketCustomDomainConfiguration

设置桶自定义域名。

GetBucketCustomDomainConfiguration

获取桶自定义域名。

DeleteBucketCustomDomainConfiguration

删除桶自定义域名。

PutDirectColdAccessConfiguration

设置桶归档数据直读配置。

GetDirectColdAccessConfiguration

获取桶归档数据直读配置。

DeleteDirectColdAccessConfiguration

删除桶归档数据直读配置。

GetEncryptionConfiguration

获取桶默认加密配置。

PutEncryptionConfiguration

设置桶默认加密。

PutBucketObjectLockConfiguration

配置桶级默认保留策略。

GetBucketObjectLockConfiguration

获取桶级默认保留策略。

与对象相关的动作

表3 对象相关动作含义

类型

描述

通用(General)

*

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

Get*

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

Put*

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

List*

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

对象(Object)

GetObject

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

GetObjectVersion

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

PutObject

可用作于PUT上传,POST上传,上传段,初始化上传段任务,合并段。可作用于PUT Object, POST Object, Initiate Multipart Upload,Upload Part, Complete Multipart Upload。

GetObjectAcl

获取对象ACL的相关信息。

GetObjectVersionAcl

获取指定版本对象ACL。

PutObjectAcl

设置对象ACL。

PutObjectVersionAcl

设置指定版本对象ACL。

DeleteObject

删除对象。

DeleteObjectVersion

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

ListMultipartUploadParts

列举已上传段。

AbortMultipartUpload

取消多段上传任务。

ModifyObjectMetadata

修改对象元数据。

RestoreObject

恢复归档存储对象。

PutObjectRetention

配置对象保留策略。

PutObjectTagging

设置对象标签。

GetObjectTagging

获取对象标签。

DeleteObjectTagging

删除对象标签。

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

请求从哪个链接发起。

SourceVpce

String

请求发起的VPC终端节点ID。

说明:

仅华南-广州、华东-上海一区域支持。

SourceVpc

String

请求发起的VPC ID。

说明:

仅华南-广州、华东-上海一区域支持。

ServiceAgency

String

IAM委托名称,委托云服务访问OBS。

条件中的键需要在一定的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进行跨租户授权访问。

相关文档