Ozone Native ACL的应用

前言


Ozone作为对象存储系统,它在权限访问这块用的是ACL的管控方式,而不是采用文件系统UGO(User-Group-Others)的方式。不过Ozone对传统ACL进行自定义的一些扩展,除了基本的READ, WRITE,访问权限外,还细分出了DELETE,LIST等等权限。本文笔者来简单聊聊Ozone的native ACL的使用。

Ozone Native ACL的Access Type


这里笔者特意强调了Native ACL的关键字,因为Ozone结合了自身系统设计,在ACL的Access类型上,不是简单的Read/Write/Execute三个类型。

在其ACL Type中,总共细分出了9大类型:

  • READ,获取Volume, Bucket, Key信息权限
  • WRITE,拥有Volume/Bucket/Key的部分修改操作权限,这里的WRITE权限不代表允许所有的修改行为操作
  • CREATE,创建Volume/Bucket/Key的操作权限
  • LIST,获取Volume/Bucket/Key列表的操作权限
  • DELETE,拥有删除Volume/Bucket/Key的操作权限
  • READ_ACL,读取Volume/Bucket/Key ACL信息权限
  • WRITE_ACL,修改Volume/Bucket/Key ACL信息权限
  • ALL,拥有对Volume/Bucket/Key的所有操作权限
  • NONE,无任何Volume/Bucket/Key的操作权限

Ozone Native ACL的启用


目前Ozone发布的最新版本还是在alpha版本阶段,笔者测试的版本是ozone-0.4.1-alpha,在此版本中它的ACL功能是默认disable的。在ACL disable模式下,任何用户只要配上正确的om通信地址,就可以对volume/bucket/key执行操作的。

所以将Ozone投入生产使用前,如果需要Security方面的考虑,我们要将Ozone的ACL功能开启,更新如下配置:

<property>
   <name>ozone.acl.enabled</name>
   <value>true</value>
</property>

在Ozone ACL开启之后,我们还要进行额外的authorizer的配置,来选择用哪个authorizer类做ACL的访问控制,ozone-0.4.1-alpha版本中使用的是默认OzoneAccessAuthorizer类。此类对于任何的access检查都是返回true的,基本就是没有检查行为了。

/**
 * Default implementation for {@link IAccessAuthorizer}.
 * */
public class OzoneAccessAuthorizer implements IAccessAuthorizer {

  @Override
  public boolean checkAccess(IOzoneObj ozoneObject, RequestContext context)
      throws OMException {
    return true;
  }
}

我们要把authorizer实例切换为Ozone Native的ACL类,

<property>
   <name>ozone.acl.authorizer.class</name>
   <value>org.apache.hadoop.ozone.security.acl.OzoneNativeAuthorizer</value>
</property>

ozone.acl.enabled,ozone.acl.authorizer.class配置完毕并重启OM服务后,OM的Native ACL就能发挥作用了。

Ozone Native ACL的shell命令使用


下面我们来看几个例子,进一步了解ozone acl的命令使用。

首先ozone对volume, bucket, key都支持了acl的相关操作命令,如下所示:

[hdfs@lyq yiqlin]$ /home/hdfs/apache/ozone/bin/ozone sh volume -h
Usage: ozone sh volume [-hV] [COMMAND]
Volume specific operations
-h, --help Show this help message and exit.
-V, --version Print version information and exit.
Commands:
info returns information about a specific volume
list, ls List the volumes of a given user
create Creates a volume for the specified user
update Updates parameter of the volumes
delete deletes a volume if it is empty
addacl Add a new Acl.
removeacl Remove an acl.
setacl Set acls.
getacl List all acls.
[hdfs@lyq yiqlin]$ /home/hdfs/apache/ozone/bin/ozone sh bucket -h
Usage: ozone sh bucket [-hV] [COMMAND]
Bucket specific operations
-h, --help Show this help message and exit.
-V, --version Print version information and exit.
Commands:
info returns information about a bucket
list, ls lists the buckets in a volume.
create creates a bucket in a given volume
delete deletes an empty bucket
addacl Add a new Acl.
removeacl Remove an acl.
getacl List all acls.
setacl Set acls.
[hdfs@lyq yiqlin]$ /home/hdfs/apache/ozone/bin/ozone sh key -h
Usage: ozone sh key [-hV] [COMMAND]
Key specific operations
-h, --help Show this help message and exit.
-V, --version Print version information and exit.
Commands:
info returns information about an existing key
list, ls list all keys in a given bucket
get Gets a specific key from ozone server
put creates or overwrites an existing key
rename renames an existing key
delete deletes an existing key
addacl Add a new Acl.
removeacl Remove an acl.
setacl Set acls.
getacl List all acls.

从上面子命令参数可以看出,这里的acl操作主要支持以下4类:

  • addacl,在现有acl中,再新添加acl信息
  • removeacl,从现有acl中,移出部分acl信息
  • setacl,重置acl信息
  • getacl,获取acl信息

我们可以通过调用acl子命令的方式进一步查看acl信息组织形式,

