文件权限和所有权是 Linux 中基本但必不可少的安全概念。 您可能已经熟悉这些术语。 它通常看起来像这样:
除了这些常规权限之外,还有一些特殊的文件权限,并且没有多少 Linux 用户知道它。
要开始谈论特殊权限,我假设您对基本文件权限有所了解。 如果没有,请阅读我们解释 Linux 文件权限的优秀指南。
现在,我将向您展示一些在 Linux 文件系统上带有新字母的特殊权限。
在这个 example,passwd命令,负责修改一个用户的密码,有字母 s
在我们期望看到的同一个地方 x
或者 -
, 用于用户权限。 重要的是要注意这个文件属于 root 用户和 root 组。
有了这个权限,你不需要给 sudo
当您希望他运行某些根脚本时访问特定用户。
什么是 SUID?
当在可执行文件上设置 SUID 位时,这意味着该文件将以与可执行文件所有者相同的权限执行。

让我们来一个实用的 example. 如果您查看 passwd 命令的二进制可执行文件,它会设置 SUID 位。
linuxhandbook:~$ 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
这是一个 example:
linuxhandbook:~$ ls -l test.txt
-rwxrw-rw- 1 linuxhandbook linuxhandbook 0 Apr 12 17:51 test.txt
linuxhandbook:~$ chmod u+s test.txt
linuxhandbook:~$ ls -l test.txt
-rwsrw-rw- 1 linuxhandbook linuxhandbook 0 Apr 12 17:52 test.txt
您也可以使用数字方式。 您只需要在正常权限上添加第四位数字。 用于设置 SUID 的八进制数始终为 4。
linuxhandbook:~$ ls -l test2.txt
-rwxrw-rw- 1 linuxhandbook linuxhandbook 0 Apr 12 17:53 test2.txt
linuxhandbook:~$ chmod 4766 test2.txt
linuxhandbook:~$ ls -l test2.txt
-rwsrw-rw- 1 linuxhandbook linuxhandbook 0 Apr 12 17:54 test2.txt
如何删除 SUID?
您可以在 chmod 命令中使用符号模式,如下所示:
chmod u-s test.txt
或者,使用带有 0 而不是 4 的数字方式来设置您要设置的权限:
chmod 0766 test2.txt
小s和大写S作为SUID位的区别
还记得 SUID 的定义吗? 它允许一个文件 执行 具有与文件所有者相同的权限。
但是如果文件一开始没有设置执行位怎么办? 像这样:
linuxhandbook:~$ ls -l test.txt
-rw-rw-rw- 1 linuxhandbook linuxhandbook 0 Apr 12 17:51 test.txt
如果设置 SUID 位,它将显示一个大写的 S,而不是小 s:
linuxhandbook:~$ chmod u+s test.txt
linuxhandbook:~$ ls -l test.txt
-rwSrw-rw- 1 linuxhandbook linuxhandbook 0 Apr 12 17:52 test.txt
S as SUID 标志意味着您应该查看一个错误。 您希望文件以与所有者相同的权限执行,但文件没有可执行权限。 这意味着即使所有者也不允许执行文件,如果文件无法执行,您将无法获得所有者的权限。 这使设置 SUID 位的整个过程失败。
如何查找所有设置了 SUID 的文件?
如果要搜索具有此权限的文件,请在终端中使用带有选项 -perm 的 find 命令。
find / -perm /4000
什么是SGID?
SGID 类似于 SUID。 设置 SGID 位后,任何执行该文件的用户都将拥有与该文件的组所有者相同的权限。
它的好处是处理目录。 当 SGID 权限应用于目录时,在该目录中创建的所有子目录和文件将获得与主目录相同的组所有权(而不是创建文件和目录的用户的组所有权)。

