Bootstrap

HDFS杂谈:ACL访问控制列表

HDFS ACL介绍

在HDFS系统中,对象常规的权限控制模式为“用户+权限”。其中用户主要分为3类,分别为u(对象拥有者)、g(对象拥有者所属组别)、o(除上述两类用户外的其他用户)。每类客户都有3种权限,分别为r(读写)、w(写)、x(执行)。但是,这种权限控制的粒度太粗了,会出现不该有权限的用户具备了权限,而应该有权限的用户却被挡在门外。有没有办法可以更加精细地控制权限呢?从Hadoop 2系列开始HDFS引入了ACL(Access Control List)功能,来满足精细化控制权限的需求。

HDFS ACL功能灵感来源于Linux ACL,可以在原有的权限控制模式额外对特定的用户或用户组添加权限。在使用HDFS系统的ACL功能前,必须要先开启该功能,具体为:

1)修改hdfs-site.xml的dfs.namenode.acls.enabled参数为true,并重启HDFS服务;

2)在CDH界面上勾选HDFS的配置项”启动访问控制列表”, 并重启HDFS服务;

HDFS ACL相关指令有两个:setfacl与getfacl,具体的使用方法可阅读《》。比如为/hdfstest/test.txt增加luorl用户的读写权限,可执行如下命令

可以看到,文件已经赋予了luorl用户的读写权限了。

default ACL

上述只是对文件配置ACL权限,对目录的话还是用同样的方式吗?实际上,对文件夹配置ACL权限时,要在acl_spec语句加上default关键字,否则会报错。

而且,对目录配置ACL权限后,在该目录内创建的对象会继承目录的ACL权限。

可以看到acl_test.txt的ACL权限继续了/hdfstest/目录的ACL权限。但是红框内还有两个信息让人注意的,一个是mask::rw-,一个是effective:r--。这两个信息分别表达什么含义?

ACL权限计算

除了用户权限及ACL权限,还有一个mask权限。mask权限是用来指定最大的有效权限,从实践可以看出,mask权限是继承user的。而其他用户的权限是自身权限与mask权限的相与结果。比如上图的group权限,自身权限是r-x,而mask权限是rw-,两者相与的结果为r--,所以goup权限右边会有提示effective:r--,说明group权限只有r--。

总结

  • HDFS除了常规的权限控制模式为“用户+权限”,还有ACL功能,可以精细化控制用户权限;

  • 对文件,配置的ACL权限只对文件生效;对目录,配置的ACL权限会被该目录下的对象继承,而配置目录的ACL权限要加上default关键字;

  • 决定对象的ACL权限要看mask权限,而mask权限是继承user的。其他用户的权限是自身权限与mask权限的相与结果。