HDFS权限

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

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

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将是本文档的重点。ide

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

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

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

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

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

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

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

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

五、只有超级用户才能够调用chown来修改目录和文件的owner。

ACLs概念介绍
HDFS在传统的POSIX权限模型以外,还支持POSIX ACLs (Access Control Lists)。经过ACLs能够作到更加灵活的受权。

默认状况下对ACLs的支持是关闭的,能够经过设置dfs.namenode.acls.enabled为true来打开。

ACL条目
一个ACLs由一系列条目(entry)组成,下表列出了条目的类型及格式,共有六种类型的ACL条目。
在这里插入图片描述

最小ACLs和扩展ACLs
若是ACLs与文件/目录模式权限位(file mode permission bits)彻底对应,则称为最小ACLs(minimal ACLs),它们有3个ACL条目(即上面的owner、owning group和others三种类型的条目,因为与传统的POSIX权限模型彻底对应,所以不须要指定用户名,称为无名条目)。

拥有超过3个条目的ACLs称为扩展ACLs(extended ACLs),扩展ACLs会包含一个mask条目以及给其余指定用户和组受权的条目,即有名ACL条目(named entry),与最小ACLs中无名条目相对应。
在这里插入图片描述

有名ACL条目即上表中named user和named group两种类型。这两类ACLs以下图所示:

在这里插入图片描述

ACLs对模式位中组类(group class)权限的影响
在POSIX ACLs规范中,有名条目属于组类(group class)的权限,组类权限还包含owning group条目。因为文件模式权限位中的组类权限可能比某些有名条目的权限小(例如组类权限位是r-x,可是用户foo的ACL条目是user:foo:rwx),这就与POSIX.1中规范的传统权限模型有所冲突,所以ACLs规范POSIX 1003.1e对组类权限进行了重定义:在新的语义下,它表示全部属于组类权限的ACL条目的权限上界。这样作得以保证只遵照POSIX.1规范的应用程序在不知晓ACLs的状况下不会在组权限上遇到问题。

在最小ACLs中,组类权限和owning group条目权限是彻底相同的(参考上图的例子),在扩展ACLs组类权限中可能有某些有名条目的权限比owning group条目高,因此owning group条目的权限和组类权限会不同(参考上图中的例子,owning group权限是r—,组类权限是rw-)。这个问题经过引入mask获得了解决,在最小ACLs中,组类权限对应到owning group条目,在扩展ACLs中,组类权限对应到mask条目的权限。mask的做用以下图所示:
在这里插入图片描述

对于最小ACLs来讲,文件模式权限中的owner、group和other分别映射到ACLs owner、owning group和others条目,对于扩展ACLs则是分别映射到ACLs owner、mask和others条目。当应用程序修改文件模式权限位(例如使用chmod命令)时,对应的ACL条目也会随之改变。一样的,修改这些ACL条目也会改变文件的模式权限(mode)。

注意,ACLs owner和others条目不属于组类权限,因此他们不会被mask。

默认ACLs
前面讨论的ACL条目定义了文件/目录当前的访问权限,称为访问ACLs(access ACLs),另外一种类型叫作默认ACLs(default ACL),它定义了当一个文件系统对象被建立时如何从父目录继承权限。只有目录能够被设置默认ACLs,默认ACLs不会用于权限检查,仅用于权限继承。

建立一个新的目录时,若是父目录设置了默认ACLs,则新目录会继承父目录的默认ACLs做为本身的访问ACLs,同时也做为本身的默认ACLs。新的文件则只会继承父目录的默认ACLs做为本身的访问ACLs。

从父目录默认ACLs继承来的权限并不是最终的权限,因为在建立新的目录/文件时client必定会传给NameNode一个文件模式权限(见“传统的POSIX权限模型”一节说明3),二者的计算结果才是最终的权限。计算方式采用与运算,即取继承的ACLs中某类权限与模式权限中对应类别权限的交集。下面是一个例子:
在这里插入图片描述

ACLs的示例
下面给展现几个ACLs的示例,方便你们理解。

先看一个最小ACLs的例子,目录/user/foo:

在这里插入图片描述

修改/user/foo的模式权限位为755,则对应的ACL条目也跟着发生了变化。
在这里插入图片描述

给/user/foo目录添加一条ACLs,此时/user/foo的ACLs就变成了扩展ACLs。咱们能够观察到在新增了bar的ACL条目以外,同时还新增了一个mask条目。该mask条目是自动添加的,取值是全部组类型条目的并集。同时扩展ACLs的模式权限位中组类权限也改成映射到了mask条目,所以使用ls命令查看/user/foo的模式权限位,又变成了775。

注意,此时以组用户的身份访问/user/foo目录,仍然只有r-x权限,而不是ls看到的rwx权限了。

在这里插入图片描述

