ACL

原生 ACL

师成师成· 更新于 2026-09-28· 阅读 15 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

Ozone 支持一组原生 ACL。这些 ACL 可以独立于 Ranger 等 Ozone ACL 插件使用。在 ozone-site.xml 中添加以下属性以启用原生 ACL。

属性值
ozone.acl.enabledtrue
ozone.acl.authorizer.classorg.apache.hadoop.ozone.security.acl.OzoneNativeAuthorizer

Ozone ACL 是 Posix ACL 和 S3 ACL 的超集。

ACL 的通用格式为 对象:用户:权限:作用域。

其中 对象 可以是:

  1. Volume - Ozone 卷。例如 /volume
  2. Bucket - Ozone 桶。例如 /volume/bucket
  3. Key - 对象键或对象。例如 /volume/bucket/key
  4. Prefix - 特定键的路径前缀。例如 /volume/bucket/prefix1/prefix2

其中 用户 可以是:

  1. User - Kerberos 域中的用户。与 Posix 世界一样,用户可以是具名的,也可以是未具名的。
  2. Group - Kerberos 域中的组。与 Posix 世界一样,组也可以是具名的,也可以是未具名的。
  3. World - Kerberos 域中所有已认证的用户。这对应于 Posix 域中的 others。
  4. Anonymous - 完全忽略用户字段。这是对 Posix 语义的扩展,是 S3 协议所需要的,在该协议中我们需要表达无法得知用户身份,或者并不在意用户身份。

tip

通过 AWS v4 签名协议访问 Ozone 的 S3 用户,将由 Ozone Manager 转换为相应的 Kerberos 用户。

其中 权限 可以是:

  1. Create – 该 ACL 使用户能够在卷中创建桶、在桶中创建键。请注意:在 Ozone 中,只有管理员可以创建卷。
  2. List – 该 ACL 允许列出桶和键。该 ACL 附加在卷和桶上,用于允许列出其子对象。请注意:用户和管理员可以列出该用户拥有的卷。
  3. Delete – 允许用户删除卷、桶或键。
  4. Read – 允许用户读取卷和桶的元数据,以及键的数据流和元数据。
  5. Write - 允许用户写入卷和桶的元数据,并允许用户覆盖已有的 Ozone 键。
  6. Read_ACL – 允许用户读取特定对象上的 ACL。
  7. Write_ACL – 允许用户写入特定对象上的 ACL。

其中 作用域 可以是:

  1. ACCESS – 访问 ACL 仅应用于特定对象,不可继承。它控制对对象本身的访问。

  2. DEFAULT - 默认 ACL 应用于特定对象,并会被该对象的子对象继承。默认 ACL 不能设置在键上(因为键下面不可能再有对象)。

    note

    从父对象的默认 ACL 继承而来的 ACL 将根据不同的桶布局遵循以下规则:

  • 启用 FileSystem 的传统(Legacy)模式或 FSO 模式:继承直接父级的 DEFAULT ACL。若父级没有 DEFAULT ACL,则继承存储桶的 DEFAULT ACL。
    • 禁用 FileSystem 的传统(Legacy)模式或 OBS 模式:继承存储桶的 DEFAULT ACL。

Ozone 原生 ACL API

ACL 可以通过 Ozone 提供的一组 API 进行操作。支持的 API 如下:

  1. SetAcl – 该 API 接收用户主体、Ozone 对象的名称与类型,以及一个 ACL 列表。
  2. GetAcl – 该 API 接收 Ozone 对象的名称与类型,并返回一个 ACL 列表。
  3. AddAcl – 该 API 接收 Ozone 对象的名称、类型和 ACL,并将其添加到该 Ozone 对象现有的 ACL 条目中。
  4. RemoveAcl – 该 API 接收 Ozone 对象的名称、类型以及需要删除的 ACL。

使用 Ozone CLI 操作 ACL

ACL 也可以通过 ozone sh 命令进行操作。

用法:

ozone sh <object> <action> [-a=<value>[,<value>...]] <object-uri>

-a 用于指定以逗号分隔的 ACL 列表。除 getacl 外,所有子命令都必须使用该参数。

<value> 的格式为 type:name:rights[scope]。

  • type 可以是 user(用户)、group(组)、world(所有用户)或 anonymous(匿名)。
  • name 是用户/组的名称。对于 world 和 anonymous 类型,name 应分别留空或填写为 WORLD 和 ANONYMOUS。
  • rights 可以是(read=r、write=w、delete=d、list=l、all=a、none=n、create=c、read_acl=x、write_acl=y)
  • scope 可以是 ACCESS 或 DEFAULT。如果未指定,默认为 ACCESS。

警告

当对象是前缀(prefix)时,path-to-object 必须包含从卷到该键的目录或前缀的完整路径。即,

   /volume/bucket/some/key/prefix/

注意:末尾的 "/" 是必需的。

以下是支持的 ACL 操作。

setacl

$ ozone sh bucket setacl -a user:testuser2:a /vol1/bucket1
 ACLs set successfully.
$ ozone sh bucket setacl -a user:om:a,group:om:a /vol1/bucket2
 ACLs set successfully.
$ ozone sh bucket setacl -a=anonymous::lr /vol1/bucket3
 ACLs set successfully.
