你是否曾经发现自己处于一个需要在Linux系统上执行任务的情况,却只遭遇到令人沮丧的访问拒绝?那么,和那些困扰说再见,欢迎来到Linux中特殊权限的世界!
本教程是你掌握Linux中特殊权限——粘着位、设置用户ID(SUID)和设置组ID(SGID)等细节的门票。这些特殊权限提供了更高级别的安全控制。
继续阅读,并以精确和自信地方式安全管理你的文件!
先决条件
在你深入了解Linux中特殊权限的细节之前,请确保你有一台Linux机器。本教程使用Ubuntu 22.04 LTS(Jammy Jellyfish)进行实践演示。
在Linux中以特殊权限执行文件(SUID)
Linux文件权限通常根据用户和他们所在组的权限确定用户对文件的读取、写入或执行能力。然而,有些情况下,用户必须以文件所有者的权限而不是自己的权限来执行文件。
例如,考虑一个只有根用户可以运行的程序,但需要一个普通用户来执行特定任务。在这种情况下,SUID 变得非常宝贵。
要查看如何设置 SUID 权限,请按照以下步骤操作:
1. 打开终端并执行以下命令来创建一个名为 A-user
(任意)的用户(useradd
),并设置密码(passwd
)。

2. 接下来,运行下面的 stat
命令来查看 cat
命令的现有权限。
请注意下面的访问权限,因为您稍后需要进行比较:
- 0755 – 允许以其所有者的权限执行文件,从而在运行文件时为非特权用户提供了提升的特权。
- -rwxr-xr-x – 将权限设置为所有者可以读取、写入和执行文件(rwx),而组成员和其他用户可以读取和执行文件(r-x 和 r-x)。

cat
command3. 现在,运行下面的 chmod
命令,该命令不提供输出,但在 cat
命令上设置 SUID 位。
此命令允许 cat
命令以文件所有者的权限而不是运行命令的用户的权限运行。
? 注意,使用SUID应谨慎,如果不正确实施,可能会引入安全风险。确保只将SUID应用于受信任的命令和文件。
4. 设置了SUID位之后,运行以下stat
命令,通过重新检查cat
命令的权限来验证SUID位。
如果成功,您将看到以下内容,然后您将与第二步中记录的信息进行比较:

5. 运行下面的cat
命令,测试当前登录用户对访问/etc/shadow
文件的权限。该文件是存储加密用户密码和相关信息的关键系统文件,只有根用户可以访问。
默认情况下,cat
命令允许您查看Linux中文件的内容。但是,并非对每个文件都适用这种行为。
由于当前用户没有访问该文件的权限,因此会出现下面的消息。

6. 现在,运行以下每个命令以切换 (su
) 到新用户 (A-user
),然后尝试再次访问 /etc/shadow
文件。
这次,cat
命令将以文件所有者的权限运行(通常是 root),而不是执行命令的用户的权限。
由于您临时授予 A-user 读取该文件内容的权限,您将获得如下输出。

7. 出于安全原因,执行以下命令以从当前用户(A-user)退出并将 cat
命令的权限恢复到其原始状态。

cat
command8. 最后,运行以下命令以验证 SUID 位是否已被移除。
注意 SUID 位 4 和 s 不再出现在访问权限中。

在 Linux 目录中启用协作工作流(SGID)
通过 SUID 在 Linux 中执行具有特殊权限的文件无疑效果良好。但是,如果您的目标是协作工作流,多个用户共同参与项目,该怎么办呢?通常,您必须确保新创建的文件继承父目录的组所有权。
在面对这种情况时,SGID 成为了改变游戏规则的关键。这一强大功能简化了共享资源的管理,并增强了 Linux 环境中基于组的工作流。
为了查看SGID的工作原理,您将创建一个组,将用户添加到该组,对一个目录设置SGID权限,并按照以下方式测试其功能:
1. 执行以下命令以登录为root用户并创建一个名为demo
(任意)的新组。该组将用于测试SGID功能。
这些命令不会执行

2. 接下来,运行以下命令创建两个用户(userA
和userB
),用于模拟协作环境。

3. 在创建新用户后,运行下面的usermod
命令,该命令不会在终端产生输出,但会将用户(userA
和userB
)添加到demo
组。
4. 现在,执行以下每个命令,创建一个名为/demo-dir
(任意)的目录,并将目录的用户和组所有权分别设置为userA
和demo
。
? 当成功时,这些命令不会产生输出,这适用于本教程的所有步骤。
5. 接下来,运行以下ls
命令以查看/demo-dir
目录的权限。
下面的输出验证了目录/demo-dir的用户设置为userA,组设置为demo。

