概述
Hadoop分布式文件系统(HDFS)为共享大部分POSIX模型的文件和目录实现权限模型。每个文件和目录都与一个所有者和一个组相关联。该文件或目录对作为所有者的用户,作为该组成员的其他用户以及对所有其他用户具有单独的权限。对于文件,需要r权限才能读取文件,而w权限才能写入或附加到文件。对于目录,需要r权限才能列出目录的内容,需要w权限来创建或删除文件或目录,并且需要x权限来访问目录的子级。
-
客户端在进行每次文件操时,系统会从用户身份认证和数据访问授权两个环节进行验证。
-
客户端的操作请求会首先通过用户身份验证机制来获得“凭证”(类似于身份证书),HDFS根据此“凭证”分辨出合法的用户名;
-
然后HDFS再据此查看该用户所访问的数据是否已经授权,或者说该身份凭证是否具有权限做这件事。
-
一旦这个流程中的某个环节出现异常,客户端的操作请求便会失败。
UGO权限管理
拥有者、所在组、其他用户组
-
HDFS文件权限与Linux/Unix系统的UGO模型类似,简单描述为:每个文件和目录都与一个拥有者和一个组相关联。
-
USER(文件的所有者):一般是创建该文件的用户,对该文件具有完全的权限。
-
GROUP(拥有者所在的组):和文件所有者属于同一组的用户。
-
OTHER(其他用户组):其他用户组的用户。
读、写、执行权限
-
HDFS文件权限也细分为:读权限(r)、写权限(w)、执行权限(x)。
-
在HDFS中,对于文件,需要r权限才能读取文件,而w权限才能写入或追加到文件。没有x可执行文件的概念。
-
在HDFS中,对于目录,需要r权限才能列出目录的内容,需要w权限才能创建或删除文件或目录,并且需要x权限才能访问目录的子级。
- 读权限(r)、写权限(w)、执行权限(x)可以使用数字表示,也可以使用字母表示。
umask权限掩码
-
与Linux/Unix系统类似,HDFS也提供了umask掩码,用于设置在HDFS中默认新建的文件和目录权限位。
-
默认umask值有属性fs.permissions.umask-mode指定,默认值022。
-
创建文件和目录时使用的umask,默认的权限就是
目录:777-022=755,也就是drwxr-xr-x 文件:777-022=755,因为HDFS中文件没有x执行权限的概念,所以是:-rw-r--r--
UGO权限相关命令
#变更目录或文件的权限 可以使用数字 也可以使用字母 u g o a + - r w x
hadoop fs -chmod [-R] 777 /user/itcast/foo
hadoop fs -chmod [-R] u+x,o-x /user/itcast/foo
#变更目录或文件的属主或用户组
hadoop fs -chown [-R] itcast /user/itcast/foo
hadoop fs -chown [-R] itcast:ogroup /user/itcast/foo
#变更用户组
hadoop fs -chgrp [-R] group1 /user/itcast/foo
Web页面修改UGO权限
- Hadoop3.0之后,支持在HDFS Web页面上使用鼠标修改。
Group Mapping组映射
-
在通过用户身份认证拿到用户名后之后,NameNode还需要通过用户组映射服务获取该用户所对应的用户组列表,用于后期的用户组权限校验
-
HDFS中用户所属组的确认工作需要通过外部的用户组映射(Group Mapping)服务来获取。用户到组的映射可以使用系统自带的方案(使用NameNode服务器上的用户组系统),也可以通过其他实现类似功能的插件(LDAP、Ranger等)方式来代替。
基于Linux/Unix系统的用户和用户组
-
Linux/Unix系统上的用户和用户组信息存储在/etc/passwd和/etc/group文件中
-
默认情况下,HDFS会通过调用外部的 Shell 命令来获取用户的所有用户组列表。
-
/etc/passwd
-
一行记录对应着一个用户,每行记录又被冒号(:)分隔为7个字段,其格式和具体含义如下:
用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell
其中组标识号字段记录的是用户所属的用户组。它对应着/etc/group文件中的一条记录。
-
/etc/group
-
文件中每一行各代表一个用户组,每行记录又被冒号(:)分隔为4个字段,其格式和具体含义如下:
组名:密码:GID:该用户组中的用户列表
其中最后一个字段列出每个群组包含的所有用户。需要注意的是,如果该用户组是这个用户的初始组,则该用户不会写入这个字段,可以这么理解,该字段显示的用户都是这个用户组的附加用户。
-
此方案的优点在于组映射服务十分稳定,不易受外部服务的影响。
-
但是用户和用户组管理涉及到root权限等,同时会在服务器上生成大量的用户组,后续管理,特别是自动化运维方面会有较大影响。
ACL权限管理
- ACL是Access Control List(访问控制列表)的缩写,ACL提供了一种方法,可以为特定的用户或组设置不同的权限,而不仅仅是文件的所有者和文件的组。
ACL Shell 命令
hadoop fs -getfacl [-R] <path>
#显示文件和目录的访问控制列表(ACL)。如果目录具有默认ACL,则getfacl还将显示默认ACL。
hadoop fs [generic options] -setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} <path>]|[--set <acl_spec> <path>]
#设置文件和目录的访问控制列表(ACL)。
hadoop fs -ls <args>
#ls的输出将在带有ACL的任何文件或目录的权限字符串后附加一个'+'字符。
ACL操作实战
- 使用root超级用户在HDFS上创建一个名为itheima的文件夹
hadoop fs -mkdir /itheima
- 使用普通用户allenwoon去操作/itheima 发现没有权限
[allenwoon@node1 ~]$ echo 1 >> 1.txt
[allenwoon@node1 ~]$ hadoop fs -put 1.txt /itheima
put: Permission denied: user=allenwoon, access=WRITE, inode="/itheima":root:supergroup:drwxr-xr-x
- 接下来使用ACL给allenwoon用户单独添加权限 而/itheima文件夹本身权限不变
hadoop fs -setfacl -m user:allenwoon:rwx /itheima
setfacl: The ACL operation has been rejected. Support for ACLs has been disabled by setting dfs.namenode.acls.enabled to false.
-
发现报错 原因是ACL功能默认是关闭的。
-
在hdfs-site.xml中设置dfs.namenode.acls.enabled=true 开启ACL,重启HDFS集群。
-
设置成功之后查看ACL权限
hadoop fs -setfacl -m user:allenwoon:rwx /itheima
hadoop fs -getfacl /itheima
[root@node1 ~]# hadoop fs -getfacl /itheima
# file: /itheima
# owner: root
# group: supergroup
user::rwx
user:allenwoon:rwx 发现allenwoon权限配置成功
group::r-x
mask::rwx
other::r-x
- 再使用普通用户allenwoon去操作,发现可以成功了
- 如果切换其他普通用户比如itcast 发现还是无法操作
[itcast@node2 ~]$ echo 2 >> 2.txt
[itcast@node2 ~]$ hadoop fs -put 2.txt /itheima
put: Permission denied: user=itcast, access=WRITE, inode="/itheima":root:supergroup:drwxrwxr-x
- ACL其他操作命令
1、带有ACL的任何文件或目录的权限字符串后附加一个'+'字符
[root@node1 ~]# hadoop fs -ls /
Found 5 items
drwxr-xr-x - root supergroup 0 2021-01-06 20:59 /data
drwxr-xr-x - root supergroup 0 2020-12-31 11:59 /itcast
drwxrwxr-x+ - root supergroup 0 2021-01-07 19:38 /itheima
drwx------ - root supergroup 0 2020-12-31 11:56 /tmp
drwxr-xr-x - root supergroup 0 2020-12-31 11:56 /user
2、删除指定的ACL条目
hadoop fs -setfacl -x user:allenwoon /itheima
3、删除基本ACL条目以外的所有条目。保留用户,组和其他条目以与权限位兼容。
hadoop fs -setfacl -b /itheima
4、设置默认的ACl权限,以后在该目录中新建文件或者子目录时,新建的文件/目录的ACL权限都是之前设置的default ACLs
[root@node1 ~]# hadoop fs -setfacl -m default:user:allenwoon:rwx /itheima
[root@node1 ~]# hadoop fs -getfacl /itheima
# file: /itheima
# owner: root
# group: supergroup
user::rwx
group::r-x
other::r-x
default:user::rwx
default:user:allenwoon:rwx
default:group::r-x
default:mask::rwx
default:other::r-x
5、删除默认ACL权
hadoop fs -setfacl -k /itheima
6、--set: 完全替换ACL,丢弃所有现有条目。 acl_spec必须包含用户,组和其他条目,以便与权限位兼容。
hadoop fs -setfacl --set user::rw-,user:hadoop:rw-,group::r--,other::r-- /file