HDFS ACL操作实战

HDFS的文件ACL(Access Control Lists),类似于POSIX ACL(Linux使用ACL来管理文件权限)。首先参数上要开启基本权限和访问控制列表功能,在CDH 5.2中,默认的参数dfs.namenode.acls.enabled为false。

<property>    <name>dfs.permissions.enabled</name>    <value>true</value></property><property>    <name>dfs.namenode.acls.enabled</name>    <value>true</value></property>

一个访问控制列表(ACL)是一组ACL词目(entries)的集合,每个ACL词目会指定一个用户/组,并赋予读/写/执行上等权限。例如:

user::rw-   user:bruce:rwx                  #effective:r--   group::r-x                      #effective:r--   group:sales:rwx                 #effective:r--   mask::r--  other::r--

这里面,没有命名的用户/组即该文件的基本所属用户/组。每一个ACL都有一个掩码(mask),如果用户不提供掩码,那么该掩码会自动根据所有ACL条目的并集来获得(属主除外)。在该文件上运行chmod会改变掩码的权限。由于掩码用于过滤,这有效地限制了权限的扩展ACL条目,而不是仅仅改变组条目,并可能丢失的其他扩展ACL条目。定义默认 (default)ACL条目,新的子文件和目录会自动继承默认的ACL条目设置,而只有目录会有默认的ACL条目。例如:

user::rwx   group::r-x   other::r-x   default:user::rwx    default:user:bruce:rwx          #effective:r-x   default:group::r-x   default:group:sales:rwx         #effective:r-x   default:mask::r-x   default:other::r-x

新的子文件/目录的实际ACL权限值的访问受到过滤的模式参数。由于默认的文件umask是022(fs.permissions.umask-mode=22),那么新建的目录为755,而文件的权限为644。umask模式参数过滤了用于默认用户(文件所有者)的权限。ACL使用这个特定的例子,并创建一个新的子目录为755模式,这种模式过滤对最终的结果没有影响。然而,如果我们考虑以644模式建立一个文件,然后模式过滤引起新文件的ACL接受读写默认用户(文件所有者),读取掩码和其他用户。这样掩码也意味着命名用户(非默认用户)的有效的权限用户Bruce和命名组Sales仅有r权限。需要注意的是这种权限拷贝只发生在新文件或子目录被创建时。后续对父目录默认ACL的改变不会影响到它的子文件或目录。默认ACL也必须设置mask,如果mask未被指定,那么mask会通过计算所有条目的并集(属主除外)来得出。当一个文件使用ACL时,权限检查的算法则变为: · 当用户名为文件的属主时,会检查属主的权限。 · 否则如果用户名匹配命名用户条目中的一个时,权限会被检查并通过mask权限来进行过滤。 · 否则如果文件的组匹配到当前用户的组列表中的一个时,而这些权限经过mask过滤后仍然会授权,会被允许使用。 · 否则如果其中一个命名组条目匹配到组列表中的一个成员,而这些权限经过mask过滤后仍然会授权,会被允许使用。 · 否则如果文件组和任何命名组条目匹配到组列表中的一个成员时,但是访问不会被任何一个权限所授权时,访问会被拒绝。 · 除此之外,other权限位会被检查。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;

命令行命令:hdfs dfs -getfacl [-R] path显示文件和目录的访问控制列表。如果一个目录有默认的ACL,getfacl也可以显示默认的ACL设置。hdfs dfs -setfacl [-R] [-b|-k -m|-x acl_spec path]|[--set acl_spec path]设置文件和目录的ACL

-R: Use this option to recursively list ACLs for all files and directories.-b: Revoke all permissions except the base ACLs for user, groups and others.-k: Remove the default ACL.-m: Add new permissions to the ACL with this option. Does not affect existing permissions.-x: Remove only the ACL specified.

hdfs dfs -ls args 当ls的权限位输出以+结束时,那么该文件或目录正在启用一个ACL。实战:

#默认只有基本的权限控制hdfs dfs -getfacl /data# file: /data# owner: hive# group: hadoopuser::rwxgroup::r-xother::r-x#递归显示/data下所有文件的ACLhdfs dfs -getfacl -R /data# file: /data# owner: hive# group: hadoopuser::rwxgroup::r-xother::r-x# file: /data/test.zero# owner: hive# group: hadoopuser::rw-group::r--other::r--# file: /data/test.zero.2# owner: hive# group: hadoopuser::rw-group::r--other::r--#添加一个用户ACL条目hdfs dfs -setfacl -m user:hbase:rw- /data/test.zero#添加一个组ACL条目和一个用户ACL条目(如果设置一个未命名条目,可以用user::r-x,group::r-w或者other::r-x等来设置)hdfs dfs -setfacl -m group:crm:--x,user:app1:rwx /data/test.zero.2#移除一个ACL条目hdfs dfs -setfacl -x user:app1 /data/test.zero.2#“+”已开启了ACL功能hdfs dfs -ls -R /data-rw-rwxr--+  3 hive hadoop 1073741824 2014-12-21 15:32 /data/test.zero-rw-r-xr--+  3 hive hadoop 1073741824 2014-12-21 15:50 /data/test.zero.2# 查看当前ACL,此时mask已经被生成hdfs dfs -getfacl -R /data/test.zero.2# file: /data/test.zero.2# owner: hive# group: hadoopuser::rw-group::r--group:crm:--xmask::r-xother::r--hdfs dfs -getfacl /data/test.zero.2# 为data目录添加default权限hdfs dfs -setfacl -m default:user:debugo:rwx /datahdfs dfs -mkdir /data/d1hdfs dfs -getfacl /data/d1user::rwxuser:debugo:rwx#effective:r-xgroup::r-xmask::r-xother::r-xdefault:user::rwxdefault:user:debugo:rwxdefault:group::r-xdefault:mask::rwxdefault:other::r-x#可以看出,default虽然继承给了d1,但是被mask=r-x所过滤,所以这里还需要设置mask。此时debugo用户的权限可以被正常访问。hdfs dfs -setfacl -m mask::rwx /data/d1hdfs dfs -getfacl /data/d1# file: /data/d1# owner: hdfs# group: hadoopuser::rwxuser:debugo:rwxgroup::r-xmask::rwxother::r-x?......

参考:http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HdfsPermissionsGuide.htmlhttp://www.cloudera.com/content/cloudera/en/documentation/core/latest/topics/cdh_sg_hdfs_ext_acls.html

HDFS ACL操作实战

相关文章:

你感兴趣的文章:

标签云: