📜  Linux 文件权限中的 SetUID、SetGID 和粘滞位

📅  最后修改于: 2022-05-13 01:56:11.804000             🧑  作者: Mango

Linux 文件权限中的 SetUID、SetGID 和粘滞位

正如Linux中的权限一文所述,Linux 使用位组合来存储文件的权限。我们可以使用chmod命令更改权限,这实质上更改了与文件关联的 'r'、'w' 和 'x'字符。

此外,文件的所有权还取决于创建者的uid (用户 ID)和gid (组 ID),如本文所述。类似地,当我们启动一个进程时,它会使用启动它的用户的uidgid运行。

1. setuid
该位存在于具有可执行权限的文件中。 setuid位只是表示在运行可执行文件时,它将其权限设置为创建它的用户(所有者)的权限,而不是将其设置为启动它的用户。类似地,有一个setgid位对gid执行相同的操作。

要找到setuid ,请在文件权限的可执行位中查找“s”而不是“x”。

具有setuid权限的可执行文件的示例是passwd ,如以下输出所示。



ls -l /etc/passwd

这将返回以下输出:

-rwsr-xr-x root root 2447 Aug 29  2018 /etc/passwd

正如我们所观察到的,文件权限的用户部分中的“x”被替换为“s”。

要设置setuid位,请使用以下命令。

chmod u+s 

要删除setuid位,请使用以下命令。

chmod u-s 

2. setgid

setgid会影响文件和目录。当在文件上使用时,它以拥有它的用户组的权限执行,而不是以执行它的用户组的权限执行。
当为目录设置位时,该目录中的文件集将与父目录的组具有相同的组,而不是创建这些文件的用户的组。这用于文件共享,因为它们现在可以被属于父目录组的所有用户修改。

要找到setgid位,请在文件权限的组部分中查找“s”,如下例所示。

-rwxrwsr-x root root 1427 Aug 2 2019 sample_file

要设置setgid位,请使用以下命令。



chmod g+s 

要删除setgid位,请使用以下命令。

chmod g-s 

安全风险

setuid位在各种应用程序中确实非常有用,但是,应仔细设计支持此功能的可执行程序,以免损害随之而来的任何安全风险,例如缓冲区溢出和路径注入。如果易受攻击的程序以 root 权限运行,攻击者可以通过它获得对系统的 root 访问权限。为了避免这种可能性,一些操作系统忽略了可执行 shell 脚本的setuid位。

3. 粘性位
最初引入粘滞位是为了将可执行程序的文本段“粘”在交换空间中,即使在程序完成执行后,以加快同一程序的后续运行。然而,如今粘性位意味着完全不同的东西。

当一个目录设置了粘滞位时,它的文件只能由文件所有者、目录所有者和 root 用户删除或重命名。下面的命令显示了如何设置粘滞位。

chmod +t 

只需在文件权限中查找“t”字符即可定位粘滞位。下面的片段显示了我们如何为某个目录“Gatos”设置粘性位,以及它如何防止新用户删除目录中的文件。

要删除粘滞位,只需使用以下命令。

chmod -t 

由于删除文件是由文件的写权限控制的,因此粘滞位的实际用途涉及全局可写目录,例如“/tmp”,因此删除权限仅保留给文件的所有者。