Linux中的特殊文件权限:SUID,GUID和Sticky Bit

时间:2020-03-05 15:29:48  来源:igfitidea点击:

文件权限和所有权是Linux中基本但必不可少的安全性概念。
我们可能已经熟悉这些术语。
通常看起来像这样:

除了这些常规权限外,还有一些特殊的文件权限,并且很少有Linux用户意识到这一点。

为了开始讨论特殊权限,我假设我们已经对基本文件权限有所了解。
如果没有,请阅读我们的优秀教程,其中介绍了Linux文件权限。

现在,我将通过Linux文件系统上的新字母向我们展示一些特殊权限。

在此示例中,负责更改用户密码的passwd命令在用户希望看到的x或者-所在的同一位置带有字母s。

请务必注意,该文件属于root用户和root组。

有了此权限,我们不需要特定用户想要运行某些root脚本时就对其授予sudo访问权限。

什么是SUID?

当在可执行文件上设置SUID位时,这意味着将以与可执行文件所有者相同的权限执行该文件。

让我们举一个实际的例子。
如果查看passwd命令的二进制可执行文件,则会将SUID位置1.

theitroad:~$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拥有)并更改其密码。

这就是为什么尽管该命令修改的文件由root拥有,但仍可以使用passwd命令更改自己的密码的原因。

普通用户为什么不能更改其他用户的密码?

请注意,普通用户不能更改其他用户的密码,只能更改自己的密码。
但为什么?
如果我们可以以具有root用户相同的权限的普通用户身份运行passwd命令,并修改/etc/passwd之类的文件,为什么不能更改其他用户的密码?

如果我们检查passwd命令的代码,就会发现它检查了使用运行该命令的用户的UID修改了密码的用户的UID。

如果不匹配,并且该命令不是由root用户运行的,则会引发错误。

setuid/SUID概念非常棘手,应格外小心,否则会在系统中留下安全漏洞。
这是必不可少的安全概念,许多命令(例如ping命令)和程序(例如sudo)都使用了它。

现在我们已经了解了SUID的概念,让我们看看如何设置SUID位。

如何设置SUID位?

设置SUID位时,我发现使用符号方式更容易。
我们可以通过以下方式使用chmod命令:

chmod u+s file_name

这是一个例子:

theitroad:~$ls -l test.txt
-rwxrw-rw- 1 theitroad theitroad 0 Apr 12 17:51 test.txt
theitroad:~$chmod u+s test.txt
theitroad:~$ls -l test.txt
-rwsrw-rw- 1 theitroad theitroad 0 Apr 12 17:52 test.txt

我们也可以使用数字方式。
我们只需要在普通权限中添加第四个数字即可。
用于设置SUID的八进制数字始终为4.

theitroad:~$ls -l test2.txt
-rwxrw-rw- 1 theitroad theitroad 0 Apr 12 17:53 test2.txt
theitroad:~$chmod 4766 test2.txt
theitroad:~$ls -l test2.txt
-rwsrw-rw- 1 theitroad theitroad 0 Apr 12 17:54 test2.txt

如何删除SUID?

我们可以在chmod命令中使用以下任一符号模式:

chmod u-s test.txt

或者,使用数字方式将0而不是4设置为我们要设置的权限:

chmod 0766 test2.txt

作为SUID位,小s和大写S之间的区别

还记得SUID的定义吗?
它允许以与文件所有者相同的权限执行文件。

但是,如果文件首先没有设置执行位怎么办?
像这样:

theitroad:~$ls -l test.txt
-rw-rw-rw- 1 theitroad theitroad 0 Apr 12 17:51 test.txt

如果将SUID位置1,它将显示大写字母S,而不是小写的s:

theitroad:~$chmod u+s test.txt
theitroad:~$ls -l test.txt
-rwSrw-rw- 1 theitroad theitroad 0 Apr 12 17:52 test.txt

S as SUID标志表示我们应该调查一个错误。
我们希望以与所有者相同的权限执行文件,但是对该文件没有可执行权限。
这意味着甚至不允许所有者执行文件,如果无法执行文件,则我们将不会获得所有者的许可。
这使设置SUID位的全部工作失效。

如何查找所有设置了SUID的文件?

如果要搜索具有此权限的文件,请在终端中使用带有-perm选项的find命令。

find/-perm /4000

什么是SGID?

SGID与SUID相似。
将SGID位置1后,任何执行该文件的用户将具有与该文件的组所有者相同的权限。

这是处理目录的好处。
将SGID权限应用于目录后,在此目录中创建的所有子目录和文件都将具有与主目录相同的组所有权(而不是创建文件和目录的用户的组所有权)。

打开终端,并检查对文件/var/local的许可权:

theitroad:~$ls -ld /var/local
drwxrwsr-x 1 root staff 512 Apr 24  2016 /var/local

/var/local文件夹的字母“ s”位于我们希望看到的“ x”或者“-”代表组权限的位置。

SGID的一个实际示例是Samba服务器用于在本地网络上共享文件。

保证所有新文件都不会丢失所需的权限,无论是谁创建的。

如何设置SGID?

我们可以按如下方式在符号模式下设置SGID位:

chmod g+s directory_name

这是一个例子:

theitroad:~$ls -ld folder/
drwxrwxr-x 2 theitroad theitroad 4096 Apr 12 19:32 folder/
theitroad:~$chmod g+s folder
theitroad:~$ls -ld folder/
drwxrwsr-x 2 theitroad theitroad 4096 Apr 12 19:32 folder/

我们也可以使用数字方式。
我们只需要在普通权限中添加第四个数字即可。
用于SGID的八进制数字始终为2.

theitroad:~$ls -ld folder2/
drwxrwxr-x 2 theitroad theitroad 4096 Apr 12 19:33 folder2/
theitroad:~$chmod 2775 folder2
theitroad:~$ls -ld folder2/
drwxrwsr-x 2 theitroad theitroad 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目录中使用,该目录用作临时文件的垃圾箱。

theitroad:~$ls -ld /tmp
drwxrwxrwt 1 root root 512 Apr 12 13:24 /tmp

如我们所见,文件夹/tmp在我们希望看到x或者–的其他权限的同一位置上有字母t。
这意味着用户(root用户除外)无法删除其他用户在/tmp目录中创建的临时文件。

如何设置粘滞位?

与往常一样,我们可以同时使用符号模式和数字模式来设置Linux中的粘性位。

chmod +t my_dir

这是一个例子:

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

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

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

如何去除粘滞位:

我们可以使用符号模式:

chmod -t my_dir

或者在常规权限之前使用数字模式加0:

chmod 0775 tmp2

如何在Linux中查找带有粘性位的文件

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

theitroad:~$find . -perm /1000

如果目录未为所有人设置执行权限,则设置粘滞位将导致显示T而不是t。
用粘滞位表明事情并不完全正确。