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

桶策略

桶策略

桶策略是作用于所配置的OBS桶及桶内对象的。OBS桶拥有者通过桶策略可为IAM用户或其他账号授权桶及桶内对象的操作权限。

  • 创建桶和获取桶列表这两个服务级的操作权限,需要通过IAM权限配置。
  • 由于缓存的存在,配置桶策略后,最长需要等待5分钟策略才能生效。

桶策略简介

桶策略是作用于所配置的OBS桶及桶内对象的。OBS桶拥有者通过桶策略可为IAM用户、其他账号或匿名用户授权桶及桶内对象的操作权限。OBS提供标准桶策略和高级桶策略。

标准桶策略

标准桶策略提供三种策略供用户直接设置。

  • 私有:除桶ACL授权外的其他用户无桶的访问权限。
  • 公共读:任何用户都可以对桶内对象进行读操作。
  • 公共读写:任何用户都可以对桶内对象进行读/写/删除操作。

桶创建成功后,默认桶策略为私有,仅桶拥有者具有完全控制权限,其他用户在未经授权的情况下均无访问权限。为确保数据安全,不推荐用户使用公共读或公共读写,建议使用私有。

表1 标准桶策略描述

参数

私有

公共读

公共读写

效果

允许

允许

被授权用户

*(任何用户)

*(任何用户)

资源

*(桶内所有对象)

*(桶内所有对象)

动作

  • GetObject
  • GetObjectVersion
  • HeadBucket
  • ListBucket
  • GetObject
  • GetObjectVersion
  • PutObject
  • DeleteObject
  • DeleteObjectVersion
  • HeadBucket
  • ListBucket

条件

高级桶策略:

高级桶策略提供三种方式,方便用户快速设置桶策略。

  • 只读模式:被授权用户将拥有桶内指定对象的读权限,对应可以执行获取对象内容及元数据操作。
  • 读写模式:被授权用户将拥有桶内指定对象的读写权限,对应可以执行获取对象内容及元数据、上传对象、删除对象等操作。
  • 自定义模式:自定义配置被授权用户可以拥有桶或对象的操作权限,由效果、被授权用户、资源、动作和条件5个桶策略基本参数共同决定。详细请参见桶策略参数说明

通常情况下,在控制台上通过高级桶策略给其他用户授予桶中资源的某些操作权限,需要同时授予用户桶的读权限ListBucket(配置策略时资源留空表示对桶授权),否则可能导致用户从控制台进入桶后提示没有权限。

桶策略应用场景

  • 允许其他账号访问OBS资源,可以使用桶策略的方式授权对应权限。
  • 当不同的桶对于不同的IAM用户有不同的访问控制需求时,需使用桶策略分别授权IAM用户不同的权限。

桶策略结构&语法

一个桶策略由JSON描述,格式定义为:
{ 
"Statement" : [
    {
     statement1
    },
    {
     statement2
    },
  ......
  ]
}
实例如下所示:
{
   "Statement":[
       {
           "Sid": "ExampleStatementID1",
           "Principal":{
               "ID":[
                   "domain/account ID", 
                   "domain/account ID:user/User ID" 
               ]
           },
           "Effect":"Allow",
           "Action":[
               "CreateBucket",
               "DeleteBucket"
           ],
           "Resource":"000-02/key01",
           "Condition":{
               "NumericNotEquals":{
                   "Referer":"sdf"
               },
               "StringNotLike":{
                   "Delimiter":"ouio"
               }
           }
       }
   ]
 }

桶策略由多条Statement组成,也可以是一条。每条Statement的结构包括下表内容:

表2 statement结构

元素

描述

是否必选

Sid

Statement ID,可选关键字,描述Statement的字符串。

可选

Principal

