hdfs 如何精细化为用户赋权
本文基于 Hadoop-3.3.5
hdfs 权限模型
具体可以参阅 HDFS Permissions Guide
hdfs 实现了一套 POSIX 模型。权限分为可读权限(r)、可写权限(w)和可执行权限(x)。
对于文件,需要可读权限才能读取文件,并且需要可写权限才可以往文件中写或者追加内容,hdfs 不存在可执行文件的概念。
对于目录,需要可读权限才能列出目录的内容,可写权限可以创建或删除文件或目录,并且需要可执行权限才能访问目录子内容。
每个文件和目录都与所有者和一个组关联。 该文件或目录为所有者(owner),组成员的其他用户(group)以及所有其他用户(other)具有单独的权限。
drwx(owner)r-x(group)r-x(other) - hdfs hdfs 0 2023-03-27 00:00 /user |
HDFS 还为 POSIX ACL(访问控制列表)提供了可选的支持,以增强对特定命名用户或命名组的详细规则的文件权限。这也是以最小粒度分配文件权限的基础。
hdfs 用户
hdfs 其实并不提供用户功能,一般的,hdfs 使用的是 Linux 的用户作为 hdfs 的用户,例如你使用 root 用户登录,那么在你使用 hdfs 命令或向 yarn 提交任务时,你的用户就是 root。
root 在 hdfs 中并不是超级用户,超级用户在 hdfs-site.xml 中被
dfs.cluster.administrators
被指定,超级用户组被dfs.permissions.superusergroup
指定
特殊的,你也可以使用非 Linux 的用户来操作 hdfs,只需要在当前终端执行以下命令来切换用户
export HADOOP_USER_NAME=<your_hdfs_username> |
HADOOP_USER_NAME
用户命可以任意指定,可能会出现 hdfs 的权限问题。
用户访问权限
如果你使用了 export HADOOP_USER_NAME=<your_hdfs_username>
来切换用户名之后,可能会出现某些文件或文件夹读写出现问题。
例如,你 export HADOOP_USER_NAME=a
切换成了 a
用户,当你向 yarn 提交任务的时候,hdfs 会在 /user
目录下新建一个 /user/a
的用户工作目录,但 /user
目录的权限一般为 rwxr-xr-x
,也就是说 a
用户是没有写权限,根据 POXIS 模型可知,没有写权限就不可以在 /user
目录下新建文件夹,从而会导致任务失败。
我们不能使用 hdfs dfs -chmod 757 /user
命令将 /user
目录改为 rwxr-xrwx
权限,这样做是不安全的,因为这样做会影响到全部用户,导致所有其他用户对 /user
都可写,这不是我们所期望的结果,我们应该秉承最小权限的原则来对用户赋予权限。这时我们就需要针对单个目录或文件对单个用户赋予一些特殊权限,hdfs 提供了 ACLs 功能来帮我们解决相关场景。
ACLs 概述
HDFS在传统的POSIX权限模型之外,还支持POSIX ACLs (Access Control Lists)。通过ACLs可以做到更加灵活的授权。
默认情况下,启用了对 ACLs 的支持,Namenode允许创建ACL。 要禁用对ACL的支持,请在 NameNode 配置中设置 dfs.namenode.acls.enable
为 false。
ACLs 条目
每个 ACL 条目都为特定的用户或组命名,并授予或拒绝该特定用户或组的 rwx
,可以执行 hdfs dfs -getfacl <your_hdfs_dir>
来获取某个文件或文件夹的 ACLs 信息,具体条目如下:
# file: filepath |
字段 | 格式 | 含义 |
---|---|---|
#file | /user | 文件名 |
#owner | hdfs | 所有者 |
#group | hdfs | 所有组 |
user | user::rwx | 用户权限 |
group | group::r-x | 组权限 |
mask | mask::rwx | |
other | other::r-x | 其他人权限 |
最小 ACLs 与扩展 ACLs
如果一个文件或文件夹的 ACLs 条目与 POXIS 模型一一对应,即 ACLs 条目只包含一条 user,group,other,则称为最小 ACLs,如果 ACLs 条目包含超过三条,则称为扩展 ACLs。
ACL 权限操作
对特定用户赋权就是在对最小 ACLs 变为扩展 ACLs,hdfs 提供相关命令来帮我们实现相关操作。
hdfs dfs -setfacl [-R] [-b |-k -m |-x <acl_spec> <path>] |[--set <acl_spec> <path>] |
- -R: 以递归方式将操作应用于所有文件和目录。常用。
- -b: 删除基本ACL条目以外的所有条目。保留用户,组和其他条目以与权限位兼容。
- -k: 删除默认ACL。
default:
开头的条目。 - -m: 修改ACL。新条目将添加到ACL,并保留现有条目。常用。
- -x: 删除指定的ACL条目。保留其他ACL条目。常用。
- –set: 完全替换ACL,丢弃所有现有条目。 acl_spec 必须包含用户,组和其他条目,以便与权限位兼容。
- acl_spec: 逗号分隔的ACL条目列表。
- path: 要修改的文件或目录。
赋权
我们可以执行如下命令:
hdfs dfs -setfacl -m user:<your_hdfs_username>:rwx <your_hdfs_path> |
例如:
hdfs dfs -setfacl -m user:test:rwx /user |
这样就将 \user
目录的读、写和执行权限赋予给了 test
用户。此时可以执行 hdfs dfs -getfacl /user
命令查看 /user
目录的 ACLs 信息。
# file: /user |
ACL条目由类型,可选名称和权限字符串组成。 为了显示清晰,’:’用作每个字段之间的定界符。
取消权限
我们可以执行如下命令:
hdfs dfs -setfacl -x user:<your_hdfs_username> <path> |
例如:
hdfs dfs -setfacl -x user:test /user |
这样就将 test
用户的 \user
目录的读、写和执行权限收回。此时可以执行 hdfs dfs -getfacl /user
命令查看 /user
目录的 ACLs 信息。
# file: /user |
查看 ACLs 权限
我们可以使用如下命令来查看:
hdfs dfs -getfacl [-R] <path> |
- -R: 以递归方式列出所有文件和目录的ACL。
- path: 要列出的文件或目录。
例如:
hdfs dfs -getfacl /user |
结果如下:
# file: /user |