Ozone作为对象存储系统,它在权限访问这块用的是ACL的管控方式,而不是采用文件系统UGO(User-Group-Others)的方式。不过Ozone对传统ACL进行自定义的一些扩展,除了基本的READ, WRITE,访问权限外,还细分出了DELETE,LIST等等权限。本文笔者来简单聊聊Ozone的native ACL的使用。
这里笔者特意强调了Native ACL的关键字,因为Ozone结合了自身系统设计,在ACL的Access类型上,不是简单的Read/Write/Execute三个类型。
在其ACL Type中,总共细分出了9大类型:
目前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 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类:
我们可以通过调用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权限管控模式在使用得当的情况下能够做到比较精细化的访问控制。