可选关键字,被授权人,指定本条Statement权限针对的Domain(账号)以及User(IAM用户),支持通配符“*”,表示所有用户。

  • 当对Domain(账号)下所有IAM用户授权时,Principal格式为domain/domainid:user/*
  • 当对某个User进行授权时,Principal格式为domain/domainid:user/userId或者domain/domainid:user/userName。

可选,Principal与NotPrincipal必选其一

NotPrincipal

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

可选,NotPrincipal与Principal必选其一

Effect

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

必选

Action

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

可选,Action与NotAction必选其一

NotAction

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

可选,NotAction与Action必选其一

Resource

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

可选,Resource与NotResource必选其一

NotResource

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

可选,NotResource与Resource必选其一

Condition

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

可选

各个要素的详细介绍,请参见桶策略参数说明

桶策略样例

  • 示例1:向IAM用户授予指定桶中所有对象的指定操作权限

    以下示例策略向账号b4bf1b36d9ca43d984fbcb9491b6fce9(账号ID)下的用户ID为71f3901173514e6988115ea2c26d1999的IAM用户授予PutObject和PutObjectAcl权限。

    {
        "Statement":[
        {
          "Sid":"AddCannedAcl",
          "Effect":"Allow",
          "Principal": {"ID": ["domain/b4bf1b36d9ca43d984fbcb9491b6fce9:user/71f3901173514e6988115ea2c26d1999"]},
          "Action":["PutObject","PutObjectAcl"],
          "Resource":["examplebucket/*"]
        }
      ]
    }
  • 示例2:向IAM用户授予指定桶的所有操作权限

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

    {
        "Statement":[
        {
          "Sid":"test",
          "Effect":"Allow",
          "Principal": {"ID": ["domain/b4bf1b36d9ca43d984fbcb9491b6fce9:user/71f3901173514e6988115ea2c26d1999"]},
          "Action":["*"],
          "Resource":[
            "examplebucket/*",
            "examplebucket"
          ]
        }
      ]
    }
  • 示例3:向OBS用户授予除删除对象外的所有对象操作权限

    以下示例策略向账号b4bf1b36d9ca43d984fbcb9491b6fce9(账号户ID)下的用户ID为71f3901173514e6988115ea2c26d1999的IAM用户授予examplebucket除删除对象外的所有对象操作权限。

    {
        "Statement":[
        {
          "Sid":"test1",
          "Effect":"Allow",
          "Principal": {"ID": ["domain/b4bf1b36d9ca43d984fbcb9491b6fce9:user/71f3901173514e6988115ea2c26d1999"]},
          "Action":["*"],
          "Resource":["examplebucket/*"]
        },
        {
          "Sid":"test2",
          "Effect":"Deny",
          "Principal": {"ID": ["domain/b4bf1b36d9ca43d984fbcb9491b6fce9:user/71f3901173514e6988115ea2c26d1999"]},
          "Action":["DeleteObject"],
          "Resource":["examplebucket/*"]
        }
      ]
    }
  • 示例4:向匿名用户授予指定对象的只读权限

    下面的示例策略向匿名用户授予examplebucket桶中exampleobject的GetObject(下载对象)权限。此权限允许任何人读取对象exampleobject的数据。

    {
        "Statement":[
        {
          "Sid":"AddPerm",
          "Effect":"Allow",
          "Principal": "*",
          "Action":["GetObject"],
          "Resource":["examplebucket/exampleobject"]
        }
      ]
    }
  • 示例5:限制对特定IP地址的访问权限

    以下示例向任何用户授予对指定桶中的对象执行任何OBS操作的权限。但是,请求必须来自条件中指定的IP地址范围。此语句的条件确定允许的IP地址范围为192.168.0.*,只有一个例外:192.168.0.1。

    Condition块使用IpAddress和NotIpAddress条件以及SourceIp条件键(这是OBS范围的条件键)。另请注意SourceIp值使用RFC 4632中描述的CIDR表示法。

    {
      "Statement": [
        {
          "Sid": "IPAllow",
          "Effect": "Allow",
          "Principal": "*",
          "Action": "*",
          "Resource": "examplebucket/*",
          "Condition": {
             "IpAddress": {"SourceIp": "192.168.0.0/24"},
             "NotIpAddress": {"SourceIp": "192.168.0.1/32"} 
          } 
        } 
      ]
    }