HDFS的权限管理兼容POSIX标准,采用“用户-组-其他”三级权限模型,支持传统POSIX权限(读、写、执行)和**ACL(访问控制列表)**细粒度权限控制。其核心配置通过Hadoop的core-site.xml和hdfs-site.xml文件完成,确保权限机制生效。
core-site.xml配置用户映射(将Linux用户映射到HDFS UID)和权限检查:
<property>
<name>hadoop.security.uid.mapping</name>
<value>org.apache.hadoop.security.uid.mapping.SimpleUIDMapping</value>
</property>
<property>
<name>hadoop.security.uid.mapping.file</name>
<value>/etc/hadoop/conf/users.map</value>
</property>
<property>
<name>hadoop.security.authentication</name>
<value>simple</value> <!-- 生产环境建议使用kerberos -->
</property>
<property>
<name>hadoop.security.authorization</name>
<value>true</value>
</property>
其中users.map文件需定义Linux用户与HDFS UID的映射(如hdfs 1000,hadoop 1001)。
hdfs-site.xml启用HDFS权限检查和ACL功能:
<property>
<name>dfs.permissions.enabled</name>
<value>true</value> <!-- 启用权限检查 -->
</property>
<property>
<name>dfs.namenode.acls.enabled</name>
<value>true</value> <!-- 启用ACL -->
</property>
<property>
<name>dfs.datanode.acls.enabled</name>
<value>true</value> <!-- DataNode支持ACL -->
</property>
<property>
<name>dfs.permissions.umask-mode</name>
<value>022</value> <!-- 默认umask(创建文件权限为644,目录为755) -->
</property>
修改后需重启HDFS集群使配置生效。
使用hdfs dfs -ls命令查看文件/目录的权限、所有者和组:
hdfs dfs -ls /user/hadoop/example.txt
# 输出示例:-rw-r--r-- 3 hadoop hadoop 12345 2025-10-01 10:00 /user/hadoop/example.txt
# 解释:所有者(hadoop)有读写权限,组和其他用户有读权限
使用hdfs dfs -chmod命令修改权限(格式:[ugoa][+-=][rwx]或八进制数):
# 给所有者添加执行权限
hdfs dfs -chmod u+x /user/hadoop/example.txt
# 设置目录权限为755(所有者rwx,组和其他r-x)
hdfs dfs -chmod 755 /user/hadoop/testdir
# 递归修改目录及其子项权限
hdfs dfs -chmod -R 755 /user/hadoop
使用hdfs dfs -chown(修改所有者)或hdfs dfs -chgrp(修改所属组)命令:
# 将文件所有者改为hadoop用户,组改为hadoop组
hdfs dfs -chown hadoop:hadoop /user/hadoop/example.txt
# 仅修改所属组
hdfs dfs -chgrp hadoop /user/hadoop/example.txt
# 递归修改目录及其子项所有权
hdfs dfs -chown -R hadoop:hadoop /user/hadoop
ACL允许为特定用户或组设置额外权限,突破传统POSIX权限的限制。
确保hdfs-site.xml中dfs.namenode.acls.enabled=true,并重启HDFS。
使用hdfs dfs -setfacl命令添加权限规则:
# 给用户alice添加对目录的读写执行权限
hdfs dfs -setfacl -m user:alice:rwx /user/hadoop/testdir
# 给组dev组添加对文件的读权限
hdfs dfs -setfacl -m group:dev:r-- /user/hadoop/example.txt
# 删除用户bob的所有权限
hdfs dfs -setfacl -x user:bob /user/hadoop/example.txt
# 删除所有ACL规则(恢复为传统权限)
hdfs dfs -setfacl -b /user/hadoop/example.txt
使用hdfs dfs -getfacl命令查看详细权限:
hdfs dfs -getfacl /user/hadoop/testdir
# 输出示例:
# user::rwx
# user:alice:rwx
# group::r-x
# mask::rwx
# other::r-x
# default:user::rwx
# default:group::r-x
# default:other::r-x
default规则表示子项继承的权限。
HDFS目录支持权限继承,子目录和文件会自动继承父目录的权限。通过+i选项开启继承:
# 开启目录的权限继承(后续创建的子项会继承父目录权限)
hdfs dfs -chmod +i /user/hadoop/parentdir
# 关闭继承(需递归修改现有子项权限)
hdfs dfs -chmod -i /user/hadoop/parentdir
生产环境中,建议使用Kerberos进行身份认证,确保只有合法用户能访问HDFS。
在core-site.xml中启用Kerberos认证:
<property>
<name>hadoop.security.authentication</name>
<value>kerberos</value>
</property>
<property>
<name>hadoop.security.authorization</name>
<value>true</value>
</property>
使用kinit命令获取票据(需提前配置krb5.conf和keytab文件):
kinit hadoop@EXAMPLE.COM # 替换为实际用户名和域名
klist # 查看票据有效期
票据过期后需重新获取(kinit -R刷新,kinit重新获取)。
dfs.permissions.enabled=true,否则权限设置无效。dfs.permissions.umask-mode调整默认权限(如022对应文件644、目录755)。hdfs-site.xml中配置审计日志(dfs.namenode.audit.log.maxsize、dfs.namenode.audit.log.rotation.period),记录访问行为。