HDFS权限管理篇
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.HDFS权限概述
HDFS文件权限用作每次访问HDFS文件或目录时尝试的授权检查。HDFS文件权限与通常在Linux或Unix文件系统中使用的权限非常相似。但HDFS域Linux和其他采用POSIX模型的操作系统之间也存在显著差异。 在Linux中,每个文件和目录都有一个用户和组。HDFS本身没有任何用户或组的概念,HDFS只是从底层的操作系统实体(例如在Linux文件系统中创建的用户和组)导出用户和组。 在Kerberos集群中,用户的Kerberos凭证决定客户端进程的身份,在默认的简单安全模式下,用户的身份由主机操作系统确定。 与Linux文件系统一样,可以为文件或目录的所有者,组的成员以及其他人分配单独的文件权限。可以像Linux中一样使用我们熟悉的r(读取文件并列出目录的内容),w(创建或删除文件或目录)和x(访问目录的子目录)权限。 可以使用八进制(例如"755","644"等)来设置文件的模式。需要注意的是,在Linux中,x表示执行文件的权限,但在HDFS中没有这样的概念。 当然,您也可以为文件或目录指定umask值。默认的umask值为"022",但是可以通过以下方式为"${HADOOP_HOME}/etc/hadoop/core-site.xml"文件进行修改。 <property> <name>fs.permissions.umask-mode</name> <value>037</value> <description>指定HDFS集群的umask值,默认值为022(创建的文件(目录)权限即为"755"),在Linux中,x表示执行文件权限,而在HDFS中没有这样的概念,尽管你可以为该文件添加x权限。</description> </property> 温馨提示:【umask值的计算方法,公式为:"实际权限 = max_permnishu & (~umask)"】 本案例中我配置的umask值为"037",对应二进制为"000 011 111",而"(~umask)"则对应为"111 100 000",因此创建文件的默认权限应该为"740",因此计算过程如下所示: 111 111 111 & ~(000 011 111) ---------------- 111 111 111 & 111 100 000 --------------- 111 100 000
二.HDFS权限相关的配置参数
1>.配置HDFS权限
可以通过在"${HADOOP_HOME}/etc/hadoop/hdfs-site.xml"配置文件中将参数"dfs.permissions.enabled"的值设置为ture来配置HDFS权限。 如下所示,有此参数的默认值为true,因此权限检查功能已经打开,故HDFS不需要再执行其他任何操作来进行权限检查。 <property> <name>dfs.permissions.enabled</name> <value>true</value> <description>如果为"true",则在HDFS中启用权限检查;如果为"false",则关闭权限检查;默认值为"true"。</description> </property>
2>.配置HDFS超级用户
与Linux文件系统不同,主机用户root不是HDFS的超级用户。超级用户是启动NameNode的用户,通常是操作系统用户(如"root","hdfs","hadoop"等),因此用户(如"root","hdfs","hadoop"等)通常是HDFS的超级用户。 可以通过在"${HADOOP_HOME}/etc/hadoop/hdfs-site.xml"配置文件中设置"dfs.permissions.superusergroup"参数来配置超级用户组(改参数仅能被设置一次)。 <property> <name>dfs.permissions.superusergroup</name> <value>admin</value> <description> 此参数指定包含HDFS超级用户的组(可以任意指定,分配给该组的任何用户都将是HDFS超级用户),默认值为"supergroup",我这里自定义超级用户的组名为"admin"。 需要注意的是,该组名只能被设置一次,当对NameNode节点进行格式化后在修改改参数并不生效!如果你想要的强行生效只能重新格式化NameNode节点。幸运的是,我们可以通过"hdfs dfs -chown"命令来修改某个文件或目录的所属者。 </description> </property>
3>.HDFS如何执行权限检查
客户端的身份由客户端(用户)的名称和它所属的组的列表组成。HDFS执行文件权限检查,以确保用户是具有适当组权限的所有者或组列表的成员。如果两者都不属于,HDFS检查用户的"其他"文件权限,如果该检查也失败,则拒绝客户端访问HDFS的请求。 如前所述,在默认的simple操作模式下,由操作系统用户名来确定客户端进程ID,而在Kerberos模式下,通过Kerberos凭据确定客户端身份。 根据运行集群的模式,一旦HDFS确定了用户的身份,它会使用"${HADOOP_HOME}/etc/hadoop/core-site.xml"文件中的"hadoop.security.group.mapping"属性来确定用户所属的组列表。NameNode执行用户到组的映射。 如果组不在Linux服务器上,仅在公司LDAP服务器上,则必须配置名为"org.apache.hadoop.security.LdapGroupsMapping"的备用组映射服务,而不是默认组映射实现。 博主推荐阅读: https://hadoop.apache.org/docs/r2.10.0/hadoop-project-dist/hadoop-common/GroupsMapping.html
三.更改HDFS集群中文件属性的常用命令
1>.chmod命令
chmod命令用于更改HDFS集群中文件的权限。这类似于shell的chmod命令,但有一些例外(使用"man chmod",你会发现Linux系统支持的参数更多)。
[root@hadoop101.yinzhengjie.com ~]# hdfs dfs -help chmod -chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH... : Changes permissions of a file. This works similar to the shell's chmod command with a few exceptions. -R modifies the files recursively. This is the only option currently supported. <MODE> Mode is the same as mode used for the shell's command. The only letters recognized are 'rwxXt', e.g. +t,a+r,g-w,+rwx,o=r. <OCTALMODE> Mode specifed in 3 or 4 digits. If 4 digits, the first may be 1 or 0 to turn the sticky bit on or off, respectively. Unlike the shell command, it is not possible to specify only part of the mode, e.g. 754 is same as u=rwx,g=rx,o=r. If none of 'augo' is specified, 'a' is assumed and unlike the shell command, no umask is applied. [root@hadoop101.yinzhengjie.com ~]#