ACL(访问控制列表)
除了传统的POSIX权限模型外,HDFS还支持POSIX ACL(访问控制列表)。ACL对实现与用户和组的自然组织层次结构不同的权限要求很有用。ACL提供了一种为特定命名用户或命名组(不仅是文件所有者和文件组)设置不同权限的方法。
默认情况下,禁用对ACL的支持,并且NameNode不允许创建ACL。要启用对ACL的支持,请在NameNode配置中将dfs.namenode.acls.enabled设置为true。
ACL由一组ACL条目组成。每个ACL条目都会命名特定的用户或组,并授予或拒绝该特定用户或组的读取,写入和执行权限。例如:
user :: rw- user:bruce:rwx #effective:r-- group :: rx #effective:r-- group:sales:rwx #effective:r-- mask :: r-- other :: r--
ACL条目由一个类型,一个可选名称和一个权限字符串组成。出于显示目的,':'用作每个字段之间的分隔符。在本示例ACL中,文件所有者具有读写访问权限,文件组具有读取执行权限,而其他权限具有读取权限。到目前为止,这相当于将文件的权限位设置为654。
此外,有两个扩展ACL条目用于指定用户bruce和指定的组销售,均授予完全访问权限。该掩码是一个特殊的ACL条目,用于过滤授予所有命名用户条目和命名组条目的权限以及未命名的组条目。在该示例中,掩码只具有读取权限,我们可以看到几个ACL条目的有效权限已被相应地过滤。
每个ACL都必须有一个掩码。如果用户在设置ACL时不提供掩码,则通过计算将被掩码过滤的所有条目的权限的联合,自动插入掩码。
在具有ACL的文件上运行chmod实际上会更改掩码的权限。由于掩码起到了过滤器的作用,因此这会有效地限制所有扩展ACL项的权限,而不是仅更改组项,并且可能会丢失其他扩展ACL项。
该模型还区分定义在权限检查期间执行的规则的“访问ACL”和定义创建期间新子文件或子目录自动接收的ACL条目的“默认ACL”。例如:
user :: rwx group :: rx other :: rx default:user :: rwx default:user:bruce:rwx #effective:rx default:group :: rx default:group:sales:rwx #effective:rx default:mask: :rx 默认:other :: rx
只有目录可能有一个默认ACL。创建新文件或子目录时,会自动将其父级的默认ACL复制到其自己的访问ACL中。新的子目录也将其复制到其自己的默认ACL。通过这种方式,当创建新的子目录时,默认ACL将被复制到文件系统树的任意深度级别。
新的子访问ACL中的确切权限值可以通过mode参数进行过滤。考虑到022的默认umask,新目录通常为755,新文件通常为644。mode参数筛选未命名用户(文件所有者),掩码和其他的复制权限值。使用这个特定的示例ACL,并为模式创建一个755的新子目录,此模式过滤对最终结果没有影响。但是,如果我们考虑为该模式创建一个文件为644,那么模式过滤会导致新文件的ACL接收未命名用户(文件所有者)的读写,读取掩码并读取其他文件。此掩码还意味着只读取命名用户bruce和命名组销售的有效权限。
Note that the copy occurs at time of creation of the new file or sub-directory. Subsequent changes to the parent’s default ACL do not change existing children.
请注意,复制发生在创建新文件或子目录时。对父级默认ACL的后续更改不会更改现有的子目录或文件。
默认ACL必须包含所有最低要求的ACL条目,包括未命名用户(文件所有者),未命名组(文件组)和其他条目。如果用户在设置默认ACL时没有提供这些条目中的一个,则通过复制访问ACL中的相应权限或没有访问ACL时的权限位来自动插入条目。默认ACL也必须具有掩码。如上所述,如果未指定掩码,则通过计算将被掩码过滤的所有条目的权限联合,自动插入掩码。
在考虑具有ACL的文件时,权限检查算法将更改为:
-
如果用户名与文件的所有者匹配,则测试所有者权限;
-
否则,如果用户名与其中一个指定的用户条目中的名称相匹配,则会测试这些权限,并按掩码权限进行过滤;
-
否则,如果文件组与组列表中的任何成员相匹配,并且这些权限由掩码授予访问权限过滤,则使用这些权限;
-
否则,如果存在与组列表的成员相匹配的命名组项,并且这些权限由掩码授权访问过滤,则使用这些权限;
-
否则,如果文件组或任何指定的组条目与组列表的成员相匹配,但访问权未被任何这些权限授予,则访问被拒绝;
-
否则,测试文件的其他权限。
最佳实践是依靠传统的权限位来实现大多数权限要求,并定义更少数量的ACL以通过一些特殊规则来扩充权限位。与仅具有权限位的文件相比,使用ACL的文件在NameNode的内存中会产生额外的开销。
ACL文件系统API
新方法:
- public void modifyAclEntries(Path path,List <AclEntry> aclSpec)throws IOException;
- public void removeAclEntries(Path path,List <AclEntry> aclSpec)throws IOException;
- public void public void removeDefaultAcl(Path path)throws IOException;
- public void removeAcl(Path path)throws IOException;
- public void setAcl(Path path,List <AclEntry> aclSpec)throws IOException;
- public AclStatus getAclStatus(Path path)throws IOException;
ACL Shell命令
-
hdfs dfs -getfacl [-R] <path>
-
-
显示文件和目录的访问控制列表(ACL)。如果目录具有默认ACL,则getfacl也会显示默认ACL。
-
hdfs dfs -setfacl [-R] [-b | -k -m | -x <acl_spec> <path>] | [ - set <acl_spec> <path>]
设置文件和目录的访问控制列表(ACL)。
- zzq用户对/user/admin有rwx权限,用zzq用户可以创建目录
创建用户的属主 是zzq
-
如果使用admin用户在/user/admin下创建目录,则对新建的目录zzq用户不会享有acl权限
-
可以为某个目录设置一个默认的ACL权限,使得以后在该目录中新建文件或者子目录时,新建的文件/目录的ACL权限都是之前设置的default ACLs。
- 采用default 如:hadoop fs -setfacl -m default:user:zzq:rwx /user/admin
-
-
hdfs dfs -ls <args>
ls的输出将向任何具有ACL的文件或目录的权限字符串附加“+”字符。
有关这些命令的完整介绍,请参阅File System Shell文档。
配置参数
-
dfs.permissions.enabled = true
如果是,请按照此处所述使用权限系统。如果否,则关闭权限检查,但其他所有行为均不变。从一个参数值切换到另一个参数值不会更改模式,所有者或文件或目录组。无论权限是打开还是关闭,chmod,chgrp,chown和setfacl都会检查权限。这些函数仅在权限上下文中有用,因此不存在向后兼容性问题。此外,这允许管理员在开启定期权限检查之前可靠地设置所有者和权限。
-
dfs.web.ugi = webuser,webgroup
Web服务器使用的用户名。将其设置为超级用户的名称可让任何Web客户端查看所有内容。将其更改为其他未使用的身份允许Web客户端仅使用“其他”权限查看那些可见的内容。其他组可能会添加到逗号分隔列表中。
-
dfs.permissions.superusergroup = supergroup (默认hdfs)
超级用户组的名称。
-
fs.permissions.umask-mode = 0022
创建文件和目录时使用的umask。对于配置文件,可以使用十进制值18。
-
dfs.cluster.administrators = ACL-for-admins (默认hdfs)
群集的管理员指定为ACL。这可以控制谁可以访问HDFS中的默认servlet等。
-
dfs.namenode.acls.enabled = true
设置为true以启用对HDFS ACL(访问控制列表)的支持。默认情况下,ACL被禁用。当禁用ACL时,NameNode会拒绝所有尝试设置ACL。