HDFS提供了多层次的权限管理机制,包括基础的Unix风格权限、ACL访问控制列表,以及与Apache Ranger集成的细粒度权限管理。
配置HDFS Mask
HDFS 支持设置文件创建时的默认权限掩码。它定义了当用户在HDFS 上创建新文件或目录时,系统自动从全权限中移除哪些权限位,从而决定新对象的初始权限。
配置参考
| 配置参数 | 默认值 | 描述 |
|---|---|---|
| fs.permissions.umask-mode | 022 | 默认值:022 含义: 文件创建时:全权限为0666(rw-rw-rw-),减去 umask 022(----w–w-)后,得到 0644(rw-r–r–)。 目录创建时:全权限为0777(rwxrwxrwx),减去 umask 022 后,得到 0755(rwxr-xr-x)。 因此,默认情况下,新文件对属主具有读写权限,对组和其他用户只有读权限;新目录对属主具有所有权限,对组和其他用户具有读和执行权限。 |
配置及效果
| umask值 | 新建文件权限 | 新建目录权限 | 说明 |
|---|---|---|---|
| 022(默认) | 0644 (rw-r–r–) | 0755 (rwxr-xr-x) | 组和其他用户不能写。 |
| 027 | 0640 (rw-r-----) | 0750 (rwxr-x—) | 其他用户无权访问。 |
| 077 | 0600 (rw-------) | 0700 (rwx------) | 仅属主可访问。 |
| 000 | 0666 (rw-rw-rw-) | 0777 (rwxrwxrwx) | 所有用户完全开放(不推荐)。 |
| 002 | 0664 (rw-rw-r–) | 0775 (rwxrwxr-x) | 组内用户可写。 |
配置HDFS ACL
HDFS 默认的文件权限模型基于传统的 POSIX 用户/组/其他(ugo)三组权限,每个文件或目录只能指定一个所有者、一个所属组,并为这三类身份分别设置读(r)、写(w)、执行(x)权限。这种模型在以下场景存在明显不足:
一个文件需要被多个不同组的用户共同访问,但又不希望将所有用户加入同一个组。
需要为某个特定用户(非所有者、非所属组成员)单独授予权限,而不影响其他用户。
需要在目录上设置继承权限,使得新创建的子文件和子目录自动获得指定的权限。
ACL(Access Control List,访问控制列表) 正是为了解决这些问题而引入的,它允许为任意用户和任意组单独设置权限,并且支持默认 ACL 实现权限继承。
HDFS支持两种ACL:
| 类型 | 作用对象 | 说明 |
|---|---|---|
| 访问ACL(Access ACL) | 文件或目录本身 | 控制对该文件/目录的访问权限。 |
| 默认ACL(Default ACL) | 仅目录 | 设置后,新创建的子文件/子目录会自动继承该 ACL(子文件继承为访问 ACL,子目录继承为访问 ACL + 默认 ACL)。 |
ACL的组成
每一条ACL 条目(entry)由三部分构成:类型、标识符、权限掩码。
格式示例:user:test:rwx、group:dev:r-x、mask::rwx、other::r--
| 类型 | 标识符 | 说明 |
|---|---|---|
| user | 用户名(可为空,表示属主) | 指定用户的权限。 |
| group | 组名(可为空,表示所属组) | 指定组的权限。 |
| mask | 无 | 有效权限掩码,限制所有命名用户、命名组和所属组的最大权限。 |
| other | 无 | 其他用户的权限。 |
默认ACL
默认ACL 仅能设置在目录上,用于定义该目录下新创建的子文件和子目录的初始权限。当在目录上设置默认ACL 后,该目录的访问 ACL 不会改变。
新创建的子文件:继承目录的默认ACL 作为自己的访问 ACL,且不继承默认 ACL(子文件没有默认 ACL)。
新创建的子目录:继承目录的默认ACL 作为自己的访问 ACL,同时也将该默认 ACL 完整复制为自己的默认 ACL,从而实现递归继承。
默认ACL 的格式:在普通 ACL 条目前加 default: 前缀,例如:
default:user::rwx default:user:test:rwx default:group::r-x default:mask::rwx default:other::r-- |
常用命令
查看ACL
hdfs dfs -getfacl [-R] <path>-R 递归查看子目录。
设置ACL
# 添加或修改条目 hdfs dfs -setfacl -m user:test:rwx /tmp/test # 删除条目 hdfs dfs -setfacl -x user:test/tmp/test # 设置默认 ACL hdfs dfs -setfacl -m default:user:test:rwx /tmp/test删除所有ACL
hdfs dfs -setfacl -b /tmp/test-b 会移除所有 ACL 条目(包括命名用户、命名组、默认 ACL),但保留 user::、group::、other:: 这三个基本条目,相当于将文件彻底恢复为传统权限模型。
Ranger插件
Apache Ranger是一个开源的安全框架,提供集中式的权限管理和安全策略框架。通过集成Ranger插件,HDFS可以实现更细粒度的权限控制。它作为HDFS 内部的授权拦截器,在用户访问 HDFS 时,按照 Ranger 中定义的策略进行授权检查,实现:
细粒度访问控制:精确到文件、目录、路径模糊匹配。
集中化管理:所有策略在Ranger Admin 统一维护。
实时生效:策略变更通过插件拉取或推送,无需重启HDFS 服务。
审计日志:记录所有授权成功/失败的信息,便于合规和安全分析。
工作流程
1、用户发起请求:用户通过HDFS 客户端(如 hdfs dfs -ls /data)向 NameNode 发送请求。
2、HDFS 内部授权拦截:NameNode 收到请求后,首先将请求交给 Ranger 插件鉴权;若Ranger未匹配到相关策略,则执行HDFS 原生的 POSIX 权限检查。
配置启用HDFS Ranger插件
1、登录翼MR Manager。
2、选择“集群服务 > Ranger > 插件启用”,集群服务名称HDFS项中,单击“启用”。
3、选择“集群服务 > HDFS > 配置管理”,单击“同步”,等待配置同步完成。
4、选择“集群服务 > HDFS > 角色实例 > NameNode”,勾选所有NameNode实例,选择”操作已选项> 滚动重启实例”,单击“确认”,单击“下一步”,等待重启完成。