[关闭]
@xtccc 2015-12-03T13:23:15.000000Z 字数 3012 阅读 4117

文件权限(含ACL)

给我写信
GitHub

此处输入图片的描述


HDFS


参考




假设,HDFS中有一个目录,如下:

  1. [root@hadoop1 ~]# hdfs dfs -ls /user/tao
  2. Found 3 items
  3. drwxrwxr-x+ - hdfs supergroup 0 2015-09-09 10:29 /user/tao/data
  4. drwxr-xr-x - hdfs supergroup 0 2015-11-18 14:09 /user/tao/guizhou
  5. drwxr-xr-x - hdfs supergroup 0 2015-12-03 20:23 /user/tao/test
  6. [root@hadoop1 ~]# hdfs dfs -ls /user/tao/test
  7. Found 1 items
  8. -rw-r--r-- 3 hdfs supergroup 485128 2015-12-03 20:23 /user/tao/test/log.txt



文件 /user/tao/test/log.txt 的owner是hdfs,所属的group为supergroup,我希望用以tao这个用户来删除该文件。

[root@hadoop1 ~]# sudo -u tao hdfs dfs -rm /user/tao/test/log.txt
15/12/03 20:33:08 INFO fs.TrashPolicyDefault: Namenode trash configuration: Deletion interval = 1440 minutes, Emptier interval = 0 minutes.
15/12/03 20:33:08 WARN fs.TrashPolicyDefault: Can't create trash directory: hdfs://hadoop5.com:8020/user/tao/.Trash/Current/user/tao/test
rm: Failed to move to trash: hdfs://hadoop5.com:8020/user/tao/test/log.txt: Permission denied: user=tao, access=WRITE, inode="/user/tao":hdfs:supergroup:drwxrwxr-x:user:hbase:rwx,group::r-x

权限不够!

解决方法1: 赋予用户tao删除该文件的权限
解决方法2: 将用户tao加入群组supergroup,然后向群组supergroup赋予删除该文件的权限。
解决方法3: 通过ACL来赋予用户tao对该文件的删除权限



用户群组


首先用命令id -Gn {username}来查看用户tao属于哪一个group。

[root@hadoop1 ~]# id -Gn tao
tao

这是Linux Shell中对用户群组的判断,与HDFS对用户群组的判断并不相同。



HDFS怎么判断tao属于哪一个group呢?
当一个用户执行某个hadoop命令时,Namenode或者JobTracker会知道执行该命令的用户的username:这个username就是执行该命令的用户在其所在的linux上的用户名。
同时,Namonode或者JobTracker还会判断该user属于哪个group —— 这是通过一系列的plugin (group mapping service)来实现的:

  • org.apache.hadoop.security.JniBasedUnixGroupsMappingWithFallback
  • org.apache.hadoop.security.ShellBasedUnixGroupsMappingWithFallback(默认)
  • org.apache.hadoop.security.LdapGroupsMapping



这些可以在Cloudera Manager中进行配置,如下:
QQ20151203-0@2x.png-224.2kB



如果使用org.apache.hadoop.security.ShellBasedUnixGroupsMappingWithFallback这个插件,那么HDFS会以如下的方式判断一个user所属的group:

如果Namenode所在节点的Linux中存在用户tao,且这个用户在Linux中属于群组supergroup,那么HDFS就认为用户tao属于群组supergroup

当我们从其他节点上操作HDFS时,如果以tao的身份进行操作,即使该节点上没有群组supergroup,或者该节点上的用户user不属于群组supergroup,HDFS也会认为操作者(tao)属于群组supergroup,因为HDFS只根据Namenode节点判断tao与supergroup的关系。




ACL


Hadoop中的ACL与Linux中的ACL机制基本相同,都是用于为文件系统提供更精细化的权限控制。

getfacl

getfacl用于查看一个文件/目录的ACL状态,例如:

  1. [root@hadoop1 ~]# hdfs dfs -getfacl /user/tao/test/log.txt
  2. # file: /user/tao/test/log.txt
  3. # owner: hdfs
  4. # group: supergroup
  5. user::rw-
  6. group::r--
  7. other::r--


setfacl

在HDFS文件原生的权限之外,针对某个文件,为某个指定的user再设置权限,可以通过setfacl来完成。

  1. [root@hadoop1 ~]# sudo -u hdfs hdfs dfs -setfacl -m user:tao:rwx /user/tao/test/log.txt
  2. [root@hadoop1 ~]# hdfs dfs -getfacl /user/tao/test/log.txt
  3. # file: /user/tao/test/log.txt
  4. # owner: hdfs
  5. # group: supergroup
  6. user::rw-
  7. user:tao:rwx
  8. group::r--
  9. mask::rwx
  10. other::r--
  11. [root@hadoop1 ~]# hdfs dfs -ls /user/tao/test/
  12. Found 1 items
  13. -rw-rwxr--+ 3 hdfs supergroup 485128 2015-12-03 20:23 /user/tao/test/log.txt

由于在执行setfacl命令前,该文件的owner是hdfs,所以要以用户hdfs的身份来执行setfacl命令才行。

关于权限标志位的顺序: 在命令hadoop dfs -setfacl -m user:hbase:rwx /user/tao/xt-data中,权限标志位rwx的顺序不能改变,否则会报错:-setfacl: Invalid permission in
正确的写法有: rwx, r-x, -r-, -rx等;
错误的写法有:wrx,w-x等。


Default ACL

可以为某个目录设置一个默认的ACL权限,使得以后在该目录中新建文件或者子目录时,新建的文件/目录的ACL权限都是之前设置的default ACLs。

命令为:

hdfs dfs -setfacl -m default:user:tao:rwx /user/tao/test/

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注