Linux 中的 SUID、GUID 和 Sticky Bit 是什么?如何使用它们?Linux 中的 SUID、GUID 和 Sticky Bit 是什么?如何使用它们?Linux 中的 SUID、GUID 和 Sticky Bit 是什么?如何使用它们?Linux 中的 SUID、GUID 和 Sticky Bit 是什么?如何使用它们?
  • 业务
  • 目标
  • 支持
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容

Linux 中的 SUID、GUID 和 Sticky Bit 是什么?如何使用它们?

发表 admin at 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.txt

S 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 中设置粘滞位。

chmod +t my_dir

这是一个例子:

linux:~$ ls -ld my_dir/
drwxrwxr-x 2 linux linux 4096 Apr 12 19:54 my_dir/
linux:~$ chmod +t my_dir/
linux:~$ ls -ld my_dir/
drwxrwxr-t 2 linux linux 4096 Apr 12 19:54 my_dir/

数字方式是在普通权限的基础上加上第四位数字。用于粘性位的八进制数始终为 1。

linux:~$ ls -ld my_dir/
drwxrwxr-x 2 linux linux 4096 Apr 12 19:55 my_dir/
linux:~$ chmod 1775 tmp2/
linux:~$ ls -ld tmp2/
drwxrwxr-t 2 linux linux 4096 Apr 12 19:55 my_dir/

如何去除粘性位:

您可以使用符号模式:

chmod -t my_dir

或者是常规权限前加0的数字模式:

chmod 0775 tmp2

如何在 Linux 中查找设置了粘滞位的文件

此命令将返回设置了粘性位的所有文件/目录:

linux:~$ find . -perm /1000

如果该目录没有为所有目录设置执行权限,则设置粘滞位将导致显示 T 而不是 t。这表明粘性位的情况并不完全正确。

结论

我将把这张图片放在这里来回忆一下您刚刚学到的内容:

这种管理文件夹、文件及其所有权限的灵活性在系统管理员的日常工作中非常重要。您可以看到所有这些特殊权限并不难理解,但必须极其谨慎地使用。

我希望这篇文章能让您更好地了解 Linux 中的 SUID、GUID 和 Sticky Bit。如果您有疑问或建议,请在下面发表评论。

©2015-2025 Norria support@norria.com