ACL(访问控制列表)
除了传统的POSIX权限模型外,HDFS还支持POSIX ACL(访问控制列表)。ACL可用于实施与用户和组的自然组织层次结构不同的权限要求。ACL提供了一种为特定的命名用户或命名组设置不同权限的方法,而不仅仅是文件的所有者和文件的组。
默认情况下,禁用对ACL的支持,并且NameNode禁止创建ACL。要启用对ACL的支持,请在NameNode配置中将dfs.namenode.acls.enabled设置为true。
ACL由一组ACL条目组成。每个ACL条目都为一个特定的用户或组命名,并授予或拒绝对该特定用户或组的读取,写入和执行权限。例如:
用户:: rw-
用户:bruce:rwx#有效:r--
组:: RX#有效:R--
组:销售:rwx#有效:r--
面具:: r--
其他:: r--
ACL条目由类型,可选名称和权限字符串组成。出于显示目的,“:”用作每个字段之间的分隔符。在此示例ACL中,文件所有者具有读写访问权限,文件组具有读取执行访问权限,其他用户具有读取访问权限。到目前为止,这等效于将文件的权限位设置为654。
此外,还有2个扩展的ACL条目,分别用于已授予完全访问权限的命名用户bruce和命名组sales。掩码是一个特殊的ACL条目,它过滤授予所有已命名用户条目和已命名组条目以及未命名组条目的权限。在该示例中,掩码仅具有读取权限,并且我们可以看到已经相应过滤了多个ACL条目的有效权限。
每个ACL必须有一个掩码。如果用户在设置ACL时未提供掩码,则将通过计算将被掩码过滤的所有条目的权限并集来自动插入掩码。
在具有ACL的文件上运行chmod实际上会更改掩码的权限。由于掩码充当过滤器,因此有效地限制了所有扩展ACL条目的权限,而不是仅更改组条目并可能丢失其他扩展ACL条目。
该模型还区分了“访问ACL”和“默认ACL”,“访问ACL”定义了权限检查期间要执行的规则,“默认ACL”定义了新子文件或子目录在创建过程中自动接收的ACL条目。例如:
用户:: rwx
组:: RX
其他:: rx
默认值:user :: rwx
默认值:user:bruce:rwx#有效:rx
默认值:group :: rx
默认值:组:销售:rwx#有效:rx
默认值:mask :: rx
默认值:other :: RX
只有目录可以具有默认的ACL。创建新文件或子目录后,它将自动将其父级的默认ACL复制到其自己的访问ACL中。新的子目录还将其复制到其自己的默认ACL。这样,当创建新的子目录时,将通过文件系统树的任意深层次向下复制默认ACL。
新子级访问ACL中的确切许可权值受mode参数过滤。考虑到默认umask 022,对于新目录,这通常是755,对于新文件,通常是644。模式参数过滤未命名用户(文件所有者),掩码和其他用户的复制的权限值。使用此特定示例ACL,并为模式创建带有755的新子目录,此模式过滤对最终结果没有影响。但是,如果考虑为该模式创建带有644的文件,则模式过滤会导致新文件的ACL对未命名用户(文件所有者)进行读写操作,对掩码进行读取,对其他用户进行读取。此掩码还意味着仅读取命名用户布鲁斯和命名组销售的有效权限。
请注意,复制发生在创建新文件或子目录时。对父级默认ACL的后续更改不会更改现有子级。
默认ACL必须具有所有最低要求的ACL条目,包括未命名的用户(文件所有者),未命名的组(文件组)和其他条目。如果用户在设置默认ACL时未提供这些条目之一,则将通过复制访问ACL中的相应权限(如果没有访问ACL,则复制权限位)来自动插入条目。默认ACL还必须具有掩码。如上所述,如果未指定掩码,则通过计算将被掩码过滤的所有条目的权限并集,自动插入掩码。
考虑具有ACL的文件时,权限检查算法更改为:
如果用户名与文件的所有者匹配,则将测试所有者权限;否则,将进行测试。
否则,如果用户名与命名的用户条目之一中的名称匹配,则将测试这些许可权,并通过掩码许可权进行过滤;否则,将对这些许可权进行测试。
否则,如果文件组与组列表中的任何成员匹配,并且如果由掩码过滤的这些权限授予访问权限,则将使用这些权限;否则,将使用这些权限。
否则,如果存在与组列表成员匹配的命名组条目,并且如果这些权限由掩码授予访问权限过滤,则将使用这些权限;否则,将使用这些权限。
否则,如果文件组或任何命名的组条目与组列表的成员匹配,但是任何这些权限均未授予访问权限,则访问被拒绝;
否则,将测试文件的其他权限。
最佳实践是依靠传统的权限位来实现大多数权限要求,并定义较少数量的ACL以通过一些例外规则来扩展权限位。与仅具有权限位的文件相比,具有ACL的文件在NameNode中的内存中会产生额外的开销。
友情链接:
Copyright © 2022 剑侠盟·网游特攻队 All Rights Reserved.