2025年2月28日
您在文件权限中看到 s 而不是 x 吗? Linux 有一些特殊的文件权限,称为 SUID、GUID 和 Sticky Bit。了解更多关于他们的信息。文件权限和所有权是 Linux 中基本且重要的安全概念。您可能已经熟悉这些术语。它通常看起来像这样:除了这些常规权限之外,还有一些特殊的文件权限,但没有多少 Linux 用户知道它们。为了开始讨论特殊权限,我假设您对基本文件权限有一些了解。如果没有,请阅读我们解释 Linux 文件权限的优秀指南。现在我将向您展示 Linux 文件系统上一些带有新字母的特殊权限。在此示例中,负责更改用户密码的 passwd 命令在我们期望看到 x 或 -< 的同一位置具有字母 s,用于用户权限。需要注意的是,该文件属于 root 用户和 root 组。有了此权限,当您希望特定用户运行某些根脚本时,无需向其授予 sudo 访问权限。什么是SUID?当可执行文件设置了 SUID 位时,这意味着该文件将以与可执行文件所有者相同的权限执行。让我们举一个实际的例子。如果您查看 passwd 命令的二进制可执行文件,您会发现它设置了 SUID 位。linux:~$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 59640 Mar 22 2019 /usr/bin/passwd这意味着任何运行 passwd 命令的用户都将以与 root 相同的权限运行它。有什么好处? passwd命令需要编辑/etc/passwd、/etc/shadow等文件来更改密码。这些文件归 root 所有,并且只能由 root 修改。但由于 setuid 标志(SUID 位),普通用户还可以修改这些文件(由 root 拥有)并更改他/她的密码。这就是为什么您可以使用 passwd 命令更改自己的密码,尽管该命令修改的文件归 root 所有。为什么普通用户不能修改其他用户的密码?请注意,普通用户无法更改其他用户的密码,只能更改自己的密码。但为什么?如果你能以与root具有相同权限的普通用户运行passwd命令并修改/etc/passwd等文件,为什么不能修改其他用户的密码呢?如果您检查 passwd 命令的代码,您会发现它会使用运行该命令的用户的 UID 来检查正在修改密码的用户的 UID。如果不匹配并且该命令不是由 root 运行的,则会抛出错误。setuid/SUID 概念很棘手,使用时应极其谨慎,否则会在系统中留下安全漏洞。这是一个重要的安全概念,许多命令(如 ping 命令)和程序(如 sudo)都使用它。现在您已经了解了 SUID 的概念,让我们看看如何设置 SUID 位。如何设置SUID位?我发现设置 SUID 位时使用符号方式更容易。您可以通过以下方式使用 chmod 命令:chmod u+s file_name这是一个例子:linux:~$ ls -l test.txt
-rwxrw-rw- 1 linux linux 0 Apr 12 17:51 test.txt
linux:~$ chmod u+s test.txt
linux:~$ ls -l test.txt
-rwsrw-rw- 1 linux linux 0 Apr 12 17:52 test.txt您也可以使用数字方式。您只需在正常权限的基础上添加第四位数字即可。 用于设置 SUID 的八进制数始终为 4。linux:~$ ls -l test2.txt
-rwxrw-rw- 1 linux linux 0 Apr 12 17:53 test2.txt
linux:~$ chmod 4766 test2.txt
linux:~$ ls -l test2.txt
-rwsrw-rw- 1 linux linux 0 Apr 12 17:54 test2.txt如何删除SUID?您可以在 chmod 命令中使用符号模式,如下所示:chmod u-s test.txt或者,使用数字方式 0 而不是 4 来设置您想要设置的权限:chmod 0766 test2.txt小s和大写S作为SUID位的区别还记得SUID的定义吗?它允许使用与文件所有者相同的权限执行文件。但是如果文件一开始就没有设置执行位怎么办?像这样:linux:~$ ls -l test.txt
-rw-rw-rw- 1 linux linux 0 Apr 12 17:51 test.txt如果设置了 SUID 位,它将显示大写的 S,而不是小写的 s:linux:~$ chmod u+s test.txt
linux:~$ ls -l test.txt
-rwSrw-rw- 1 linux linux 0 Apr 12 17:52 test.txtS as SUID 标志表示存在您应该检查的错误。您希望以与所有者相同的权限执行该文件,但该文件没有可执行权限。这意味着即使是所有者也不允许执行该文件,如果文件无法执行,您将无法获得所有者的权限。这使得设置 SUID 位的整个过程失败了。如何查找所有设置了SUID的文件?如果要搜索具有此权限的文件,请在终端中使用带有选项 -perm 的 find 命令。find / -perm /4000什么是SGID?SGID 与 SUID 类似。设置 SGID 位后,执行该文件的任何用户都将具有与该文件的组所有者相同的权限。它的好处是可以处理目录。当SGID权限应用于目录时,该目录内创建的所有子目录和文件将获得与主目录相同的组所有权(而不是创建文件和目录的用户的组所有权)。打开终端并检查文件 /var/local 的权限:linux:~$ ls -ld /var/local
drwxrwsr-x 1 root staff 512 Apr 24 2018 /var/local此文件夹 /var/local 在您希望看到组权限的“x”或“-”的位置上有字母“s”。SGID 的一个实际示例是与 Samba 服务器一起在本地网络上共享文件。保证所有新文件都不会失去所需的权限,无论是谁创建的。如何设置SGID?您可以在符号模式下设置 SGID 位,如下所示:chmod g+s directory_name这是一个例子:linux:~$ ls -ld folder/
drwxrwxr-x 2 linux linux 4096 Apr 12 19:32 folder/
linux:~$ chmod g+s folder
linux:~$ ls -ld folder/
drwxrwsr-x 2 linux linux 4096 Apr 12 19:32 folder/您也可以使用数字方式。您只需在正常权限的基础上添加第四位数字即可。 用于 SGID 的八进制数始终为 2。linux:~$ ls -ld folder2/
drwxrwxr-x 2 linux linux 4096 Apr 12 19:33 folder2/
linux:~$ chmod 2775 folder2
linux:~$ ls -ld folder2/
drwxrwsr-x 2 linux linux 4096 Apr 12 19:33 folder2/如何删除SGID位?只需使用 -s 而不是 + ,如下所示:chmod g-s folder删除 SGID 与删除 SGID 相同。在要设置的权限之前使用附加的 0:chmod 0755 folder如何在Linux中查找设置了SGID的文件要查找设置了 SGID 位的所有文件,请使用以下命令:find . -perm /2000什么是粘性位?粘滞位适用于目录。在目录上设置粘性位后,该目录中的所有文件只能由文件所有者或根用户删除或重命名。这通常用在 /tmp 目录中,该目录充当临时文件的垃圾箱。linux:~$ ls -ld /tmp
drwxrwxrwt 1 root root 512 Apr 12 13:24 /tmp正如您所看到的,文件夹 /tmp 在我们期望看到 x的位置上有字母 t > 或 – 以获得其他权限。这意味着用户(root 除外)无法删除其他用户在 /tmp 目录中创建的临时文件。如何设置粘滞位?与往常一样,您可以使用符号和数字模式在 Linux 中设置粘滞位。…