Ozone 访问控制列表
Ozone 既支持类似 Ranger 这样的 ACL 插件,也支持原生的 ACL。如果需要启用原生的 ACL,在 ozone-site.xml 中添加下面的参数:
Property | Value |
---|---|
ozone.acl.enabled | true |
ozone.acl.authorizer.class | org.apache.ranger.authorization.ozone.authorizer.OzoneNativeAuthorizer |
Ozone 的 ACL 是 Posix ACL 和 S3 ACL 的超集。
ACL 的通用格式为 对象:角色:权限:范围.
对象 可选的值包括:
- 卷 - 一个 Ozone 卷,比如 /volume
- 桶 - 一个 Ozone 桶,比如 /volume/bucket
- 键 - 一个对象键,比如 /volume/bucket/key
- 前缀 - 某个键的路径前缀,比如 /volume/bucket/prefix1/prefix2
角色 可选的值包括:
- 用户 - 一个 Kerberos 用户,和 Posix 用户一样,用户可以是已创建的也可以是未创建的。
- 组 - 一个 Kerberos 组,和 Posix 组一样,组可以是已创建的也可以是未创建的。
- 所有人 - 所有通过 Kerberos 认证的用户,这对应 Posix 标准中的其它用户。
- 匿名 - 完全忽略用户字段,这是对 Posix 语义的扩展,使用 S3 协议时会用到,用于表达无法获取用户的身份或者不在乎用户的身份。
S3 用户通过 AWS v4 签名协议访问 Ozone 时,OM 会将其转化为对应的 Kerberos 用户。
权限 可选的值包括::
- 创建 – 此 ACL 为用户赋予在卷中创建桶,或者在桶中创建键的权限。请注意:在 Ozone 中,只有管理员可以创建卷。
- 列举 – 此 ACL 允许用户列举桶和键,因为列举的是子对象,所以这种 ACL 要绑定在卷和桶上。请注意:只有卷的属主和管理员可以对卷执行列举操作。
- 删除 – 允许用户删除卷、桶或键。
- 读取 – 允许用户读取卷和桶的元数据,以及读取键的数据流和元数据。
- 写入 - 允许用户修改卷和桶的元数据,以及重写一个已存在的键。
- 读 ACL – 允许用户读取某个对象的 ACL。
- 写 ACL – 允许用户修改某个对象的 ACL。
范围 可选的值包括::
- ACCESS – 这类 ACL 仅作用于对象本身,不能被继承。它控制对对象本身的访问。
- DEFAULT - 这类 ACL 不仅作用于对象本身,还会被对象的后代继承。不能在叶子对象上设置该类 ACL(因为叶子对象下不能再有其他对象)。
注意:从父级默认 ACL 继承的 ACL, 将根据不同的桶布局遵循以下规则:- 启用文件系统的 Legacy 或 FSO:继承直接父目录的默认ACL。如果直接父目录没有默认ACL,则继承存储桶的默认ACL。
- 禁用文件系统的 Legacy 或 OBS:继承桶的默认ACL。
Ozone 原生 ACL API
ACL 可以通过 Ozone 提供的一系列 API 进行操作,支持的 API 包括:
- SetAcl – 此 API 的参数为用户主体、Ozone 对象名称、Ozone 对象的类型和 ACL 列表。
- GetAcl – 此 API 的参数为 Ozone 对象名称和 Ozone 对象类型,返回值为 ACL 列表。
- AddAcl - 此 API 的参数为 Ozone 对象名称、Ozone 对象类型和待添加的 ACL,新的 ACL 会被添加到该 Ozone 对象的 ACL 条目中。
- RemoveAcl - 此 API 的参数为 Ozone 对象名称、Ozone 对象类型和待删除的 ACL。
使用 Ozone CLI 操作 ACL
还可以使用 ozone sh
命令来操作 ACL。
用法 : ozone sh <object> <action> [-a=<value>[,<value>...]] <object-uri>
-a
表示以逗号分隔的 ACL 列表。除了 getacl
之外的所有子命令都需要它。
<value>
的格式为 type:name:rights[scope]
。
type 可以是 user, group, world 或 anonymous。
name 是用户/组的名称。如果 type 为 world 和 anonymous,则 name 应留空或分别为 WORLD 或 ANONYMOUS。
rights 可以是 (读取=r, 写入=w, 删除=d, 列举=l, 全部=a, 毫无=n, 创建=c, 读 ACL=x, 写 ACL=y)。
scope 可以是 ACCESS 或 DEFAULT. 如果不指定,默认 ACCESS。
当对象是前缀时,对象路径必须包含从卷到密钥的目录或前缀的完整路径,例如,
/volume/bucket/some/key/prefix/
注意:结尾的“/”是需要的。
/volume/bucket/some/key/prefix/
注意:结尾的“/”是需要的。
以下是 CLI 支持的 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.