所有者
1. 概述
Ozone 中的每个卷都具有 owner(属主) 属性,用于标识拥有该卷的用户。卷属主是 Ozone 访问控制与资源管理系统中的基础概念,它在确定权限、存储计量以及多租户隔离方面发挥着关键作用。
虽然卷的元数据结构中也包含 admin 字段,但在使用原生 ACL(OzoneNativeAuthorizer)时,该字段仅被存储,Ozone Manager 并不会在授权或访问控制中实际使用它。授权检查依赖于 ACL 和卷属主。使用 RangerOzoneAuthorizer 时,admin 字段的行为可能会有所不同。
2. 设置卷属主
创建卷时
创建卷时,可以通过 --user 命令行选项显式指定属主:
ozone sh volume create /myvolume --user alice
ozone sh volume info /myvolume
{
"metadata" : { },
"name" : "myvolume",
"admin" : "om",
"owner" : "alice",
...
}如果在创建卷时未提供 --user 选项,Ozone 会通过 UserGroupInformation.getCurrentUser() 确定经过身份验证的用户身份,并自动将其设置为所有者。具体行为取决于集群的安全配置:
- 安全/Kerberos 模式:所有者被设置为经过身份验证用户的 Kerberos 主体(或其短名称)。例如,如果以 Kerberos 主体
om@REALM通过身份验证,则卷的所有者为om。 - 非安全模式:所有者通常被设置为运行 CLI 命令的 Linux 用户。例如,如果你以 Linux 用户
root身份运行该命令,则卷的所有者为root。
# Owner defaults to authenticated user
ozone sh volume create /myvolume
# secure mode kerberos authenticated user
ozone sh volume info /myvolume
{
"metadata" : { },
"name" : "myvolume",
"admin" : "om",
"owner" : "om",
...
}
# unsecure mode linux user root
ozone sh volume info /myvolume
{
"metadata" : { },
"name" : "myvolume",
"admin" : "root",
"owner" : "root",
...
}默认行为:
- 如果未提供
--user,则所有者默认为创建卷的已认证用户。 ozone sh volume create命令不允许设置管理员用户。管理员只能通过 Ozone o3 原生 Java API 进行设置。
示例输出:
查看卷信息时,可以看到默认的 ACL:
# Volume created with explicit owner
$ ozone sh volume create /myvolume --user alice
$ ozone sh volume info /myvolume
{
"name" : "myvolume",
"admin" : "om",
"owner" : "alice",
"acls" : [ {
"type" : "USER",
"name" : "alice",
"aclScope" : "ACCESS",
"aclList" : [ "ALL" ]
} ]
}
# Volume created without specifying owner (defaults to authenticated user)
$ ozone sh volume create /myvol1
$ ozone sh volume info /myvol1
{
"name" : "myvol1",
"admin" : "om",
"owner" : "om",
"acls" : [ {
"type" : "USER",
"name" : "om",
"aclScope" : "ACCESS",
"aclList" : [ "ALL" ]
}, {
"type" : "GROUP",
"name" : "om",
"aclScope" : "ACCESS",
"aclList" : [ "READ", "LIST" ]
} ]
}注意: 虽然卷所有者拥有这些默认 ACL,但通常并不需要它们,因为所有者权限会完全绕过 ACL 检查。不过,这些 ACL 对以下场景仍然有用:
- 审计与合规性追踪
- 记录预期的权限
- ACL 可能在所有者检查之前被评估的情况
更改卷所有权
卷创建后,可以使用 volume update 命令更改卷所有者:
ozone sh volume update /myvolume --user bob
{
"metadata" : { },
"name" : "myvolume",
"admin" : "om",
"owner" : "bob",
"quotaInBytes" : -1,
"quotaInNamespace" : -1,
"usedNamespace" : 0,
"creationTime" : "2026-01-25T15:12:12.922Z",
"modificationTime" : "2026-01-25T15:20:35.530Z",
"acls" : [ {
"type" : "USER",
"name" : "alice",
"aclScope" : "ACCESS",
"aclList" : [ "ALL" ],
"aclSet" : [ "ALL" ]
} ],
"refCount" : 0
}更改所有权的要求:
- 权限: 尝试更改所有权的用户必须拥有该卷的
WRITE_ACL权限。这确保只有授权用户才能转移所有权。
所有者与 ACL:
通过 ozone sh volume update --user <new_user> 更改卷的所有者会更新所有权元数据,但不会自动修改 ACL。原所有者的 ACL 条目将保持不变。如果需要完全撤销原所有者的访问权限,必须使用 ACL 更新命令单独管理 ACL。
卷级操作与权限
关于权限的卷级操作在 Native ACL 和 Ranger ACL 实现之间可能有所不同。此处描述的权限要求仅适用于 Native ACL。
有关 Native ACL 和 Ranger ACL 的权限与操作方式的详细信息,请参阅 ACL 文档。
3. 卷所有者特权
卷所有者拥有特殊特权,可以全面访问该卷及其内部的所有资源。这些特权由 Ozone 的原生授权器(OzoneNativeAuthorizer)强制执行,并绕过标准 ACL 检查。
绕过 ACL 检查
卷所有者可以对其卷内的存储桶、键和前缀执行操作,无需显式 ACL 权限。这意味着所有者对其卷中的所有资源具有隐式访问权限,无论这些资源上的 ACL 设置如何。所有者检查在任何 ACL 评估之前进行,为所有者操作提供了快速路径。
所有者删除卷
卷所有者可以删除自己的卷,因为卷在创建时带有默认 ACL,该 ACL 向所有者授予 ALL 权限,其中包含 DELETE 权限。
删除卷的要求:
- DELETE 权限: 请求者必须拥有该卷的
DELETEACL 权限。 - 空卷: 卷中不能包含任何存储桶。必须先删除所有存储桶,才能删除该卷。
- 引用计数为零: 卷的
refCount必须为 0。如果refCount > 0,则表示某些 Ozone 功能(如多租户)对该卷持有"锁"。必须先释放该锁(例如,通过ozone tenant delete <tenantId>)。
注意
创建卷仍然是一项管理操作,需要管理员权限。只有管理员才能创建卷。
评论
登录后参与评论
KnowForge