更新时间:2026-05-15 GMT+08:00
分享

ACL

访问控制列表(Access Control List,ACL)用于资源拥有者给其他账号授予资源的访问权限。OBS ACL是基于账号级别的读写权限控制,且主要用于授予基本的读/写权限,权限控制细粒度不如桶策略和IAM权限。一般情况下,建议使用IAM权限和桶策略进行访问控制。

默认情况下,创建存储桶或对象时仅资源拥有者对资源的完全控制权限,即桶创建者对桶拥有完全控制权限,对象上传者对对象拥有完全控制权限,而其他账号默认无权访问资源。如果资源拥有者想授予其他账号资源的读写权限,可以使用ACL实现。OBS桶和对象的ACL是基于账号进行授权,授权后对账号和账号下的IAM用户都生效。

ACL应用场景

在以下场景,建议您使用ACL:

  • 账号A上传对象a到账号B的桶,对象a拥有者是账号A,账号B默认没有对象a的读写权限,此时建议账号A将对象ACL设置为bucket-owner-full-control权限,此时账号B拥有对象a的完全控制权,便于账号B作为桶拥有者对对象进行统一管理。
  • 需要对象级的访问权限控制时。桶策略可以授予对象或对象集访问权限,当授予一个对象集权限后,想对对象集中某一个对象再进行单独授权,通过配置桶策略的方法显然不太实际。此时建议使用对象ACL,使得单个对象的权限控制更加方便。

桶ACL和对象ACL的关系

OBS支持为桶和对象分别配置ACL,桶ACL和对象ACL的关系如表1:

表1 桶ACL和对象ACL的关系

比较维度

桶ACL

对象ACL

谁来授权

桶拥有者

指创建桶的账号。桶拥有者默认拥有所有的桶访问权限,其中桶ACL的读取和写入这两种权限永远拥有,且不支持修改。不建议修改桶拥有者对桶的读取和写入权限。

对象拥有者

指上传对象的账号,而不是对象所属桶的拥有者。例如,账号A上传对象a到账号B的桶时,对象拥有者是账号A。

对象拥有者默认拥有其对象的所有访问权限,其中对象ACL的读取和写入这两种权限永远拥有且不支持修改。

可以授权给谁

  • 其他账号
  • 匿名用户
  • 日志投递用户组
  • 其他账号
  • 匿名用户

可以授予什么权限

  • 桶访问权限
  • 桶ACL访问权限
  • 对象是否继承桶ACL
  • 对象访问权限
  • 对象ACL访问权限
  • 对象是否继承桶ACL

桶ACL和对象ACL的继承关系

对象ACL继承桶ACL时,授权的用户取桶ACL和对象ACL的全集:

  • 继承读(READ):桶ACL和对象ACL的READ授权用户,都可以读对象。例如,桶ACL配置为匿名用户可读,对象ACL配置为账号A可读,最后作用结果为“匿名用户+账号A”可读,此时对象a实际为匿名用户可读。
  • 继承读ACL属性(READ_ACP):桶ACL和对象ACL的READ_ACP授权用户,都可以读对象的ACL属性。
  • 继承写ACL属性(WRITE_ACP):桶ACL和对象ACL的WRITE_ACP授权用户,都可以更新对象的ACL属性。

可以授权给谁

OBS支持通过ACL对表2所示用户授予桶的访问权限。

表2 OBS支持的被授权用户类型

被授权用户类型

描述

其他账号

ACL支持通过账号授予桶/对象的访问权限。授予账号权限后,账号下所有具有OBS资源权限的IAM用户都可以拥有此桶/对象的访问权限。

当需要为其他账号下不同IAM用户授予不同的权限时,可以通过桶策略配置。

说明:

跨账号场景,用户在拥有ACL权限的同时,还要拥有IAM权限,才能正常访问资源,详见访问控制机制冲突时,如何工作?

匿名用户

未注册华为云的普通访客。如果匿名用户被授予了访问桶/对象的权限,则表示所有人都可以访问对应的桶/对象,并且不需要经过任何身份认证。

注意:

开启匿名用户的桶/对象访问权限后,所有人都可以在不经过身份认证的情况下,对桶/对象进行访问,请谨慎操作。

日志投递用户组

