本文基于 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>
export HADOOP_USER_NAME=a
export HADOOP_USER_NAME=b

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.enablefalse。

ACLs 条目

每个 ACL 条目都为特定的用户或组命名,并授予或拒绝该特定用户或组的 rwx,可以执行 hdfs dfs -getfacl <your_hdfs_dir> 来获取某个文件或文件夹的 ACLs 信息,具体条目如下:

# file: filepath
# owner: hdfs
# group: hdfs
user::rwx
group::rwx
mask::rwx
other::rwx
字段 格式 含义
#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
# owner: hdfs
# group: hdfs
user::rwx
user:test:rwx
group::r-x
mask::rwx
other::r-x

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
# owner: hdfs
# group: hdfs
user::rwx
group::r-x
mask::rwx
other::r-x

查看 ACLs 权限

我们可以使用如下命令来查看:

hdfs dfs -getfacl [-R] <path>
  • -R: 以递归方式列出所有文件和目录的ACL。
  • path: 要列出的文件或目录。

例如:

hdfs dfs -getfacl /user

结果如下:

# file: /user
# owner: hdfs
# group: hdfs
user::rwx
user:test:rwx
group::r-x
mask::rwx
other::r-x

延申阅读

  1. HDFS Permissions Guide
  2. 一篇文章搞懂 HDFS 权限管理
  3. HDFS ACL权限设置