当前位置: 首页 > 科技观察

如何使用特殊权限:setuid、setgid和粘滞位?

时间:2023-03-20 13:51:33 科技观察

目标了解特殊权限的工作原理,以及如何识别和设置它们。需要了解标准Unix/Linux权限系统难度简单约定#-需要以root用户身份直接执行指定命令或使用sudo命令$-使用普通非特权用户执行指定命令简介通常,在类Unix操作系统上,所有权文件和目录的名称基于文件创建者的默认uid(用户标识)和gid(组标识)。启动进程时也是如此:它以启动它的用户的uid和gid运行,并具有适当的权限。可以使用特殊权限更改此行为。setuid位当使用setuid(设置用户id)位时,前面描述的行为发生了变化,因此当一个可执行文件启动时,它不是以启动它的用户的权限运行,而是以文件所有者的权限运行.因此,如果在可执行文件上设置了setuid位,并且该文件由root拥有,当普通用户启动它时,它将以root权限运行。显然,如果使用不当,setuid位是一个潜在的安全风险。使用setuid权限的可执行文件的一个示例是passwd,我们可以使用该程序来更改登录密码。我们可以使用ls命令来验证这一点:ls-l/bin/passwd-rwsr-xr-x。1rootroot27768Feb112017/bin/passwd如何识别setuid位?我相信您已经在上述命令的输出中注意到,对于可执行位,setuid位由s而不是x表示。小写的s表示已设置可执行位,否则您将看到大写的S。大写的S出现在设置了setuid或setgid位但未设置可执行位x时。它用于警告用户这种矛盾的设置:如果未设置可执行位,则setuid和setgid位都没有任何效果。setuid位对目录没有影响。setgid位与setuid位的不同之处在于setgid(设置组ID)位影响文件和目录。在第一个示例中,设置了setgid位的文件不是以启动它的用户组的权限执行的,而是以拥有该文件的组的权限执行的。也就是说,进程的gid和文件的gid是一样的。当在目录上使用时,setgid位的行为与正常情况不同,导致在该目录中创建的文件不属于创建者所属的组,而是属于父目录所属的组。此功能通常用于文件共享(目录所属组中的所有用户都可以修改文件)。和setuid一样,setgid位也很容易识别(我们以test目录为例):ls-ldtestdrwxrwsr-x。2egdocegdoc4096Nov117:25test这次s出现在组权限的可执行位中。sticky位sticky(粘性)位的工作方式不同:它对文件没有影响,但当它用于目录时,该目录中的所有文件只能由其所有者删除或移动。一个典型的例子就是/tmp目录,通常系统上的所有用户都对这个目录有写权限。因此,设置粘滞位会使用户无法删除其他用户的文件:$ls-ld/tmpdrwxrwxrwt。14rootroot300Nov116:48/tmp在上面的示例中,目录所有者、组和其他用户具有完全权限(读、写和执行)。粘滞位在可执行位上用t标识。此外,小写的t表示还设置了可执行权限x,否则您会看到大写的T。如何设置特殊权限位与普通权限一样,可以使用chmod命令设置特殊权限位,使用数字或ugo/rwx格式。在前一种情况下,setuid、setgid和sticky位分别由值4、2和1表示。例如,如果我们想在一个目录上设置setgid位,我们可以运行:$chmod2775test使用这个命令,我们在目录上设置setgid位(由四个数字中的第一个标识),并给它所有者和目录组的所有用户都被授予完全权限,其他用户被授予读取和执行权限(目录上的执行位意味着用户可以cd进入目录或使用ls列出其内容)。另一种设置特殊权限位的方法是使用ugo/rwx语法:$chmodg+stest要将setuid位应用于文件,我们可以运行:$chmodu+sfile要设置粘性位,请运行:$chmodo+t测试在某些情况下,使用特殊权限可能非常有用。但如果使用不当,它可能会引入严重的漏洞,因此在使用之前请三思。