再次修改/user/foo的模式权限位从组类权限中去掉w权限,mask条目也跟着发生了变化。同时用户bar的权限也受mask限制变成了r-x,即getfacl结果中显示的effective:r-x。
在这里插入图片描述

给/user/foo添加一条默认ACL条目。虽然只给用户joe添加了一条默认ACL条目,可是对于一个完整的ACLs来讲所需的其余条目都已经被自动从访问ACLs中复制了过来。

在这里插入图片描述

如今建立一个/user/foo的子目录subdir。为了更直观的观察到继承的ACLs权限和client传过来的permission是如何共同做用的,咱们先把default ACLs中的other条目给修改为只有读权限。

能够看到/user/foo的default ACLs都已经被subdir继承了,可是有两点须要注意:

(1)因为umask设置的是022,因此新建目录的权限应该是755,但实际是754。这是由于继承的ACLs other条目权限和client传递过来的permission权限中的other类别权限作了与运算,最终other的权限是r–

(2)同时继承的mask是rwx,可是和client传递过来的permission权限中的组类权限(r-x)作过与操做以后就变成了r-x
在这里插入图片描述

在/user/foo目录下建立一个文件,会继承默认ACLs中的权限,但文件自己再也不有默认ACLs。

在这里插入图片描述

1.1 超级用户
启动namenode服务的用户就是超级用户, 该用户的组是supergroupnode

1.2 文件权限管理

1.2.1 建立时的owner和group
文件或者目录被建立之时,服从BSD规则,owner是客户端进程的用户,group是父目录的grouplinux

1.2.2 访问权限说明
object r w x stick bit(restricted deletion flag)
file 读文件 写或者追加写文件 无效
directory 列出目录的内容 建立或者删除子文件或子目录 访问子文件或者子目录 阻止移动或者删除该目录内的文件或目录(超级用户,owner和group不会被stick bit阻止)

1.2.3 应用示例

建立/input目录,用于接收外部写入的数据
input目录的group也是input,owner是lisa(超级用户),
建立/input/dean目录,用于接收dean用户写入的数据, owner是dean用户,group用户容许写入数据
建立目录
$ hdfs dfs -mkdir -p /input/dean
$ hdfs dfs -ls /
Found 3 items
drwxr-xr-x - lisa supergroup 0 2015-11-08 17:26 /input
drwxr-xr-x - lisa supergroup 0 2015-09-28 15:21 /test
drwxr-xr-x - lisa supergroup 0 2015-11-08 17:09 /tmp
$ hdfs dfs -ls /input
Found 1 items
drwxr-xr-x - lisa supergroup 0 2015-11-08 17:26 /input/dean

修改input目录的owner为lisa,group从supergroup改成input
$ hdfs dfs -chown lisa:input /input
$ hdfs dfs -ls /
Found 3 items
drwxr-xr-x - lisa input 0 2015-11-08 17:26 /input
drwxr-xr-x - lisa supergroup 0 2015-09-28 15:21 /test
drwxr-xr-x - lisa supergroup 0 2015-11-08 17:09 /tmp

修改/input/dean目录的ower和group都为dean
$ hdfs dfs -ls /input
Found 1 item
drwxrwxr-x - dean dean 0 2015-11-21 16:24 /input/dean

注意,客户机上建立linux 用户dean,无需在namenode节点上建立该用户服务器

容许input group用户写入/input/qoros目录
先要设置目录权限,让input组用户都能读,写,执行该目录
$ hdfs dfs -chmod -R g+w /input/qoros

而后在客户机上
建立guoqiang账号和组input
useradd guoqiang
groupadd input

改guoqiang用户组为input
usermod -g input guoqiang

在namenode所在的服务器上添加相同的用户和组,这点很奇怪,若是不这么干写操做会被拒绝,这会形成麻烦,由于两个namenode节点都要这么干ide

useradd guoqiang
usermod -g input guoqiang

取消其余用户的全部权限
$ hdfs dfs -chmod -R o-r /input/dean
$ hdfs dfs -ls /input
Found 1 items
drwxrwx–x - lisa supergroup 0 2015-11-08 17:26 /input/dean
$ hdfs dfs -chmod -R o-x /input/dean
$ hdfs dfs -ls /input
Found 1 items
drwxrwx— - lisa supergroup 0 2015-11-08 17:26 /input/dean
1.3 POSIX ACLs(目前还没有使用)
为特定的用户和组提供细致粒度的权限管理, 而不仅是owner,group。该功能默认关闭, 须要以下设置打开spa

dfs.namenode.acls.enabled true

具体配置实在hdfs-site.xml中.net

dfs.permissions.enabled true dfs.namenode.acls.enabled true

在core-site.xml设置用户组默认权限.rest

fs.permissions.umask-mode 002
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值