HDFS权限
之前对HDFS更或者说是对Linux中文件的权限没有进行一个完整的学习,只是知道有所有者、所属组和其它权限,具体到某个人的权限有读(r)、写(w)和可执行(x)。
遇到没有权限的问题就chmod加个权限,加完之后如果还有问题就给父目录也加一样的权限,如果还不行就给777。
这其中应该给什么权限,给什么权限最合适都是一头雾水。
今天就说说文件和目录权限的那些事。。。。
HDFS基于Linux的POSIX model
HDFS的权限虽然是基于Linux的POSIX model,但是HDFS中其实并没有真正的用户和组的概念,只是从主机上拿到用户的信息然后对其存储的文件权限进行检查。
HDFS中每个文件和目录都有一个owner和group,并对owner、owner同一个组的user和其它user的权限进行了分离,权限分为rwx。对于文件来说,有r权限则可对此文件可读,有w权限则可对文件进行写和追加,x权限对文件来说没有实际的意义。对于目录来说,拥有r权限可以查看目录中内容,比如此目录下的文件或者子目录,拥有w权限可以在此目录中新建或者删除文件和子目录,但不可以改变此目录的名字,因为改变此目录的信息是需要其上层目录的写权限,对于目录来说,个人感觉最重要的应该是x权限,拥有x权限,才可以进入当前目录进行其它操作。
如果没有目录的x权限,你拥有的其它权限并不能发挥相应的作用,因为rw权限都是针对目录中的内容的,当你没有进入目录的权限时,其它权限都是虚无。
sticky bit
HDFS中还有一个sticky bit,此功能只针对目录有效,是一个防删除位。防止*除管理员、目录或者文件的所有者之外的其它人(即使其它用户对该文件夹有rwx权限)*对文件或者目录进行删除。
命令如下:
1 | #即在第一位添加数字1 |
HDFS ACL
HDFS ACL(Access Control Lists)是对POSIX permissions model的一个补充。传统的权限是针对用户和组的组织架构来设置的,但当你只想给特定的用户或者组(而不是只针对文件的所有者和所属组)来开权限时,我们就可以使用ACL来控制。
默认情况下,HDFS ACL功能是关闭的,因为开启ACL之后,NN中会对开启ACL的inode存储一份额外的数据,会带来额外的内存开销,如果有需要可以在hdfs-site.xml
中设置dfs.namenode.acls.enabled
为true。
新建一个文件或者目录时,会继承父目录的ACL,但改变父目录的ACL时,在此目录中已经存在的内容不会发生改变。
一个文件或者目录的ACL由一组ACL entry组成。每个Entry标识一个用户或者组的rwx权限,如下一个文件的一个ACL:
1 | user::rw- |
文件的所有者具有rw权限,所属组具有rx权限,其它用户具有r权限,但是用户bruce具有该文件的rwx权限,sales组也具有该文件的rwx权限。但是bruce和sales就真的具有rwx权限了?这里还有最后一道防线mask,mask决定了一个用户或者组能够得到的最大的权限。上面的例子中,bruce和sales的权限会与mask的权限进行与运算,最终的结果才是bruce和sales的权限,也就是注释中的内容。
权限检查流程
当一个文件有ACL时,权限检查的流程为:
- 判断该用户是否为owner
- 判断该用户是否包含在ACL entry的user中,如果在,则通过mask过滤权限
- 判断该用户的所属组是否包含在组中,包含则也要通过mask来过滤权限(因为在使用了ACL的情况下,group的权限显示的就是当前的mask)
- 判断该用户的所属组是否包含在ACL entry的group中,如果在,则通过mask来过滤权限
ACL命令
1 | # 添加用户acl |
目录或者文件添加了ACL之后,ll命令查看,会有一个
+
标识
umask
一个文件或者目录新建之后就有一个默认的权限,这个默认的权限是怎么控制的呢?是由umask
控制的。
文件创建之后的默认权限是0666 & ^umask
,目录创建之后的默认权限是0777 & ^umask
,umask在core-site.xml
中由fs.permissions.umask-mode
设置,默认是022。
HDFS 开启权限
HDFS中与权限相关的配置在core-site.xml
和hdfs-site.xml
中。
core-site.xml
core-site中主要是设置umask,由fs.permissions.umask-mode控制,默认是022
hdfs-site.xml
hfds-site中控制着权限的开启,参数如下:
dfs.permissions.enabled = true
是否开启权限检查,默认是truedfs.permissions.superusergroup = supergroup
设置hdfs管理员的组名称,模式名字是supergroup,一般改为与管理员相同的名字,如管理员是hdfs,则改为hdfsdfs.namenode.acls.enabled = true
控制ACL是否开启,默认为false。
Tips
HDFS权限设置最好是以传统的权限进行控制,只针对个别权限要求高的文件进行ACL控制。