$ ozone sh bucket setacl -a world::a /vol1/bucket4
 ACLs set successfully.

getacl

$ ozone sh bucket getacl /vol1/bucket2
[ {
  "type" : "USER",
  "name" : "om/om@EXAMPLE.COM",
  "aclScope" : "ACCESS",
  "aclList" : [ "ALL" ]
}, {
  "type" : "GROUP",
  "name" : "om",
  "aclScope" : "ACCESS",
  "aclList" : [ "ALL" ]
} ]

addacl

$ ozone sh bucket addacl -a user:testuser2:a  /vol1/bucket2
ACL user:testuser2:a[ACCESS] added successfully.

$ ozone sh bucket addacl -a user:testuser:rxy[DEFAULT] /vol1/bucket2
ACL user:testuser:rxy[DEFAULT] added successfully.

$ ozone sh prefix addacl -a user:testuser2:a[DEFAULT] /vol1/buck3/dir1/
ACL user:testuser2:a[DEFAULT] added successfully.

removeacl

$ ozone sh bucket removeacl -a user:testuser:r[DEFAULT] /vol1/bucket2
ACL user:testuser:r[DEFAULT] removed successfully.

Ozone ACL 与 S3 ACL 的区别

Ozone ACL 和 S3 ACL 主要的区别在于其作用范围与支持程度。

  • S3 ACL:目前 Ozone 中仅实现了 S3 存储桶 ACL(该功能处于 beta 阶段)。S3 对象 ACL 尚未实现。任何 PutObjectAcl 请求都会返回 501: Not Implemented 响应码。
  • Ozone ACL:Ozone ACL 提供了更为全面、灵活的访问控制机制。它专为与 Ozone 的原生架构无缝协作而设计,并支持上述提到的多种权限和作用范围。

Ozone 文件系统 ACL API

  • Ozone 文件系统实现(ofs 和 o3fs)中与 ACL 相关的 API,例如 getAclStatus、setAcl、modifyAclEntries、removeAclEntries、removeDefaultAcl 和 removeAcl,均不受支持。这些操作会抛出 UnsupportedOperationException。
  • 同样,HttpFS 中与 ACL 相关的 API 也不受支持。

在将 Ozone 与依赖 S3 或文件系统 ACL 操作的应用程序集成时,应考虑这些限制。

权限对照表

下表展示了 Ozone 操作与所需的原生 ACL 权限之间的映射关系。

<admin>:对于原生 ACL,所有操作均授予完全访问权限

<owner>:对于原生 ACL,存储卷 / 存储桶的所有者对下级层级拥有完全访问权限

操作存储卷权限
创建存储卷<admin>
列出存储卷<admin>, <configuration: listall>
获取存储卷信息READ, <admin>, <owner>
删除存储卷DELETE, <admin>, <owner>
设置配额WRITE, <admin>, <owner>
设置所有者WRITE_ACL, <admin>, <owner>
创建租户(及存储卷)CREATE, <admin>, <owner>
删除租户WRITE_ACL, <admin>, <owner>
读取 ACLREAD_ACL, <admin>, <owner>
写入 ACLWRITE_ACL, <admin>, <owner>
Operation(操作)Volume permission(卷权限)Bucket permission(存储桶权限)
Create bucket(创建存储桶)WRITE, <admin>, <owner>
List bucket(列出存储桶)LIST, <admin>, <owner>
Get bucket info(获取存储桶信息)READ, <admin>, <owner>READ, <admin>, <owner>
Delete bucket(删除存储桶)READ, <admin>, <owner>DELETE, <admin>, <owner>
Update bucket property (quota, replication, ...)(更新存储桶属性(配额、副本等))READ<admin>, <owner>
List Snapshot(列出快照)READ, <admin>, <owner>LIST, <admin>, <owner>
List Trash(列出回收站)READ, <admin>, <owner>LIST, <admin>, <owner>
Trash Recover(回收站恢复)READ, <admin>, <owner>WRITE, <admin>, <owner>
Set Owner(设置所有者)READ, <admin>, <owner>WRITE_ACL, <admin>, <owner>
Read ACL(读取 ACL)READ, <admin>, <owner>READ_ACL, <admin>, <owner>
Write ACL(写入 ACL)READ, <admin>, <owner>WRITE_ACL, <admin>, <owner>
Operation(操作)Volume permission(卷权限)Bucket permission(存储桶权限)Key permission(键权限)
List key(列出键)READ, <admin>, <owner>LIST, READ, <admin>, <owner>
Write key(写入键)READ, <admin>, <owner>WRITE, <admin>, <owner>CREATE, WRITE, <admin>
Delete key(删除键)READ, <admin>, <owner>READ, <admin>, <owner>DELETE (*recursive check all child), <admin>(递归检查所有子项)
Read key(读取键)READ, <admin>, <owner>READ, <admin>, <owner>READ, <admin>, <owner>
Read ACL(读取 ACL)READ, <admin>, <owner>READ, <admin>, <owner>READ_ACL, <admin>, <owner>
Write ACL(写入 ACL)READ, <admin>, <owner>READ, <admin>, <owner>WRITE_ACL, <admin>, <owner>

评论

登录后参与评论

正在加载评论…