Hdfs文件权限及ACL访问控制
1、权限相关配置
(1)、hdfs-site.xml设置启动acl
<property>
<name>dfs.permissions.enabled</name>
<value>true</value> //默认值为true,即启用权限检查。如果为 false,则禁用
</property>
<property>
<name>dfs.namenode.acls.enabled</name>
<value>true</value> //默认值为false,禁用ACL,设置为true则启用ACL。当ACL被禁用时,NameNode拒绝设置或者获取ACL的请求
</property>
(2)、core-site.xml设置用户组默认权限.
<property>
<name>fs.permissions.umask-mode</name>
<value>022</value>
</property>
PS:创建文件和目录时使用的umask,默认值为八进制022,每位数字对应了拥有者,组和其他用户。该值既可以使用八进制数字,如022,也可以使用符号,如u=rwx,g=r-x,o=r-x(对应022)
2、hdfs acl权限实体类别
(1)、默认ACL必须包含所有最小要求的ACL项,包括文件拥有者项,文件所属的组项和其它用户项
即:
user::rwx
group::r-x
other::r-x
(2)、每个ACL项由类型,可选的名称和权限字符串组成,它们之间使用冒号(:)
如:
user::rw-
user:bruce:rwx #effective:r-- //bruce这个用户实际拥有读执行权限 (rwx, r-x(mask) 两者执行‘相与’操作得到实际权限)
group::r-x #effective:r--
group:sales:rwx #effective:r--
mask::r--
other::r--
a、这组ACL访问列表中:文件的拥有者具有读写权限,文件所属的组具有读和执行的权限,其他用户具有读权限;除此之外,还有两个扩展的ACL项,分别为用户bruce和组sales,并都授予了读写执行的权限。
b、最大有效权限mask:mask项是一个特殊的项,用于过滤授予所有命名用户,命名组及未命名组的权限,即过滤除文件拥有者和其他用户(other)之外的任何ACL项
(3)、默认访问控制列表:有目录可能拥有默认访问控制列表,当创建新文件或者子目录时,自动拷贝父辈的默认访问控制列表到自己的访问控制列表中,新的子目录也拷贝父辈默认的访问控制列表到自己的默认访问控制列表中。这样,当创建子目录时默认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
3、hdfs acl权限生效的算法规则
(1)如果是owner,则取owner的权限
(2)如果针对用户设置了ACL,则用户的ACL生效
(3)如果用户在组里,则取各组ACL的并集
(4)其他情况,取other的权限
(5)default权限:设置default之后,对新添加的文件和目录生效,对于现有的文件和目录不生效。
如:目录A拥有default:user:bruce:rwx权限,则在目录A下创建目录B,则目录B拥有user:bruce:rwx,default:user:bruce:rwx权限。
4、hdfs acl shell命令
(1)、显示某个文件的权限
hdfs dfs -getfacl [-R]
如:hdfs dfs -getfacl /test/acl
(2)、赋予权限:
hdfs dfs -setfacl [-R] -m
如:hdfs dfs -setfacl -R -m user:testUser:rw- /test/acl
(3)、删除权限:
hdfs dfs -setfacl [-R] [-b|-k |-x ]|[–set ]
-x 删除指定的acl权限
-k 删除所有默认的权限
-b 删除所有的权限
5、hdfs acl FileSystem 相关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;
如:给文件 /user/test/input/acl 设置 user:bruce:r-x default:user:bruce:r-x权限
代码如下:
@Test
public void testModifyAcl () throws IOException{
List<AclEntry> aclEntries = new ArrayList<AclEntry>();
for (int i = 0; i <= 1; i++) {
AclEntryScope aclEntryScope = (i == 0) ? AclEntryScope.ACCESS : AclEntryScope.DEFAULT;
Builder builder = new AclEntry.Builder();
builder.setName("bruce");
builder.setPermission(FsAction.READ_EXECUTE);
builder.setScope(aclEntryScope);
builder.setType(AclEntryType.USER);
AclEntry aclEntry = builder.build();
aclEntries.add(aclEntry);
}
FileSystem fs = FileSystem.get(HadoopConfiguration.getConf());
Path path = new Path("/user/test/input/acl/");
fs.modifyAclEntries(path, aclEntries);
}
参考:
http://hadoop.apache.org/docs/r2.6.2/hadoop-project-dist/hadoop-hdfs/HdfsPermissionsGuide.html
http://zh.hortonworks.com/blog/hdfs-acls-fine-grained-permissions-hdfs-files-hadoop/