通常,在类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
位,但未设置可执行位,则会发生这种情况,这向用户显示了一种不一致性:setuid
和setgit
位在未设置可执行位时无效。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'。