原生 ACL
Ozone 支持一组原生 ACL。这些 ACL 可以独立于 Ranger 等 Ozone ACL 插件使用。在 ozone-site.xml 中添加以下属性以启用原生 ACL。
| 属性 | 值 |
|---|---|
ozone.acl.enabled | true |
ozone.acl.authorizer.class | org.apache.hadoop.ozone.security.acl.OzoneNativeAuthorizer |
Ozone ACL 是 Posix ACL 和 S3 ACL 的超集。
ACL 的通用格式为 对象:用户:权限:作用域。
其中 对象 可以是:
- Volume - Ozone 卷。例如 /volume
- Bucket - Ozone 桶。例如 /volume/bucket
- Key - 对象键或对象。例如 /volume/bucket/key
- Prefix - 特定键的路径前缀。例如 /volume/bucket/prefix1/prefix2
其中 用户 可以是:
- User - Kerberos 域中的用户。与 Posix 世界一样,用户可以是具名的,也可以是未具名的。
- Group - Kerberos 域中的组。与 Posix 世界一样,组也可以是具名的,也可以是未具名的。
- World - Kerberos 域中所有已认证的用户。这对应于 Posix 域中的 others。
- Anonymous - 完全忽略用户字段。这是对 Posix 语义的扩展,是 S3 协议所需要的,在该协议中我们需要表达无法得知用户身份,或者并不在意用户身份。
tip
通过 AWS v4 签名协议访问 Ozone 的 S3 用户,将由 Ozone Manager 转换为相应的 Kerberos 用户。
其中 权限 可以是:
- Create – 该 ACL 使用户能够在卷中创建桶、在桶中创建键。请注意:在 Ozone 中,只有管理员可以创建卷。
- List – 该 ACL 允许列出桶和键。该 ACL 附加在卷和桶上,用于允许列出其子对象。请注意:用户和管理员可以列出该用户拥有的卷。
- Delete – 允许用户删除卷、桶或键。
- Read – 允许用户读取卷和桶的元数据,以及键的数据流和元数据。
- Write - 允许用户写入卷和桶的元数据,并允许用户覆盖已有的 Ozone 键。
- Read_ACL – 允许用户读取特定对象上的 ACL。
- Write_ACL – 允许用户写入特定对象上的 ACL。
其中 作用域 可以是:
ACCESS – 访问 ACL 仅应用于特定对象,不可继承。它控制对对象本身的访问。
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 如下:
- SetAcl – 该 API 接收用户主体、Ozone 对象的名称与类型,以及一个 ACL 列表。
- GetAcl – 该 API 接收 Ozone 对象的名称与类型,并返回一个 ACL 列表。
- AddAcl – 该 API 接收 Ozone 对象的名称、类型和 ACL,并将其添加到该 Ozone 对象现有的 ACL 条目中。
- 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> |
读取 ACL | READ_ACL, <admin>, <owner> |
写入 ACL | WRITE_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> |
评论
登录后参与评论
KnowForge