1 简介
Ozone目前支持本地的访问控制(Native ACLs)以及基于Ranger的访问控制。本文我们主要介绍Native ACL的特性及应用。
2 功能及特性介绍
2.1 Native ACL权限分类
作为一个对象存储系统,Ozone Native ACL的实现跟Hadoop ACL有较大区别。Ozone整体分为Volume、Bucket、Key这三个层级。其中Volume类似于用户的Home目录,其下可以包含多个Bucket。Bucket类似于S3的Bucket,其下存储Key和Value。三者关系如下:
Volume - e.g. /volumeBucket - e.g. /volume/bucket1, /volume/bucket2Key - e.g. /volume/bucket1/key1, /volume/bucket1/key2
在这三个层级上都有单独的Native ACL,目前Ozone支持的ACL操作有如下几类:
1、Create – 允许用户创建volume下bucket、bucket下key。注意开启acl之后只有超级用户拥有创建volume的权限(通过ozone.administrators指定)。
2、List – 允许用户获取volume下的bucket,以及bucket下的keys列表。有volume权限的普通用户及超级用户,能够查看volume列表。
3、Delete – 允许用户删除volume、bucket、key
4、Read – 允许用户读取volume、bucket、key的metadata, 以及key的真实数据。
5、Write - 允许用户修改volume、bucket的metadata,以及overwrite已存在的key。
6、Read_ACL – 允许用户获取volume、bucket、key的ACL信息.
7、Write_ACL – 允许用户修改volume、bucket、key的ACL信息.
8、ALL – 允许用户拥有以上所有权限.
另外Ozone提供了如下api来进行ACL的设置:
1、addacl – 在已有acl中添加新的ACL。
2、removeacl – 在已有acl中移除部分ACL。
3、setacl – 重置已有ACL。
4、getacl – 获取ACL info。
2.1 Native ACL的原理及特性
Ozone目前是将用户的acl信息保存在volume、bucket、key的info当中。如果一个用户A拥有bucket的写权限,那么他就能够在该bucket下写入key,新写入的key默认的只有用户A有权限(ALL)操作(超级用户也无权操作)。用户B若想访问该key需要由用户A给其授权。实现原理如下:

需要注意的是若用户A通过s3g去创建volume、bucket及key,Ozone会默认将s3g超级用户(OzoneS3Manager)添加到acl中,用户A及OzoneS3Manager权限均为ALL如下:
[ {"type" : "USER","name" : "userA","aclScope" : "ACCESS","aclList" : [ "ALL" ]}, {"type" : "USER","name" : "OzoneS3Manager","aclScope" : "ACCESS","aclList" : [ "ALL" ]} ]
另外ozone已支持权限继承,这是个非常不错的功能。用户可以在volume及bucket上设置default rule,后续新写入的key都会继承该权限。比如:可以在volume及bucket设置user:test:a[DEFAULT],那么通过任何用户新写入的key,都会给test用户加上ALL的权限,即用户test可以操作该bucket下的所有key。具体用法我们在3.2的使用中介绍。
3 Native ACL的应用
3.1 启用Native ACL
在ozone-site.xml中加入以下配置,并重启om。即可启用Ozone Native ACL:
<property><name>ozone.acl.enabled</name><value>true</value></property><property><name>ozone.acl.authorizer.class</name><value>org.apache.hadoop.ozone.security.acl.OzoneNativeAuthorizer</value></property><property><name>ozone.administrators</name><value>root</value></property>
3.2 Native ACL的使用
1、启用ACL后可以使用超级用户预先创建volume,以上配置的超级用户是root,创建完volume之后其默认的权限是:
[root@ozone1 ~]$ozone sh volume getacl volume1[{"type" : "USER","name" : "root","aclScope" : "ACCESS","aclList" : [ "ALL" ]}]
2、其他用户userA、userB若想操作该volume1,在其中创建bucket并写入key,则需要由root给其添加权限如下:
[root@ozone1 ~]$ozone sh volume addacl volume1 -a user:userA:a[root@ozone1 ~]$ozone sh volume addacl volume1 -a user:userB:a[root@ozone1 ~]$ozone sh volume getacl volume1[{"type" : "USER","name" : "root","aclScope" : "ACCESS","aclList" : [ "ALL" ]}, {"type" : "USER","name" : "userA","aclScope" : "ACCESS","aclList" : [ "ALL" ]}, {"type" : "USER","name" : "userA","aclScope" : "ACCESS","aclList" : [ "ALL" ]}]
3、此时可使用userA操作该volume1,可以创建bucket1,然后向其中写入key。写入key之前我们可以先设置userB的权限继承。让userB拥有所有新写入key的操作权限。具体操作及结果如下:
[userA@ozone1 ~]$ozone sh bucket create volume1/bucket1[userA@ozone1 ~]$ozone sh bucket addacl volume1/bucket1 -a user:userB:a[DEFAULT][userA@ozone1 ~]$ozone sh bucket getacl volume1/bucket1[ {"type" : "USER","name" : "userA","aclScope" : "ACCESS","aclList" : [ "ALL" ]}, {"type" : "USER","name" : "userB","aclScope" : "DEFAULT", //此时userB的aclScope为DEFAULT"aclList" : [ "ALL" ]}][userA@ozone1 ~]$ozone sh key put volume1/bucket1/hosts /etc/hosts[userA@ozone1 ~]$ozone sh key getacl volume1/bucket1/hosts[ { // 可以看到未给userB单独授该key的权限,userB通过权限继承也能获取到响应权限。"type" : "USER","name" : "userA","aclScope" : "ACCESS","aclList" : [ "ALL" ]}, {"type" : "USER","name" : "userB","aclScope" : "ACCESS", //此时userB的aclScope为ACCESS"aclList" : [ "ALL" ]}]
以上仅仅演示了Native ACL大致使用流程,像其他ACL api的使用可以参考shell的help提示。另外Native ACL更多的是跟认证结合使用,目前Ozone本身支持kerberos认证,后面的文章中我们将会对此进一步介绍。
参考
[2]https://hadoop.apache.org/ozone/docs/0.5.0-beta/security/securityacls.html
[3]https://issues.apache.org/jira/browse/HDDS-1544
欢迎关注“数据湖技术”公众号,更多精彩待续!

腾讯大数据诚招计算、存储、消息中间件、调度、中台等各方向的大数据研发工程师,请私信或联系jerryshao@tencent.com。