6. 验证权限后,运行以下chmod
命令来设置/demo-dir/
目录上的SGID位,如下所示:
g+s
– Set the SGID bit on the/demo-dir/
directory.o-rwx
– Remove all permissions (read, write, execute) for others.u+rwx
– Grant read, write, and execute permissions to the owner.g+rwx
– Grant read, write, and execute permissions to the group.
7. 设置SGID后,运行以下命令来验证/demo-dir
目录的权限。
如果成功,你将看到SGID位已设置,在八进制模式权限之前表示为数字2
,在组所有者执行(x
)权限位置表示为s
(rws
)。

8. 接下来,运行每个命令来为userA
创建一个/home
目录。
9. 执行以下命令切换(su
)到userA
并在/demo-dir
目录中创建一个名为textA.txt
(任意)的文件。
这些命令没有输出(这适用于本教程中的所有步骤),但你将在下一步验证文件的权限。
10. 运行下面的ls
命令查看textA.txt
文件的权限。
以下是textA.txt文件的组所有者是demo,这是创建者userA的主要组。
demo组的成员可以读取和修改该文件,而其他人只能读取它。 为了确保/demo-dir目录中的新文件继承目录的组所有权,应在目录上设置SGID位,您将在以下步骤中介绍。

11. 现在,调用以下命令以退出
当前用户(userA)并在/demo-dir
目录中设置SGID位

12. 设置SGID后,运行下面的命令验证您添加到/demo-dir
目录的SGID位。
如下所示,您将注意到已添加SUID位2,并且在组所有者执行位置有一个s。 此输出确认已成功将SGID位设置为/demo-dir目录。

13. 接下来,切换回userA
并在/demo-dir
目录中创建另一个名为testA.txt
(任意)的文件。
14. 创建后,运行下面的ls
命令以检查新文件(testA.txt
)的所有权。
如果SGID按预期工作,输出显示,虽然用户A是所有者,但由于在/demo-dir目录上设置了SGID位,所以组所有权是演示。

15.现在,为了进一步测试SGID功能,为用户B
创建一个/home
目录。
16.切换到用户B
并在同一个/demo-dir
目录中创建一个名为testB.txt
(任意)的文件。

17.查看(ls
)新文件(testB.txt
)的信息。
检查testB.txt文件的所有权。

保护目录中的文件(粘性位)
在Linux目录中启用协作工作流程可促进团队合作和无缝协作。但是,当您必须为有效管理文件建立安全环境时,粘性位权限将派上用场。
通过设置粘性位,实质上是将“城堡的钥匙”交给了文件所有者、目录所有者或根用户。这样做可以确保只有他们有权删除或重命名目录中的文件,为敏感数据提供了额外的保障。
要设置粘性位权限,您必须首先执行以下步骤创建一个共享目录:
1. 以 root 用户身份登录并创建一个(共享的)目录 (mkdir
), 多个用户可以在其中创建文件。
2. 然后,运行以下命令更改/shared-dir
目录的权限,以授予所有人写权限。
在1777
中,第一个数字 (1
) 设置粘附位(Sticky Bit),而其余的 (777
) 使目录对所有人可读、可写和可执行。
以下是 Linux 系统中粘附位的特性或属性:
Feature | Function |
Directory Protection | When the Sticky Bit is set on a directory, it allows only the owner of a file within that directory to delete or rename their own files. Other users, even if they have write permissions to the directory, cannot delete or rename files owned by other users. |
Shared Directories | The sticky bit is handy for directories that are shared among multiple users. For example, on a system with a /tmp directory used by all users to store temporary files, setting the Sticky Bit prevents users from accidentally or maliciously deleting files owned by other users. |
下面,您可以看到权限字段的后半部分有‘t’这个字母,表示粘附位设置在/shared-dir 目录上。

3. 切换到 userA
并在 /shared-dir
目录中创建一个名为 fileA.txt
(随意)的文件:
4. 退出 userA,切换到 userB
,并在相同的 /shared-dir
目录中创建另一个名为 fileB.txt
(随意)的文件。
5. 现在,退出用户B
,切换到用户A
,并尝试删除用户B
的fileB.txt
文件。
由于只有文件所有者可以进行更改或删除文件,您将获得如下输出。

6. 最后,运行以下命令列表(ls
)列出共享目录(/shared-dir
)中的所有文件。
如果粘滞位权限起作用,您将看到由用户B创建的fileB.txt文件安然无恙,未被删除。

结论
在结束对Linux中特殊权限的探索时,您已经掌握了一套强大的工具:SUID、SGID和粘滞位。拥有这些知识,您现在可以精确地调整访问控制,并精心保护您的文件。
但不要止步于此!为什么不尝试设置具有SGID的共享目录,并尝试文件如何继承组所有权?Linux世界就在您的面前,通过每一个努力,您将掌握以精湛的技巧保护系统的艺术!
Source:
https://adamtheautomator.com/special-permissions-in-linux/