介绍
零售商的分析员需要读取商品数据集,但不应有权修改它。文件已经存在,数据块也健康,其他用户却仍可能收到 Permission denied。存储健康与授权回答的是不同问题:数据是否可用,以及这个身份是否有权访问?
HDFS 使用所有者、所属组和权限位来决定基本访问权限。你将以普通所有者 labex 的身份操作,通过 bigdata 组向预配置的 analyst 身份共享数据集。另一个普通身份 nobody 代表该组之外的用户。NameNode 以 hdfs 身份运行;你并不是 HDFS 超级用户。
你将读取现有权限,建立组只读访问,并复现目录遍历问题。这些检查使用 HDFS 权限,而不是本地 Linux 文件权限。本环境是采用简单认证的教学环境,并不演示 Kerberos 等安全的生产身份认证方式。所有实验数据独立于之前的实验。请使用终端完成操作。
读懂访问规则
在这一步中,你将辨认一个私有数据集的所有者、所属组和访问模式。
进入本地项目目录:
cd /home/labex/project
HDFS 的 -ls -d 选项列出目录条目本身,而不是目录内容。同时查看目录和文件:
hdfs dfs -ls -d /user/labex/basic-permissions/team /user/labex/basic-permissions/team/products.txt
重要字段应包含以下模式和身份;大小和时间戳会变化:
drwx------ ... labex labex ... /user/labex/basic-permissions/team
-rw------- ... labex labex ... /user/labex/basic-permissions/team/products.txt
第一个字符描述对象类型:d 表示目录,- 表示文件。接下来的九个字符每三个一组,分别对应所有者(owner)、所属组(group)和其他用户(other)。r 表示读取,w 表示写入,x 表示执行;对于目录,x 表示遍历。短横线表示没有相应权限。
对于文件,读取权限允许读取内容,写入权限允许修改内容。对于目录,读取权限允许列出名称,写入权限配合遍历权限控制创建或删除条目,执行权限则允许穿过该目录访问指定的子项。因此,读取文件既需要文件本身的权限,也需要路径沿途目录上的权限。
当前目录模式给予 labex 完整访问权限,其他人没有访问权限。文件给予 labex 读写权限。确认所有者能够读取它:
hdfs dfs -cat /user/labex/basic-permissions/team/products.txt
预期文本如下:
notebook pen
folder notebook
使用本地输出重定向保存初始列表:
hdfs dfs -ls -d /user/labex/basic-permissions/team /user/labex/basic-permissions/team/products.txt > /home/labex/project/output/initial-permissions.txt
你已经辨认出这是一个私有文件,而不是缺失或损坏的文件。接下来只向目标组授予它所需的访问权限。
向组提供只读共享
在这一步中,你将授予 bigdata 组目录遍历和文件读取权限,再测试分析员的访问。
预配置的 labex 和 analyst 用户都是 bigdata 组的成员。HDFS 的 -chgrp 用于修改对象的所属组。作为所有者,同时又是新组的成员,你无需成为 HDFS 超级用户就能设置所属组:
hdfs dfs -chgrp bigdata /user/labex/basic-permissions/team /user/labex/basic-permissions/team/products.txt
使用 -chmod 设置模式。每个数字概括一组权限:r=4、w=2、x=1。分别将所有者、所属组和其他用户所需的权限值相加:
| 模式 | 所有者 | 所属组 | 其他用户 |
|---|---|---|---|
目录上的 750 |
读取、写入、遍历 | 读取和遍历 | 无访问权限 |
文件上的 640 |
读取和写入 | 读取 | 无访问权限 |
应用目录模式:
hdfs dfs -chmod 750 /user/labex/basic-permissions/team
应用文件模式:
hdfs dfs -chmod 640 /user/labex/basic-permissions/team/products.txt
现在测试实际的分析员身份。sudo -u analyst 仅将这条命令以预配置的普通用户身份运行;HDFS 客户端的绝对路径选择相同工具。这是在测试另一个身份,并不是让你以管理员身份进行日常文件操作:
sudo -u analyst /usr/local/bin/hdfs dfs -cat /user/labex/basic-permissions/team/products.txt
应该显示相同的两行商品文本。该组能够遍历目录并读取文件。
也要测试写入。如果权限允许,-appendToFile 会将本地文件内容追加到 HDFS 文件中。/tmp 下已提供的只读测试文件包含一个额外标签,该标签不能进入可信数据集。它位于私有的本地主目录之外,因此普通测试身份能够读取它;这样可以单独测试 HDFS 写权限。下一条命令预期会失败。
sudo -u analyst /usr/local/bin/hdfs dfs -appendToFile /tmp/labex-hdfs-write-probe.txt /user/labex/basic-permissions/team/products.txt
查找 Permission denied 以及表示写访问的提示。失败正是预期结果:分析员可以读取,但不能追加。这次有意触发的拒绝访问出现非零退出状态是正常的;请继续下一步。如果让所有人都能写文件,就会失去这层保护。
诊断目录遍历问题
在这一步中,你将改变一个权限位,观察由此产生的访问失败,再只恢复所需的访问权限。
文件目前允许组读取。如果目录让组成员列出名称,却不再允许他们遍历进入目录,会发生什么?先预测结果。740 保留所有者权限和组读取权限,同时移除组的 x 权限:
hdfs dfs -chmod 740 /user/labex/basic-permissions/team
以同一个分析员身份读取同一个文件。下一条命令预期会失败。
sudo -u analyst /usr/local/bin/hdfs dfs -cat /user/labex/basic-permissions/team/products.txt
拒绝访问的消息应该指向目录缺少遍历权限。给文件增加更多读取权限不能解决它:首先必须能沿路径遍历。将目录恢复为练习过的模式,重新赋予组 x 位:
hdfs dfs -chmod 750 /user/labex/basic-permissions/team
确认分析员又能读取:
sudo -u analyst /usr/local/bin/hdfs dfs -cat /user/labex/basic-permissions/team/products.txt
应该再次显示原始的两行。最后,测试共享组之外的普通身份。nobody 仅用作本实验中的无关身份。下一条命令预期会失败。
sudo -u nobody /usr/local/bin/hdfs dfs -cat /user/labex/basic-permissions/team/products.txt
拒绝访问证明组共享没有将数据集公开。保存最终列表:
hdfs dfs -ls -d /user/labex/basic-permissions/team /user/labex/basic-permissions/team/products.txt > /home/labex/project/output/final-permissions.txt
读取结果:
cat /home/labex/project/output/final-permissions.txt
目录应显示 drwxr-x---,文件应显示 -rw-r-----,所有者为 labex,所属组为 bigdata。将它们的含义与初始私有模式比较。你向特定组授予了最少的必要权限,没有关闭权限检查,也没有使用 777。
总结
你读懂了 HDFS 所有者、所属组和其他用户的权限模式,设置了共享组,并为目录和文件使用了不同模式。真实身份检查确认:分析员可以读但不能写,无关用户则不能读取。
通过移除并恢复目录遍历权限,你理解了为什么一个可读文件仍可能无法通过其路径访问。下一个挑战将要求你独立定位并修复类似的共享问题。



