前言

本文隶属于专栏《1000个问题搞定大数据技术体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!

本专栏目录结构和参考文献请见1000个问题搞定大数据技术体系

正文

概述

Hadoop分布式文件系统实现了一个和 POSIX 系统类似的文件和目录的权限模式。

每个文件和目录有一个所有者(Owner)和一个组(Group)。

文件或目录对其所有者、同组的其他用户以及所有其他用户分别有着不同的权限

  1. 对文件而言,当读取这个文件时需要有r权限,当写入或者追加到文件时需要有w权限。
  2. 对目录而言,当列出目录内容时需要具有r权限,当新建或删除子文件或子目录时需要有权限,当访问目录的子节点时需要有x权限。
  3. 不同于 POSIX 模型,为了简单起见,此处没有目录的 sticky、 setuid 或 setgid 位。

总的来说文件或目录的权限即为它的模式(Mode)。

HDFS采用了UNIX表示和显示模式的习惯,包括使用八进制数来表示权限。

当新建一个文件或目录,它的所有者即客户进程的用户,它的所属组为父目录的组(BSD的规定)。

每个访问HDFS的用户进程的标识分为两部分,分别为用户名和组名列表。

每次用户进程访问一个文件或目录 ,HDFS都要对其进行权限检査

  1. 如果用户 即 目录的所有者,则检查所有者的访问权限。
  2. 如果 目录 关联的组在组名列表中出现,则检查组用户的访问权限。
  3. 否则检查 目录 其他用户的访问权限。

如果权限检査失败,则客户的操作会失败。

用户身份

在目前版本中,客户端用户身份是通过宿主操作系统给出的,对类UNIX系统来说:

  1. 用户名等于 whoami
  2. 组列表等于 bash -c groups

期望用前面提到的方式来防止一个用户假冒另一个用户是不现实的。

这种用户身份识别机制结合权限模型允许一个协作团体以一种有组织的形式共享文件系统中的资源。

不管怎样,用户身份机制对HDFS本身来说只是外部特性。HDFS并不提供创建用户身份、创建组或处理用户凭证等功能。

系统的实现

每次文件或目录操作都传递完整的路径名给 NameNode,每一个操作都会对此路径做权限检査。

客户框架会隐式地将用户身份与 NameNode 的连接关联起来,从而减少改变现有客户端API的需求。

经常会有这种情况,当对一个文件的某一操作成功后,之后同样的操作却失败,这是因为文件或路径上的某些目录已经不复存在了。

例如,客户端先开始读一个文件,它向 NameNode发出一个请求以获取文件第一个数据块的位置,但接下来获取其他数据块的第二个请求可能会失败。

另外,删除一个文件并不会撤销客户端已经获得的对文件数据块的访问权限。

而权限管理能使客户端对一个文件的访问许可在两次请求之间被收回。权限的改变并不会撤销当前客户端对文件数据块的访问许可。

MapReduce 框架通过传递字符串来指派用户身份,没有做其他特别的安全方面的考虑。

文件或目录的所有者和组属性是以字符串的形式保存的,而不是像传统的UNIX方式转换为用户和组的数字ID。

超级用户

超级用户即运行 NameNode 进程的用户

宽泛地讲,如果启动了 NameNode,启动者即为超级用户。

超级用户可以做任何事情,因为超级用户能够通过所有的权限检査。

没有永久记号来保留谁过去为超级用户。当 NameNode 开始运行时,进程自动判断谁现在为超级用户。

HDFS的超级用户不一定非得为 NameNode 主机上的超级用户,也不需要所有的集群的超级用户都为一个。

同样地,在个人工作站上运行 HDFS 的实验者,无须任何配置即已方便地成为他的部署实例的超级用户。

另外,管理员可以用配置参数指定一组特定的用户,如果做了设定,这个组的成员也会成为超级用户。

Web服务器

Web服务器的身份为一个可配置参数。

NameNode 并没有真实用户的概念,但 Web 服务器表现得就像它具有管理员选定的用户的身份(用户名和组)一样。

除非这个选定的身份是超级用户,否则会有名字空间中的一部分对 Web 服务器来说不可见。

在线升级

如果集群在0.19版本的数据集(FSImage)上启动,所有的文件和目录都有所有者 O、组 G 和模式 M,此处 O 和 G 分别为超级用户的用户标识和组名,M 为一个配置参数

配置参数

dfs.permissions=true

如果为true,则打开前文所述的权限系统。

如果为 false,权限检查即为关闭的,但是其他行为没有改变。这个配置参数的改变并不改变文件或目录的模式、所有者和组等信息。

不管权限模式是开还是关, chmod、 chgrp 和 chown总是会检查权限。

这些命令只有在权限检査背景下オ有用,所以不会有兼容性问题。

这样,就能让管理员在打开常规的权限检査之前可以可靠地设置文件的所有者和权限。

dfs.web.ugi=webuser,webgroup

Web服务器使用的用户名。

如果将这个参数设置为超级用户的名称,则所有 Web 客户就可以看到所有的信息。

如果将这个参数设置为一个不使用的用户,则 Web 客户就只能访问到 other 权限可访问的资源了。

额外的组可以加在后面,形成一个用逗号分隔的列表。

dfs.permissions.supergroup=supergroup

超级用户的组名。

dfs.upgrade.permission=777

升级时的初始模式。

文件永远不会被设置x权限。在配置文件中,可以使用十进制数

dfs.umask=002

umask参数在创建文件和目录时使用。

在配置文件中,可以使用十进制数18。

上一篇 下一篇