HDFS 支持 POSIX 访问控制列表(ACLs),以及已支持的传统POSIX权限模型。
前言
ACL 通过给特定命名的 user 和 group 设置不同的权限的方法来控制 HDFS 文件的访问。
ACL的方式增强了传统权限模型,因为它可以让你给任意组合的 user 和 group 来定义访问控制,
而不是为单个 owner/user 或单个 group。
传统的POSIX权限模型
HDFS实现的是类似于POSIX系统的权限模型,如前所述,使用过Linux/Unix系统的用户对该模型应该都非常熟悉,就不再赘述。这里先对下文中最常被问到的问题做一些说明:
访问某个路径时,用户必须具备该路径上每个目录的执行(x)权限,路径中最后一个目录/文件除外。例如 ls /user/foo/data操作要求用户必须具有根目录(/),user目录,foo目录的执行权限。
创建一个文件或者目录时,owner是客户进程的用户,group则继承父目录
新建文件或目录的模式(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的读写执行权限。
umask通过client端hdfs-site.xml中的fs.permissions.umask-mode配置项来指定,默认是022。
只有超级用户才可以调用chown来修改目录和文件的owner。
开启 ACL
使用 CM 开启 HDFS 的 ACL。在 HDFS 的配置页面搜索下方参数修改
1 | dfs.namenode.acls.enabled |
重启相关服务
ACL 条目
一个ACLs由一系列条目(entry)组成,上表表列出了条目的类型及格式,共有六种类型的ACL条目。
最小 ACLs 和扩展 ACLs
最小ACLs就是与文件/目录模式权限位完全对应。
如上图所示,没有附加的权限
hadoop fs -ls 看到什么权限,最小 ACLs 就是这个权限。
拥有超过3个条目的ACLs称为扩展ACLs(extended ACLs)
扩展 ACLs 会包含一个 mask 条目以及给其他指定用户和组授权的条目,
即有名ACL条目(named entry),与最小ACLs中无名条目相对应。
有名 ACL 条目即上表中 ACL 条目中 named user 和 named group 两种类型。
对于最小 ACLs 来说,文件模式权限中的 owner、group 和 other 分别映射到 ACLs owner、owning group 和 others 条目,
对于扩展 ACLs 则是分别映射到 ACLs owner、mask 和 others 条目。
掩码(mask) 影响
在最小 ACLs 中,group class 就是 owning group 条目权限
在扩展 ACLs 中,group class 为 掩码(mask) 条目
除了owner、other 条目以外,其他条目虚与掩码(mask)条目进行与运算,得到最后真实的权限。如下图所示
每一个ACL都有一个掩码(mask),如果用户不提供掩码,那么该掩码会自动根据所有ACL条目的并集来获得(属主除外)
在该文件上运行 chmod 会改变掩码的权限。由于掩码用于过滤,这有效地限制了权限的扩展 ACL 条目,而不是仅仅改变组条目,并可能丢失的其他扩展ACL条目。
可以看到 mask 为 r-x。user:bigdatams:rwx 条目最后的权限为 #effective:r-x
默认 ACL
前面讨论的ACL条目定义了文件/目录当前的访问权限,称为访问ACLs(access ACLs),另一种类型叫做默认ACLs(default ACL),它定义了当一个文件系统对象被创建时如何从父目录继承权限。
只有目录可以被设置默认ACLs,默认ACLs不会用于权限检查,仅用于权限继承。
创建一个新的目录时,如果父目录设置了默认ACLs,则新目录会继承父目录的默认ACLs作为自己的访问ACLs,同时也作为自己的默认ACLs。
新的文件则只会继承父目录的默认ACLs作为自己的访问ACLs,但文件本身不再有默认ACLs。
从父目录默认 ACLs 继承来的权限并非最终的权限,由于在创建新的目录/文件时 client 一定会传给 NameNode 一个文件模式权限
(见“传统的POSIX权限模型”一节说明3),两者的计算结果才是最终的权限。计算方式采用与运算,即取继承的ACLs中某类权限与模式权限中对应类别权限的交集。
虽然只添加一条默认ACL条目,对于一个完整的ACLs来说所需的其他条目都已经被自动从访问ACLs中复制了过来。
default:mask 也是自动添加的,它的取值是根据所有ACL条目的并集来获得(属主除外)。
权限检查
当一个文件使用ACL时,权限检查的算法则变为:
- 当用户名为文件的属主时,会检查属主的权限。
- 否则如果用户名匹配命名用户条目中的一个时,权限会被检查并通过mask权限来进行过滤。
- 否则如果文件的组匹配到当前用户的组列表中的一个时,而这些权限经过mask过滤后仍然会授权,会被允许使用。
- 否则如果其中一个命名组条目匹配到组列表中的一个成员,而这些权限经过mask过滤后仍然会授权,会被允许使用。
- 否则如果文件组和任何命名组条目匹配到组列表中的一个成员时,但是访问不会被任何一个权限所授权时,访问会被拒绝。
- 除此之外,other权限位会被检查。
使用 ACL
要设置和获取文件的访问控制列表(ACLs),有两种方式API 和 shell。
文件系统的shell命令,setfacl 和 getfacl
1. getfacl
1 | haddop fs -getfacl [-R] <path> |
2. setfacl
1 | hadoop fs -setfacl [-R] [-b|-k -m|-x <acl_spec> <path>]|[--set <acl_spec> <path>] |
总结
当 ls 的权限位输出以+结束时,那么该文件或目录正在启用一个ACL。
常用命令
1 | # 查询目录的ACL规则 |
参考链接