Linux 中的 SUID、GUID 和 Sticky Bit 是什么?如何使用它们?
您在文件权限中看到 s 而不是 x 吗? Linux 有一些特殊的文件权限,称为 SUID、GUID 和 Sticky Bit。了解更多关于他们的信息。
文件权限和所有权是 Linux 中基本且重要的安全概念。您可能已经熟悉这些术语。它通常看起来像这样:
除了这些常规权限之外,还有一些特殊的文件权限,但没有多少 Linux 用户知道它们。
为了开始讨论特殊权限,我假设您对基本文件权限有一些了解。如果没有,请阅读我们解释 Linux 文件权限的优秀指南。
现在我将向您展示 Linux 文件系统上一些带有新字母的特殊权限。
在此示例中,负责更改用户密码的 passwd 命令在我们期望看到 x
或 -< 的同一位置具有字母
,用于用户权限。需要注意的是,该文件属于 root 用户和 root 组。s
有了此权限,当您希望特定用户运行某些根脚本时,无需向其授予 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。如果您有疑问或建议,请在下面发表评论。