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
),记录访问行为。