打开终端并检查文件 /var/local 的权限:
linuxhandbook:~$ ls -ld /var/local
drwxrwsr-x 1 root staff 512 Apr 24 2018 /var/local
此文件夹 /var/local 在您希望看到组权限的“x”或“-”的同一位置具有字母“s”。
一个实用的 example SGID 与 桑巴服务器 用于在本地网络上共享文件。 保证所有新文件都不会失去所需的权限,无论是谁创建的。
如何设置SGID?
您可以像这样在符号模式下设置 SGID 位:
chmod g+s directory_name
这是一个 example:
linuxhandbook:~$ ls -ld folder/
drwxrwxr-x 2 linuxhandbook linuxhandbook 4096 Apr 12 19:32 folder/
linuxhandbook:~$ chmod g+s folder
linuxhandbook:~$ ls -ld folder/
drwxrwsr-x 2 linuxhandbook linuxhandbook 4096 Apr 12 19:32 folder/
您也可以使用数字方式。 您只需要在正常权限上添加第四位数字。 用于 SGID 的八进制数始终为 2。
linuxhandbook:~$ ls -ld folder2/
drwxrwxr-x 2 linuxhandbook linuxhandbook 4096 Apr 12 19:33 folder2/
linuxhandbook:~$ chmod 2775 folder2
linuxhandbook:~$ ls -ld folder2/
drwxrwsr-x 2 linuxhandbook linuxhandbook 4096 Apr 12 19:33 folder2/
如何删除 SGID 位?
只需像这样使用 -s 而不是 +s :
chmod g-s folder
删除 SGID 与删除 SGID 相同。 在要设置的权限之前使用附加的 0:
chmod 0755 folder
如何在 Linux 中查找设置了 SGID 的文件
要查找所有设置了 SGID 位的文件,请使用以下命令:
find . -perm /2000
什么是粘性位?
粘性位适用于目录。 在目录上设置了粘滞位,目录中的所有文件只能由文件所有者或根用户删除或重命名。

这通常在 /tmp 目录中使用,该目录用作临时文件的垃圾桶。
linuxhandbook:~$ ls -ld /tmp
drwxrwxrwt 1 root root 512 Apr 12 13:24 /tmp
如您所见,文件夹 /tmp 有字母 吨 在我们期望看到的同一个地方 X 或者 – 其他权限。 这意味着一个用户(除了root)不能删除其他用户在/tmp 目录下创建的临时文件。
如何设置粘性位?
与往常一样,您可以使用符号模式和数字模式在 Linux 中设置粘滞位。
chmod +t my_dir
这是一个 example:
linuxhandbook:~$ ls -ld my_dir/
drwxrwxr-x 2 linuxhandbook linuxhandbook 4096 Apr 12 19:54 my_dir/
linuxhandbook:~$ chmod +t my_dir/
linuxhandbook:~$ ls -ld my_dir/
drwxrwxr-t 2 linuxhandbook linuxhandbook 4096 Apr 12 19:54 my_dir/
数字方式是在正常权限的基础上添加第四位数字。 用于粘性位的八进制数始终为 1。
linuxhandbook:~$ ls -ld my_dir/
drwxrwxr-x 2 linuxhandbook linuxhandbook 4096 Apr 12 19:55 my_dir/
linuxhandbook:~$ chmod 1775 tmp2/
linuxhandbook:~$ ls -ld tmp2/
drwxrwxr-t 2 linuxhandbook linuxhandbook 4096 Apr 12 19:55 my_dir/
如何去除粘性位:
您可以使用符号模式:
chmod -t my_dir
或者在常规权限之前为 0 的数字模式:
chmod 0775 tmp2
如何在 Linux 中查找设置了粘性位的文件
此命令将返回所有设置了粘性位的文件/目录:
linuxhandbook:~$ find . -perm /1000
如果该目录没有为所有目录设置执行权限,设置一个粘滞位将导致显示 T 而不是 t。 表明粘性位并不完全正确。
结论
我将把这张图片放在这里来回忆你刚刚学到的东西:

这种管理文件夹、文件及其所有权限的灵活性在系统管理员的日常工作中非常重要。 您可以看到所有这些特殊权限并不难理解,但必须非常谨慎地使用它。
我希望这篇文章能让你对 Linux 中的 SUID、GUID 和 Sticky Bit 有一个很好的了解。 如果您有任何问题或建议,请在下方发表评论。