访问控制

Bucket权限控制

创建Bucket后,可使用ACL对Bucket权限进行管理。

BOS同时支持使用API与使用SDK删除Bucket,具体如下:

下面是使用Java SDK的代码示例:

public void setBucketPrivate (BosClient client, String bucketName) {
    client.setBucketAcl(bucketName, CannedAccessControlList.Private);
}

注意: 在创建Bucket的时候,默认权限为private。

Object权限控制

目前BOS也提供Object级别的细粒度访问权限控制,即Bucket内不同Object对不同用户具有不同的访问控制权限。用户可以通过CannedACL和ACL文件的方式对单个Object的访问权限进行控制,Object目前支持READ和FULL_CONTROL两种权限类型。

注意

  • 新创建的Object默认Object ACL为空,用户访问时以Bucket ACL为准。
  • 如果Object没有设置权限,则Object ACL为空,默认以Bucket权限为准。
  • Object ACL优先级高于Bucket ACL,例如用户设置了Object的权限是public-read,无论Bucket是什么权限,该Object都可以被访问。
  • 目前Object ACL鉴权只对GetObjectMeta、GetObject、CopyObject、UploadPartCopy四个接口生效。
  • 获取、设置和删除Object Acl需要拥有Object的FULL_CONTROL权限;如果Object ACL为空,则需要拥有Bucket的FULL_CONTROL权限或者用户是Bucket Owner。

BOS多用户访问控制

IAM子用户概述

如果有新的用户或应用程序需要访问您的云资源,您可以通过创建IAM子用户并授权来实现。BOS已经接入IAM子用户系统。通过IAM子用户,您可以实现:

  1. 同账号授权:您可以授权自己账号下的子用户去管理自己账号下的云资源(Bucket和Object)。
  2. 跨账号授权:您可以授权自己账号下的子用户去管理他人账号下的云资源(Bucket和Object)。

IAM子账号有以下特点:

  1. 所有IAM子账号的资源都隶属于主账号。尽管子账号可以创建资源,但计费主体依然是主账号。
  2. 子账号可以独立使用管理控制台,并且可以创建AK/SK来调用API。
  3. 主账号可以对子账号进行授权,在IAM里授权是通过给子账号关联策略来完成的,一个子账号可以关联多个策略。
    • 当子用户访问同账号资源时,只要主账号给子账号的授权里允许该操作即可放行;
    • 当子用户访问跨账号资源时,除了需要主账号给子账号的授权外,还需要主账号自身有访问跨账号资源的权限。

IAM子用户应用场景

  • 企业子账号管理与分权

    企业A使用百度智能云账号购买了多种云资源(如BCC实例/RDS实例/BLB实例/BOS存储/...),A的员工需要操作这些云资源包括购买、运维、线上应用等。不同岗位员工的工作职责不一样,需要的权限也不一样。出于安全考虑,A不希望将主账号的密钥直接公布给员工,而希望能给不同岗位员工创建相应的用户子账号。用户子账号只能在授权的前提下操作资源,不需要进行独立的计量计费,所有资源费用都归属主账号。A主账号随时可以撤销子账号的权限,也可以随时删除其创建的子账号。

  • 企业之间的资源操作与授权管理

    A和B代表不同的企业。A购买了多种云资源(如BCC实例/RDS实例/BLB实例/BOS存储/...)来开展业务。A希望能专注于业务系统,而将云资源运维监控管理等任务委托或授权给企业B。企业B也可以进一步将代运维任务分配给B的员工,即B为其员工创建相应的用户子账号供其使用。B可以精细控制其员工对A的云资源操作权限。如果A和B的这种代运维合同终止,A随时可以撤销对B的授权。

策略文件说明

IAM主账户授权给子账户通过关联策略实现,策略文件本质上是一个JSON文件,文件中permission和resource用来定义权限和资源。策略文件对应的空白模版如下:

{
    "accessControlList": [
        {
            "service": "bce:bos",
            "region": "*",
            "effect": "Allow",
            "permission": [],
            "resource": [],
        }
    ]
}

策略文件中各字段的含义如下:

字段 数据类型 说明 是否必须 父节点
accessControlList list 标识acl主体的开始,由一或多组acl配置项组成,其中acl配置项由service+region+effect+permission+resource组合而成。
+service string acl配置项影响的服务组件。 accessControlList
+region string acl配置项影响的区域,取值范围为bjgz*。其中bj代表北京region,gz代表广州region,*代表示所有区域。 accessControlList
+effect string 指定与该条acl配置项匹配的Request能否执行,取值为AllowDenyAllow表示可以执行Deny表示拒绝执行。 accessControlList
+permission list ACL配置项所影响的权限,取值范围为READLISTWRITEFULL_CONTROLListBuckets,不支持配置通配符*。每个permission的具体含义见下表。 accessControlList
+resource list ACL配置项所影响的资源,支持通配符。如:*<BucketName><BucketName>/<Prefix>;*<BucketName>/<ObjectKey>。IAM在校验请求时,对resource字段是做严格字符串匹配,因此若该字段被配置为"abc",则表明该条规则仅对名为“abc”的bucket相关的bucket级别操作生效,而对object级别操作不生效。比如说请求API为操作bucket ”abc“下所属某object(如”obj01“),则BOS传给IAM的资源字段为“abc/obj01”,与策略文件中所配置resource("abc")会匹配不上,该条规则不生效。 accessControlList

