更新时间:2026-03-17 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策略仅针对Principal中指定的Domain(账号)以及User(IAM用户)生效。支持通配符“*”,表示所有用户,当对Domain下所有用户授权时,Principal格式为domain/domainid:user/*当对某个User进行授权时,Principal格式为domain/domainid:user/userId或者domain/domainid:user/userName。

可选,Principal与NotPrincipal选其一

NotPrincipal

可选关键字,排除的授权人,即本条statement策略针对NotPrincipal中指定的Domain(账号)以及User(IAM用户)不生效。取值同Principal。

使用NotPrincipal排除子用户时,需要在ID字段中添加该子用户的domain_id,即:domain/domain_id

示例:拒绝除了某个指定IAM用户以外的其他用户执行所有操作

其中domain_id是账号ID,user_id是IAM用户ID。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
{
    "Statement": [
        {
            "Effect": "Deny", 
            "Action": ["*"], 
            "Resource": [
                "examplebucket/*", 
                "examplebucket"
            ], 
            "NotPrincipal": {
                "ID": [
                    "domain/domain_id:user/user_id", 
                    "domain/domain_id"
                ]
            }
        }
     ]
}

可选,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身份提供商)
    如果您想为联合身份用户 (使用SAML身份提供商)配置桶策略,Principal请按照如下格式配置。其中domainIDxxx为被授权用户的账号ID,provider-name为被授权用户的身份提供商名称:
    "Principal": { "Federated": "domain/domainIDxxx:identity-provider/provider-name" }
    如果您想为联合身份用户(使用SAML身份提供商)映射的用户组授权,Principal请按照如下格式配置。其中groupname是联邦用户映射的IAM用户组名:
    "Principal": { "Federated": "domain/domainIDxxx:group/groupname" }
  • 委托用户
    *表示对应租户下的所有委托
    "Principal": { "ID": "domain/domainIDxxx:agency/agencyname" }
    "Principal": { "ID": "domain/domainIDxxx:agency/*" }

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

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

指定任何人(匿名用户)

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

Action / NotAction

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

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

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

与桶相关的动作

与桶相关的动作详细介绍请参见。

与对象相关的动作

与对象相关的动作详细介绍请参见。

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

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

条件运算符

StringEquals

x-obs-acl

bucket-owner-full-control

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

每个条件可以包含多个“条件键-运算符-条件值”的组合。如下图的条件组合表示的判断条件为请求时间从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"] 
  } 
}

条件运算符

运算符与条件键、条件值一起构成完整的条件判断语句,当请求信息满足该条件时,策略才能生效。Statement中可选的条件运算符参见表2。同一个条件运算符如果同时对应多个相同的键,则只会保留最后一个键。

表2 各条件运算符含义

类型

关键字

说明

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

(Date格式要求符合ISO 8601规范,例如:2015-07-01T12:00:00Z)

DateEquals

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

DateNotEquals

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

DateLessThan

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

DateLessThanEquals

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

DateGreaterThan

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

DateGreaterThanEquals

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

Boolean

Bool

严格布尔值相等

IP address

IpAddress

指定的IP或IP范围

NotIpAddress

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

条件键

条件键包括动作无关的通用键、与桶动作有关的键和与对象动作有关的键。动作无关的通用键如表3所示,适用于所有操作:

表3 通用键

全局条件键

类型

说明

IAM策略是否支持

桶策略是否支持

CurrentTime

Date

同g:CurrentTime。

EpochTime

Numeric

服务器接收到请求的时间,格式为Unix 时间戳,即从1970.01.01 00:00:00 UTC开始到目标时间所经过的 “秒数”,不考虑闰秒。

Referer

String

同g:Referer。

SecureTransport

Boolean

同g:SecureTransport

SourceIp

IP address

用于限制发起请求的IP,优先识别客户携带的IP,如果未携带IP则取网络上一跳IP地址。该条件键存在一定的IP伪造风险。

UserAgent

String

同g:UserAgent

与动作有关的条件键需要在选择指定的Action时才能使用,Action和条件键的配对使用关系如表4表5所示:

表4 与桶动作有关的键

Action

可选键

描述

说明

IAM策略是否支持

桶策略是否支持

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。

CreateBucket

x-obs-server-side-encryption-kms-key-id

String类型,限制指定用于加密的KMS KEY ID。当ID值为"obs/default",则代表限制使用默认密钥;当使用SSE-OBS/SSE-C加密方式时,该值为空。

PutEncryptionConfiguration

表5 与对象动作相关的键

Action

可选键

描述

IAM策略是否支持

桶策略是否支持

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。

x-obs-server-side-encryption-kms-key-id

String类型,限制指定用于加密的KMS KEY ID。当ID值为"obs/default",则代表限制使用默认密钥;当使用SSE-OBS/SSE-C加密方式时,该值为空。

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的顺序没有影响。

表6 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进行跨租户授权访问。