在 Linux 中管理特殊权限与 umask

LinuxBeginner
立即练习

介绍

在本实验中,你将学习如何在 Linux 环境中管理特殊权限和 umask 设置,从而确保协作工作区的安全性。你将探索如何控制新创建文件的默认权限,以及如何利用特殊权限位(如粘滞位)来防止共享目录中的文件被其他用户误删。

你将首先准备一个模拟的共享环境,包括创建一个新的用户组和目录,并分配相应的属主和权限。接着,你将修改 umask 值以强制执行更严格的默认权限,并通过创建新文件来验证其效果。最后,你将在共享目录上设置粘滞位并确认其生效,确保在共享空间内只有文件所有者才能删除自己的文件。

这是一个引导实验,提供分步指导以帮助你学习和练习。请仔细遵循说明完成每个步骤并获得实践经验。历史数据表明,这是一个初学者级别的实验,完成率为 100%。它在学习者中获得了 99% 的好评率。

准备环境并访问目录

在这一步中,你将为管理特殊文件权限准备环境。这包括创建一个专门的目录,用于模拟研究团队的共享工作区。你将创建一个新的用户组、一个目录,然后为其分配适当的属主和权限。所有操作都将在你的项目目录 ~/project 中进行。

首先,让我们创建一个名为 research 的新组。该组代表有权访问共享目录的团队成员。使用 sudo groupadd 命令来创建它。使用 sudo 是因为创建组属于行政管理任务。

sudo groupadd research

接下来,在 ~/project 目录下创建一个名为 RandD 的新目录。这将是我们本实验的主要工作目录。

mkdir ~/project/RandD

现在,将新创建的 RandD 目录的所属组更改为 research 组。chgrp 命令专门用于此目的。

sudo chgrp research ~/project/RandD

为了确保只有所有者(labex 用户)和 research 组的成员可以访问此目录,我们需要设置其权限。我们将使用带有数字代码 770chmod 命令。此代码授予用户和组读取、写入和执行权限(rwx,即 4+2+1=7),而对其他用户不授予任何权限(---,即 0)。

chmod 770 ~/project/RandD

你可以使用 ls -ld 命令验证目录的权限和属主信息。-l 选项提供详细列表格式,-d 选项则仅列出目录本身,而不是其内容。

ls -ld ~/project/RandD

你应该会看到类似以下的输出,确认了权限(drwxrwx---)、所有者(labex)和所属组(research)。

drwxrwx--- 2 labex research 4096 Dec 12 10:30 /home/labex/project/RandD

最后,将当前位置切换到 RandD 目录。你将在接下来的步骤中在此执行任务。

cd ~/project/RandD

你现在已成功设置好工作环境。

使用 umask 027 限制默认文件权限

在这一步中,你将学习如何使用 umask 命令控制新创建文件的默认权限。当你创建一个文件时,系统会为其分配一组默认权限。通常这些默认值过于宽松,例如允许「其他」用户读取你的文件。在像 RandD 这样安全的目录中,我们需要对此进行限制。

umask(用户文件创建模式掩码)命令指定了在创建新文件或目录时,应从基础权限中移除哪些权限。

  • 对于文件,基础权限是 666 (rw-rw-rw-)。
  • 对于目录,基础权限是 777 (rwxrwxrwx)。

我们将把 umask 设置为 027。这个值告诉系统移除以下权限:

  • 用户(所有者): 0 - 不移除任何权限。
  • 组: 2 - 移除写入权限。
  • 其他: 7 (4+2+1) - 移除读取、写入和执行权限。

这意味着任何新创建的文件权限将为 666 - 027 = 640 (rw-r-----),任何新目录的权限将为 777 - 027 = 750 (rwxr-x---)。

首先,在终端提示符下输入 umask 027,更改当前终端会话的默认权限。请确保你仍处于 ~/project/RandD 目录中。

umask 027

接下来,通过单独输入该命令来验证 umask 的新值。

umask

命令应显示新的 umask 值。前导零表示掩码中不包含特殊权限(如你稍后将学到的粘滞位)。

027

你现在已成功更改了当前会话的默认文件创建权限。在下一步中,你将创建一个文件来观察新 umask 的效果。

创建文件并验证新的 umask 权限

