Linux如何使用特殊权限:setuid,setgid和粘滞位

通常,在类unix操作系统上,文件和目录的所有权基于创建它们的用户的默认“uid”(用户id)和“gid”(组id)。启动进程时也会发生同样的情况:它使用启动它的用户的有效用户id和组id以及相应的权限运行。可以使用特殊权限修改此行为。

setuid 位

当使用setuid位时,上面描述的行为是修改的,以便在启动可执行文件时,它不会使用启动它的用户的权限,但是文件所有者的权限。
因此,例如,如果可执行文件具有“setuid”位设置为上面,并且它由root拥有,当由普通用户启动时,它将使用root权限运行。
如果没有正确使用,应该清楚为什么这代表潜在的安全风险。

具有setuid权限集的可执行文件的一个例子是“passwd”文件,我们可以使用它来更改登录密码。
我们可以通过使用'ls'命令来验证:

ls -l /bin/passwd
-rwsr-xr-x. 1 root root 27768 Nov 11  2015 /bin/passwd

如何识别'setuid'位?正如您已经注意到的,查看上述命令的输出,setuid位由一个s代替可执行位的x表示。's'表示设置了可执行位,否则会看到大写字母'S'。如果设置了setuid或者setgid位,但未设置可执行位,则会发生这种情况,这向用户显示了一种不一致性:setuidsetgit位在未设置可执行位时无效。setuid位对目录没有影响。

setgid 位

setuid位不同,“setgid”位对两个文件和目录都有影响。
在第一种情况下,具有“setgid”位设置的文件,当执行时,而不是使用启动它的用户组的权限运行,与拥有该文件的组的组:换句话说,该过程的组ID与文件的组ID相同。

相反,当在目录上使用时,setgid位会改变标准行为,以便在所述目录中创建的文件组不是创建它们的用户的文件组,而是父目录本身的文件组。这通常用于简化文件共享(属于该组的所有用户都可以修改文件)。与setuid一样,setgid位也很容易被发现(在本例中是在测试目录上):

ls -ld test
drwxrwsr-x. 2 egdoc egdoc 4096 Nov  1 17:25 test

这次s出现在用户组区域上的可执行位。

如何设置特殊位

与普通权限一样,可以使用“chmod”命令,使用数字或者“ugo/rwx”格式分配特殊位。在前一种情况下,“setuid”、“setgid”和“sticky”位分别由值4、2和1表示。因此,例如,如果要在目录上设置“setgid”位,我们将执行:

$chmod 2775 test

使用此命令,我们在目录上设置setgid位(由四个数字中的第一个数字标识),并将其完全权限授予其所有者和目录所属组的成员用户,加上对所有其他用户的读取和执行权限(记住,目录上的执行位意味着用户可以将“cd”插入目录或者使用“ls”列出目录内容)。
我们设置特殊权限位的另一种方法是使用ugo/rwx语法:

$chmod g+s test

例如要将“setuid”位应用于文件,运行:

$chmod u+s file

添加粘滞位:

$chmod o+t test

在某些情况下,使用特殊权限可以非常有用,但如果没有正确使用,可以引入严重漏洞,所以在使用之前要三思而后行。

粘滞位

粘性位的工作方式不同:虽然它对文件没有影响,但在目录上使用时,所述目录中的所有文件都只能由其所有者修改。使用它的典型情况是/tmp目录。通常,此目录可由系统上的所有用户写入,因此为了使一个用户无法删除另一个用户的文件,设置了粘性位:

$ls -ld /tmp
drwxrwxrwt. 14 root root 300 Nov  1 16:48 /tmp

在这种情况下,所有者、组和所有其他用户对目录具有完全权限(读、写和执行)。粘性位可通过一个t来识别,该t通常在“其他”部分显示可执行x位的地方报告。同样,小写的't'表示也存在可执行位,否则您将看到大写的't'。

日期:2020-07-07 20:56:49 来源:oir作者:oir