说明:

仅桶ACL支持。

日志投递用户组用于投递OBS桶及对象的访问日志。由于OBS本身不能在账户的桶中创建或上传任何文件,因此在需要为桶记录访问日志时,只能由账户授予日志投递用户组一定权限后,OBS才能将访问日志写入指定的日志存储桶中。该用户组仅用于OBS内部的日志记录。

须知:

当日志记录开启后,目标存储桶的日志投递用户组会同步开启桶的写入权限和ACL读取权限。如果手动将日志投递用户组的桶写入权限和ACL读取权限关闭,桶的日志记录会失败。

可以授予什么权限

使用桶ACL功能可以配置表4 桶访问权限和表5 桶ACL访问权限:

表3 桶访问权限

配置选项

描述

读取权限

允许被授权者获取桶内对象列表和桶元数据。

写入权限

允许被授权者向桶中上传对象。

对于桶中现有对象,允许授权者删除和覆盖这些对象。

对象读权限

对象继承桶的访问权限,在桶配置读取权限时,对象继承配置,允许被授权者获取对象内容和元数据。

表4 桶ACL访问权限

配置选项

描述

读取权限

允许被授权者读取桶ACL属性。

写入权限

允许被授权者更新桶ACL属性。

使用对象ACL功能可以配置表6 对象访问权限和表7 对象ACL访问权限:

表5 对象访问权限

配置选项

描述

读取权限

允许被授权者获取对象内容和元数据。

表6 对象ACL访问权限

配置选项

描述

读取权限

允许被授权者读取对象ACL属性。

写入权限

允许被授权者更新对象ACL属性。

如何设置ACL

您可以使用系统预定义的ACL设置桶和对象ACL,也可以自定义ACL。

OBS提供6种预定义ACL,如表 OBS预定义ACL所示,预定义ACL的被授权用户是所有用户,即没有针对指定账号进行ACL配置,配置成功后,所有用户均生效。

请充分评估业务需求后,谨慎将ACL设置为公开(包括public-read、public-read-write、public-read-delivered、public-read-write-delivered)。将桶设置为公开后,匿名用户无需进行身份和权限验证即可获取桶信息和桶内对象列表。如需给其他账号授权,建议使用桶策略。

表7 OBS预定义ACL

预定义ACL

描述

private

私有。

桶或对象的所有者拥有完全控制的权限,其他任何人都没有访问权限。

系统默认配置为private。

public-read

公共读。

设在桶上,所有人(包括匿名用户和所有账号的所有IAM用户)可以获取该桶内对象列表、桶内多段任务、桶的元数据。

设在对象上,所有人可以获取该对象内容和元数据。

public-read-write

公共读写。

设在桶上,所有人可以获取该桶内对象列表、桶内多段任务、桶的元数据、上传对象、删除对象、初始化段任务、上传段、合并段、拷贝段、取消多段上传任务。

设在对象上,所有人可以获取该对象内容和元数据,等同于public-read。

public-read-delivered

设在桶上,所有人可以获取该桶内对象列表、桶内多段任务、桶的元数据,相较于public-read额外可以获取该桶内对象的内容和元数据。

不能应用在对象上。

public-read-write-delivered

设在桶上,所有人可以获取该桶内对象列表、桶内多段任务、桶的元数据、上传对象、删除对象、初始化段任务、上传段、合并段、拷贝段、取消多段上传任务,相较于public-read-write额外可以获取该桶内对象的内容和元数据。

不能应用在对象上。

bucket-owner-full-control

设在对象上,桶的所有者和对象的所有者均拥有对象的完全控制权限,其他任何人都没有访问权限。

默认情况下,上传对象至其他用户的桶中,桶拥有者没有对象的控制权限。对象拥有者为桶拥有者添加bucket-owner-full-control后,桶所有者可以完全控制对象。

例如,用户A上传对象a至用户B的桶中,系统默认用户B没有对象a的控制权。当用户A为对象a设置bucket-owner-full-control后,用户B就拥有了对象a的完全控制权。

使用控制台配置预定义ACL

使用API配置预定义ACL

使用x-obs-acl头域,可以在创建桶或上传对象时通过头域设置桶或对象的ACL(使用示例见创桶请求示例,对象上传请求示例),也可以在创桶后配置桶ACL、在上传对象后配置对象ACL。

