0%

Hadoop_玩转 HDFS之 ACL

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
hdfs dfs -ls args

实际使用:

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::rwx
default:user:debugo:rwx
default:group::r-x
default:mask::rwx
default: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