一篇文章搞懂HDFS权限管理

 

HDFS承载了公司内多个部门几十条业务线的几十PB数据,这些数据有些是安全级别非常高的用户隐私数据,也有被广泛被多个业务线使用的基础数据,不同的业务之间有着复杂的数据依赖。因此,如何管理好这些数据的授权,并尽可能自动化低成本的做好权限管理,是很重要的一部分工作。本文系统的描述了HDFS权限管理体系中与用户关联最紧密的授权相关内容,希望通过本文让大家对权限管理有一个清晰的了解。

HDFS的权限管理是被用户最常问到的问题之一,HDFS实现了一个和POSIX系统类似的文件和目录的权限模型,同时还支持POSIX ACLs规范,由于POSIX ACLs本身就比较复杂,还改变了一些传统POSIX权限体系的语义,因此大部分用户在使用过程中都会遇到以下一些困惑,例如:umask是干什么用的?ACLs里的mask作用是什么?为什么我明明给用户A添加了rwx权限的ACLs,A却仍然写失败?什么权限会继承?什么权限不会继承?为什么创建的这个目录继承的权限跟预期的不一致?

权限控制一般分为两部分,鉴权(Authentication)和授权(Authorization)。鉴权用于鉴定用户身份(例如鉴定你是否是用户foo),授权用于授予给定用户指定的权限(例如将文件f授予用户bar读写权限)。本文只讨论HDFS的授权体系的工作机制,对于常用的权限管理命令先不做介绍,欢迎关注后续文章了解。

HDFS权限管理概述

HDFS实现了一个和POSIX系统类似的文件和目录的权限模型。每个文件和目录有一个所有者(owner)和一个组(group)。文件或目录对其所有者、同组的其他用户以及所有其他用户(other)分别有着不同的权限。对文件而言,当读取这个文件时需要有r权限,当写入或者追加到文件时需要有w权限。对目录而言,当列出目录内容时需要具有r权限,当新建或删除子文件或子目录时需要有w权限,当访问目录的子节点时需要有x权限。总的来说,文件或目录的权限就是它的模式(mode)。HDFS采用了Unix表示和显示模式的习惯,包括使用八进制数来表示权限。当新建一个文件或目录,它的所有者即客户进程的用户,它的所属组是父目录的组(BSD的规定)。

HDFS还提供了对POSIX ACLs(Access Control Lists)的支持,通过NameNode的配置项来控制对ACLs的支持是打开还是关闭。ACLs使得用户可以在权限模型之外提供更加灵活的授权。由于传统的POSIX权限模型对于大部分类Unix系统用户来说都比较熟悉了,因此ACLs将是本文档的重点。

下文会解决HDFS实现的传统POSIX权限模型中最常见的疑问,然后系统的介绍ACLs,最后给出详细的例子和场景来说明ACLs是如何工作的。

传统的POSIX权限模型

HDFS实现的是类似于POSIX系统的权限模型,如前所述,使用过Linux/Unix系统的用户对该模型应该都非常熟悉,就不再赘述。这里先对下文中最常被问到的问题做一些说明:

1、访问某个路径时,用户必须具备该路径上每个目录的执行(x)权限,路径中最后一个目录/文件除外。例如 ls /user/foo/data操作要求用户必须具有根目录(/),user目录,foo目录的执行权限。

2、创建一个文件或者目录时,owner是客户进程的用户,group则继承父目录

3、新建文件或目录的模式(mode)由client在rpc调用时传递给NameNode,它受配置参数umask的约束。新文件的模式是666 & ^umask,新目录的模式是777 & ^umask,即文件默认是没有执行(x)权限的。如果在 create(path, permission, …) 方法中指定了权限参数P,新文件的模式是P & ^umask & 666,如果在mkdirs(path, permission ) 方法中指定了权限参数P,新目录的模式是P & ^umask & 777。

例1:如果umask是022(默认值),那么新文件的模式就是644,新目录的模式就是755,即umask擦除掉了group和other的写权限。