使用SDK配置预定义ACL

创建桶设置ACL

Java

Python

C

Go

BrowserJS不支持创建桶

.NET

Android

iOS

PHP

Node.js

设置桶ACL

Java

Python

C

Go

BrowserJS

.NET

Android

iOS

PHP

Node.js

上传对象设置ACL

Java

Python

C

Go

BrowserJS

.NET

Android

iOS

PHP

Node.js

设置对象ACL

Java

Python

C

Go

BrowserJS

.NET

Android

iOS

PHP

Node.js

使用OBS Browser+配置预定义ACL

使用obsutil配置预定义ACL

您可以自定义ACL,为指定账号或匿名用户授权,表7是桶/对象支持的ACL配置项:

表8 桶/对象支持的ACL配置项

配置选项

作用在桶上

作用在对象上

对应API头域

READ

允许被授权者获取桶内对象列表和桶元数据。

允许被授权者获取对象内容和元数据。

x-obs-grant-read

WRITE

允许被授权者向桶中上传对象。

对于桶中现有对象,允许授权者删除和覆盖这些对象。

不支持

x-obs-grant-write

READ_ACP

允许被授权者读取桶ACL属性。

允许被授权者读取对象ACL属性。

x-obs-grant-read-acp

WRITE_ACP

允许被授权者更新桶ACL属性。

允许被授权者更新对象ACL属性。

x-obs-grant-write-acp

FULL_CONTROL

允许被授予者拥有READ、WRITE、READ_ACP和WRITE_ACP权限。

允许被授予者对象的READ、READ_ACP和WRITE_ACP权限。

x-obs-grant-full-control

OBS支持自定义配置对象ACL继承桶ACL,使用x-obs-grant-read-delivered头域配置桶ACL,允许被授权者获取桶内对象列表和桶元数据,且对象继承桶ACL的READ。使用x-obs-grant-full-control-delivered头域配置桶ACL,允许被授予者拥有READ、WRITE、READ_ACP和WRITE_ACP权限,且对象继承桶ACL的READ、READ_ACP和WRITE_ACP。

使用控制台配置自定义ACL

控制台支持配置的自定义ACL

  • 控制台配置桶ACL:
    1. 在OBS管理控制台左侧导航栏选择“桶列表”。
    2. 在桶列表中,单击待操作的桶,进入“对象”页面。
    3. 在左侧导航栏,单击“权限控制 > 桶ACL”,进入桶ACL配置页面。
    4. 单击用户权限区域下的“增加”,在弹窗中配置ACL时:

      • 桶访问权限中的“读取权限”和“写入权限”分别对应的是“READ”和“WRITE”。
      • 对象权限中的“对象读权限”表示对象继承桶的READ权限。
      • ACL访问权限中的“读取权限”和“写入权限”分别对应的是“READ_ACP”和“WRITE_ACP”。
  • 控制台配置对象ACL:
    1. 在OBS管理控制台左侧导航栏选择“桶列表”。
    2. 在桶列表中,单击待操作的桶,进入“对象”页面。
    3. 单击待操作的对象名称,进入对象详情页。
    4. 选择“对象ACL”页签,进入对象ACL配置页面。
    5. 单击用户权限区域下的“增加”,在弹窗中配置ACL:

      • 对象访问权限中的“读取权限”对应的是“READ”。
      • ACL访问权限中的“读取权限”和“写入权限”分别对应的是“READ_ACP”和“WRITE_ACP”。

使用API配置自定义ACL

使用SDK配置自定义ACL

创建桶设置ACL

Java

Python

C

Go

BrowserJS不支持创建桶

.NET

Android

iOS

PHP

Node.js

设置桶ACL

Java

Python

C

Go

BrowserJS

.NET

Android

iOS

PHP

Node.js

上传对象设置ACL

Java

Python

C

Go

BrowserJS

.NET

Android

iOS

PHP

Node.js

设置对象ACL

Java

Python

C

Go

BrowserJS

.NET

Android

iOS

PHP

Node.js

使用OBS Browser+配置自定义ACL

设置桶ACL

使用obsutil配置自定义ACL

相关文档