Usage: ozone sh key addacl [-hV] -a= [-s=]
Add a new Acl.

-a, --acl= Add acl.r = READ,w = WRITE,c = CREATE,d = DELETE,l =
LIST,a = ALL,n = NONE,x = READ_AC,y = WRITE_ACEx user:
user1:rw or group:hadoop:rw

这里的acl格式为user:[user name]:[access type…],例如user:user1:rw。

下面我们创建一个bucket为例,然后在其上进行acl的测试。
首先创建一个新的测试bucket,

[hdfs@lyq ~]$ /home/hdfs/ozone/bin/ozone sh bucket create /testvolume2/fakebucket
2019-12-10 05:01:06,455 [main] INFO - Creating Bucket: testvolume2/fakebucket, with Versioning false and Storage Type set to DISK and Encryption set to false

然后获取这个测试bucket的信息,下面的acl属性,笔者认为是个bug。

[hdfs@lyq ~]$ /home/hdfs/ozone/bin/ozone sh bucket info /testvolume2/fakebucket
{
“volumeName” : “testvolume2”,
“bucketName” : “fakebucket”,
“createdOn” : “Tue, 10 Dec 2019 12:01:06 GMT”,
“acls” : null,
“versioning” : “DISABLED”,
“storageType” : “DISK”,
“encryptionKeyName” : “N/A”
}

然后用getacl命令获取bucket acl信息:

[hdfs@lyq ~]$ /home/hdfs/ozone/bin/ozone sh bucket getacl /testvolume2/fakebucket
[ {
“type” : “USER”,
“name” : “hdfs”,
“aclScope” : “ACCESS”,
“aclList” : [ “ALL” ]
}, {
“type” : “GROUP”,
“name” : “hdfs”,
“aclScope” : “ACCESS”,
“aclList” : [ “ALL” ]
} ]

我们可以看到hdfs作为这个bucket的创建者,拥有这个bucket的所有访问权限,并且没有其它任何用户的Access权限信息。
然后此时,我们将用户切换成另外一个用户,然后执行info命令获取bucket信息,

[yiqlin@lyq hdfs]$ /home/hdfs/ozone/bin/ozone sh bucket info /testvolume2/fakebucket
PERMISSION_DENIED User yiqlin doesn’t have READ permission to access bucket

[yiqlin@lyq hdfs]$ /home/hdfs/ozone/bin/ozone sh bucket getacl /testvolume2/fakebucket
PERMISSION_DENIED User yiqlin doesn’t have READ_ACL permission to access bucket

然后我们再切换回hdfs身份,给用户添加一定的acl权限,

[hdfs@lyq ~]$ /home/hdfs/ozone/bin/ozone sh bucket addacl -a user:yiqlin:r /testvolume2/fakebucket
“Acl set successfully: true”

然后我们可以通过getacl得到最新的acl列表:

[hdfs@lyq ~]$ /home/hdfs/ozone/bin/ozone sh bucket getacl /testvolume2/fakebucket
[ {
“type” : “USER”,
“name” : “hdfs”,
“aclScope” : “ACCESS”,
“aclList” : [ “ALL” ]
}, {
“type” : “GROUP”,
“name” : “hdfs”,
“aclScope” : “ACCESS”,
“aclList” : [ “ALL” ]
}, {
“type” : “USER”,
“name” : “yiqlin”,
“aclScope” : “ACCESS”,
“aclList” : [ “READ” ]
} ]

从上面输出可以看到,用户yiqlin已经拥有了read此bucket的权限了,
然后我们切到yiqlin用户,执行info操作,操作执行成功:

[yiqlin@lyq hdfs]$ /home/hdfs/ozone/bin/ozone sh bucket info /testvolume2/fakebucket
{
“volumeName” : “testvolume2”,
“bucketName” : “fakebucket”,
“createdOn” : “Tue, 10 Dec 2019 12:01:06 GMT”,
“acls” : null,
“versioning” : “DISABLED”,
“storageType” : “DISK”,
“encryptionKeyName” : “N/A”
}

如果需要设置acl的信息比较多,我们可以直接执行重置acl指令,如下:

[hdfs@lyq ~]$ /home/hdfs/ozone/bin/ozone sh bucket setacl -al user:yiqlin:rx,user:hdfs:a /testvolume2/fakebucket
“Acl set successfully: true”
[hdfs@lyq ~]$ /home/hdfs/ozone/bin/ozone sh bucket getacl /testvolume2/fakebucket
[ {
“type” : “USER”,
“name” : “yiqlin”,
“aclScope” : “ACCESS”,
“aclList” : [ “READ”, “READ_ACL” ]
}, {
“type” : “USER”,
“name” : “hdfs”,
“aclScope” : “ACCESS”,
“aclList” : [ “ALL” ]
} ]

综上所使用的结果来看,Ozone这套acl权限管控模式在使用得当的情况下能够做到比较精细化的访问控制。

posted @ 2020-01-12 19:08  回眸,境界  阅读(190)  评论(0编辑  收藏  举报