例2:如果umask是027,那么新文件的模式就是650,新目录的模式就是750,即umask擦除掉了group的写权限,以及other的读写执行权限。

4、umask通过client端hdfs-site.xml中的fs.permissions.umask-mode配置项来指定,默认是022。

5、只有超级用户才可以调用chown来修改目录和文件的owner。

权限管理

权限三组:拥有者 (file owner),群组 (group),及 其它 (other)

属性三种:读取 (read),写入 (write),及 执行(executable)

 

hdfs用户管理 hdfs权限管理_POSIX ACLS

 

我们将rwx看成二进制数,如果有则有1表示,没有则有0表示,那么rwx r-x r- -则可以表示成为: 111 101 100 再将其每三位转换成为一个十进制数,就是754。

存取控制清单 (Access Control List,简称 ACL)

ACL 实为现有权限机制的延伸,在三个基本设定 (拥有者,群组及其它)外,允许我们加入对某指定使用者或群组的存取权限设定。

大家常用的文件系统,如:ext3、xfs、jfs和 ReiserFS,都能使用ACL。

要查看一个文件或目录的 ACL,需要使用 “getfacl” 指令:getfaclreport.doc

如果需要更改一个档案或目录的 ACL,可以使用setfacl 指令,其用法如下:

setfacloption rules files

Glusterfs之POSIX ACL文件权限管理

在服务端启用POSIXAccess Control Lists (ACLs)

如果需要使用POSIX Access Control Lists (ACLs) ,那么在服务器端挂接逻辑卷时就需要指定acl选项,如下所示:

#mount -o acl /dev/sda1 /export1
在/etc/fstab文件中可以这样配置:
LABEL=/work/export1 ext3 rw, acl 14
在客户端启用POSIXAccess Control Lists (ACLs)
#mount -t glusterfs -o acl 198.192.198.234:glustervolume /mnt/gluster

设置POSIX ACLs

一般地,你可以设置两种类型的POSIX ACLs,access ACLs和default ACLs。前者用于对一个指定的目录或文件设置访问策略,而后者则为目录及目录中的文件提供一种默认的访问控制策略。你可以基于每个用户、用户组以至于不在文件属组内的其它用户,来设置ACLs。

设置access ACLs命令格式:# setfacl -m file

下表为可以设置的权限项目和格式要求,其中<permission>必须是r (read), w (write),and x (execute)的组合形式。

ACLEntry
Description
u:uid:\<permission>
Setsthe access ACLs for a user. You can specify user name or UID
g:gid:\<permission>
Setsthe access ACLs for a group. You can specify group name or GID.
m:\<permission>
Setsthe effective rights mask. The mask is the combination of all accesspermissions of the owning group and all of the user and group entries.
o:\<permission>
Setsthe access ACLs for users other than the ones in the group for the file.
 授权对象可以是文件,也可以是目录。例如,为用户antony授权testfile的读写权限。
[root@pc3test-disperse]# setfacl -m u:antony:rw /mnt/gluster/data/testfile

设置defaultACLs的命令格式:# setfacl -d -m

例如,设置/data目录的默认ACLs为向不在文件所属用户组内的其它所有用户,开放只读的权限:

[root@pc3test-disperse]# setfacl -d -m o::r /mnt/test-disperse

注:如果同时设置了default acls和access acls,则access acls优先级更高。

查看已经设置的POSIXACLs

查看文件的access acls:[root@pc3 test-disperse]# getfacl targetfile

查看目录的default acls:

[root@pc3test-disperse]# getfacl /mnt/test-disperse
getfacl:Removing leading '/' from absolute path names
#file: mnt/test-disperse
#owner: root
#group: root
user::rwx
group::r-x
other::r--

移除POSIX ACLs

例如,移除用户antony对test-file的所有访问权限:

[root@pc3test-disperse]# setfacl -x u:antony /mnt/gluster/data/test-file
Samba and ACLs

如果你使用Samba访问GlusterFS FUSE挂接的存储卷,那么POSIX ACLs会默认被启用