Linux 文件权限中的 SetUID、SetGID 和粘滞位
正如Linux中的权限一文所述,Linux 使用位组合来存储文件的权限。我们可以使用chmod
命令更改权限,这实质上更改了与文件关联的 'r'、'w' 和 'x'字符。
此外,文件的所有权还取决于创建者的uid
(用户 ID)和gid
(组 ID),如本文所述。类似地,当我们启动一个进程时,它会使用启动它的用户的uid
和gid
运行。
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”,因此删除权限仅保留给文件的所有者。