每种permission所对应的BOS API如下:

permission 对应的BOS API
ListBuckets GetService(ListBuckets)
READ GetBucketLocation, HeadBucket, GetObject, GetObjectMeta, ListParts
LIST ListObjects, ListMultipartUploads
WRITE PutObject, InitiateMultipartUpload, UploadPart, CompleteMultipartUpload, AbortMultipartUpload, DeleteObject, DeleteMultipleObjects, AppendObject, PostObject
FULL_CONTROL READ、WRITE、LIST对应的API, 还包含PutBucketACL, GetBucketACL, PutBucketCors, GetBucketCors, DeleteBucketCors, PutBucketLogging, GetBucketLogging, DeleteBucketLogging

系统策略

为了方便用户使用,百度智能云内置了两个常用策略作为系统策略:BosFullAccess和BosListAndReadAccess。

  • BosFullAccess:管理百度智能云对象存储服务(BOS)的权限。
  • BosListAndReadAccess:只读访问百度智能云对象存储服务(BOS)的权限。

说明:系统策略无法修改且不能删除。

在“策略管理”页面点击策略名称对应操作列的“查看”按钮,可以查看两个系统策略对应的JSON文件。

自定义策略

如果您需要定制更精细的权限控制,可以创建一个自定义策略。自定义策略即用户通过策略文件定义子账号的资源和权限,通过自定义策略用户可以更精准的控制权限和资源。策略本质上为JSON文件,您可以参考策略文件说明,也可以参考以下典型场景示例。示例中假设bucket名为mybucket。

授权子用户某个Bucket的完全管理权限(使用控制台管理)

{
    "accessControlList": [
        {
            "service": "bce:bos",
            "region": "*",
            "effect": "Allow",
            "permission": [
                "FULL_CONTROL"
            ],
            "resource": [
                "mybucket",
                "mybucket/*"
            ]
        },
        {
            "service": "bce:bos",
            "region": "*",
            "effect": "Allow",
            "permission": [
                "ListBuckets"
            ],
            "resource": [
                "*"
            ]
        }
    ]
}

注意:

  • resource字段需要同时写mybucket和mybucket/*。
  • 如果您希望通过控制台管理某个bucket,那还需要有ListBuckets的权限,不然Bucket列表是打不开的。
  • 子用户支持实现跨账号资源授权。比如这里的mybucket可以是其他账号下的资源。假设这里有两个账号,账号A下有mybucket,账号B下有个子用户。账号A可以首先通过更新Bucket权限来把mybucket授权给账号B来使用。然后账号B可以创建一个自定义策略来进一步把管理mybucket的权限授予子用户。

授权子用户某个Bucket的完全管理权限(不使用控制台管理和BOS桌面)

{
    "accessControlList": [
        {
            "service": "bce:bos",
            "region": "*",
            "effect": "Allow",
            "permission": [
                "FULL_CONTROL"
            ],
            "resource": [
                "mybucket",
                "mybucket/*"
            ]
        }
    ]
}

注意:

  • resource字段需要同时写mybucket和mybucket/*。
  • 如果不通过控制台来管理bucket,则无需开放ListBuckets权限。您可以直接通过BOS周边工具、SDK来使用BOS服务。

授权子用户对某个prefix(目录)的只读权限

假设某bucket用于存放照片,照片按照拍摄地点存放,每个拍摄地点下有年份子目录。现在需要授予子用户读取mybucket/shanghai/2013/目录的只读权限。目录结构如下:

mybucket //bucket
    |-- beijing
    |    |--2010
    |    |--2011
    |-- shanghai
    |    |--2012
    |    |--2013 //授予此目录的只读权限
    |--shenzhen
        |--2014
        |--2015

假设子用户已经知道所有文件的路径,不需要列出文件的权限:

{
    "accessControlList": [
        {
            "service": "bce:bos",
            "region": "*",
            "effect": "Allow",
            "permission": [
                "READ"
            ],
            "resource": [
                "mybucket/shanghai/2013/*"
            ]
        }
    ]
}

设置Referer白名单

为了防止用户存储在BOS上的数据被其他人盗链,BOS支持基于HTTP header referer字段的防盗链方法。用户可以通过BOS控制台设置Referer字段的白名单。设置白名单后,只有Referer字段在白名单内的用户才可以访问Bucket中存储的数据,不在白名单内的请求会被拒绝。但若用户的Referer为空时,默认可以访问,不受白名单限制。

设置Referer白名单功能目前只支持通过控制台进行操作,具体操作以及一些限制请参见设置Referer白名单