在这一步中,你将通过创建一个文件来实践新的 umask 设置。这将演示你上一步配置的默认权限是如何自动应用的,从而保护你的新文档免受未经授权的访问。你应当仍处于 ~/project/RandD 目录中。

让我们使用 touch 命令创建一个名为 schedule.odt 的新空文件。touch 命令是创建空文件或更新现有文件时间戳的简便方法。

touch schedule.odt

文件创建后,你需要验证其权限。使用 ls -l 命令显示 schedule.odt 的详细信息。

ls -l schedule.odt

你将看到类似以下的输出。最重要的部分是第一列,它显示了文件的权限。

-rw-r----- 1 labex research 0 Dec 12 10:35 schedule.odt

让我们拆解权限字符串 -rw-r-----

  • 第一个字符 - 表示这是一个普通文件。
  • 接下来的三个字符 rw-用户(所有者)的权限,即读取和写入。这对应数字值 6
  • 再接下来的三个字符 r--的权限,即只读。这对应数字值 4
  • 最后三个字符 ---其他用户的权限,意味着没有任何权限。这对应数字值 0

这些权限(640)是将 umask027 应用于系统默认文件权限 666 的直接结果。正如我们预期的那样,umask 成功移除了组的写入权限以及其他用户的所有权限。

使用 chmod 1771 在目录上设置粘滞位

在这一步中,你将解决共享目录中的一个常见问题。目前,research 组的任何成员都可以删除 ~/project/RandD 目录下的任何文件,甚至是其他用户创建的文件。这是因为目录上的写入权限允许创建和删除文件。为了防止意外或恶意的删除行为,你将设置一种称为「粘滞位」(sticky bit)的特殊权限。

当粘滞位应用于目录时,它会修改这种行为。它确保目录中的文件只能由文件所有者、目录所有者或 root 用户删除或重命名。这对于像 RandD 这样的协作环境非常理想。

你将使用带有四位八进制数字的 chmod 命令来设置粘滞位。命令为 chmod 1771 RandD

  • 第一位数字 1 代表粘滞位。
  • 后三位数字 771 设置标准权限:用户为 rwx,组为 rwx,其他用户为 --x

首先,你需要进入 RandD 的父目录才能修改其权限。由于你当前在 ~/project/RandD 中,请使用 cd .. 命令向上移动一级到 ~/project

cd ..

现在,在 ~/project 目录中,对 RandD 目录应用粘滞位。

chmod 1771 RandD

粘滞位现在已在 RandD 目录上设置完成。在最后一步中,你将使用 ls -l 命令查看此特殊权限的显示方式并验证其效果。

使用 ls -l 验证粘滞位权限

在最后一步中,你将验证粘滞位是否已正确应用于 RandD 目录。ls -l 命令为粘滞位等特殊权限提供了视觉指示。你应当仍处于 ~/project 目录中。

在终端提示符下,输入 ls -ld RandD 命令以查看目录本身的权限。

ls -ld RandD

仔细检查输出。它看起来应该类似于:

drwxrwx--t 2 labex research 4096 Dec 12 10:45 RandD

关键的变化在于权限字符串:drwxrwx--t

  • d 表示这是一个目录。
  • rwx 显示用户(labex)拥有全部权限。
  • 第二个 rwx 显示 research 组拥有全部权限。
  • 最后一部分 --t 是显示粘滞位的地方。t 替换了原本属于「其他用户」的执行权限(x)。小写的 t 表示粘滞位和「其他用户」的执行权限都已设置。这证实了你的 chmod 1771 命令已成功执行。

恭喜!你已成功配置了一个共享目录,通过 umask 设置了安全的默认权限,并通过设置粘滞位保护了其内容免受未经授权的删除。

总结

在本实验中,你学习了如何为用户组准备一个安全的共享目录。这包括使用 groupadd 创建新组,创建目录,然后使用 chgrpchmod 分配正确的组属主和限制性权限(770)。你还练习了通过设置特定的 umask 值(027)来操作新创建文件和目录的默认权限,并通过创建新文件并检查其权限来验证了效果。

此外,你还通过使用 chmod 1771 命令在共享目录上应用粘滞位,探索了特殊权限。你了解到粘滞位对于协作环境至关重要,因为它确保用户只能删除或重命名自己拥有的文件,从而防止他人作品被意外或恶意删除。最后,你通过使用 ls -l 并识别目录权限字符串中的 t,验证了粘滞位已正确应用。