更新时间:2025-05-27 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配置,配置成功后,所有用户均生效。

表7 OBS预定义ACL

预定义ACL

描述

private

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

系统默认配置为private。

public-read

设在桶上,所有人可以获取该桶内对象列表、桶内多段任务、桶的元数据。

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

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

使用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

相关文档