Hadoop从2.4.0版本开始支持hdfs的ACL,
通俗的讲就是文件访问控制权限
下面对其进行一些测试:
unnamed user (file owner)
文件的拥有者
unnamed group (file group)
文件的所属组
named user
除了文件的拥有者和拥有组之外,的其它用户
named group
除了文件的拥有者和拥有组之外,的其它用户
mask
权限掩码,用于过滤named user和named group的权限
一、启用ACL 启用ACL功能
修改hdfs-site.xml 增加如下属性 开启ACL
1 2 3 4 5 6 7 8 <property > <name > dfs.permissions.enabled</name > <value > true</value > </property > <property > <name > dfs.namenode.acls.enabled</name > <value > true</value > </property >
修改core-site.xml 设置用户组默认权限.
1 2 3 4 <property > <name > fs.permissions.umask-mode</name > <value > 002</value > </property >
一个访问控制列表(ACL)是一组ACL词目(entries)的集合,每个ACL词目会指定一个用户/组,并赋予读/写/执行上等权限。例如:
1 2 3 4 5 6 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条目。例如:
1 2 3 4 5 6 7 8 9 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相关的文件API: 1 2 3 4 5 6 7 8 9 10 11 public void modifyAclEntries (Path path, List aclSpec) throws IOException ;public void removeAclEntries (Path path, List 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 aclSpec) throws IOException ;public AclStatus getAclStatus (Path path) throws IOException ;
命令行命令: 显示文件和目录的访问控制列表。如果一个目录有默认的ACL,getfacl也可以显示默认的ACL设置。
1 hdfs dfs -getfacl [-R] path
设置文件和目录的ACL
1 hdfs dfs -setfacl [-R] [-b|-k -m|-x acl_spec path]|[--set acl_spec path]
1 2 3 4 5 -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.
当ls的权限位输出以+结束时,那么该文件或目录正在启用一个ACL。
实际使用: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 # 默认只有基本的权限控制 hdfs dfs -getfacl /data # file: /data # owner: hive # group: hadoop user::rwx group::r-x other::r-x #递归显示/data下所有文件的ACL hdfs dfs -getfacl -R /data # file: /data # owner: hive # group: hadoop user::rwx group::r-x other::r-x # file: /data/test.zero # owner: hive # group: hadoop user::rw- group::r-- other::r-- # file: /data/test.zero.2 # owner: hive # group: hadoop user::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: hadoop user::rw- group::r-- group:crm:--x mask::r-x other::r-- hdfs dfs -getfacl /data/test.zero.2 # 为data目录添加default权限 hdfs dfs -setfacl -m default :user:debugo:rwx /data hdfs dfs -mkdir /data/d1 hdfs dfs -getfacl /data/d1 user::rwx user:debugo:rwx #effective:r-x group::r-x mask::r-x other::r-x default :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/d1 hdfs dfs -getfacl /data/d1 # file: /data/d1 # owner: hdfs # group: hadoop user::rwx user:debugo:rwx group::r-x mask::rwx other::r-x