每个文件都有一个所有者,这表明谁创建了该文件。同时,文件还有一个组号,表示文件所属的组,通常是文件所有者所属的组。
如果是可执行文件,在执行时,通常只有调用该文件的用户的权限。setuid、setgid可以更改此设置。
Setuid:将文件设置为在执行阶段拥有文件所有者的权限。典型的文件是/usr/bin/passwd。如果一般用户执行文件,文件在执行过程中可以获得root权限,从而可以更改用户的密码。
Setgid:该权限仅对目录有效。将目录设置为该位后,用户在该目录中创建的任何文件都将与该目录所属的组具有相同的组。
粘性位:这个位可以理解为防删除位。一个文件能否被用户删除,主要取决于该文件所属的组是否对该用户有写权限。如果没有写权限,则不能删除该目录中的所有文件,也不能添加新文件。如果您希望用户能够添加文件,但不能同时删除它们,您可以对文件使用sticky位。设置该位后,即使用户对目录有写权限,也不能删除文件。
以下是操作这些标志的方法:
这些操作标志与操作文件权限的命令相同,都是chmod。有两种方法来操作它们,
1)chmod u s temp-将setuid标志添加到临时文件中。(setuid仅对文件有效)
用setgid标记临时目录(setgid只对目录有效)
为临时文件添加粘性标志(粘性只对文件有效)
2)采用八进制方法。一般文件用三组八进制数来标记,如666、777、644等。如果设置了这些特殊的符号,这组数字就会加上一组八进制数,比如4666,2777等。这组八进制数的三个数字有如下含义:
字母表
A-setuid位,如果该位为1,则表示设置setuid。
B-setgid位,如果该位为1,则表示设置了setgid。
C-sticky位,如果该位为1,则表示sticky被置位。
设置这些标志后,您可以使用ls -l来查看它们。如果有,它们将显示在原始执行标志位置。例如
rw-r-表示有一个setuid标志。
rw srw-表示有setgid标志。
Xrww-rwt表示粘性标记。
那么最初的执行符号X去了哪里呢?系统规定,如果这个位有一个X,这些特殊符号显示为小写字母(s,s,t)。否则,它们显示为大写字母(S,S,T)
删除文件,不一定要有文件的写权限,但一定要有文件的父目录的写权限。也就是说,即使你没有一个文件的写权限,但是你有这个文件的父目录的写权限,你也可以删除这个文件,如果你没有一个目录的写权限,你也不能在这个目录下创建一个文件。
如何让一个目录允许任何用户写文件,而不让用户删除这个目录中其他人的文件?粘性可以起到这个作用。Stciky一般只在目录中使用,在文件中不起任何作用。
在一个目录中设置了sticky位后(例如/tmp,权限为1777),所有用户都可以在这个目录中创建文件,但只能删除自己的文件,这样就保护了所有用户都可以写的目录中的用户文件。(我当时没有在/tmp中设置sticky位,而是在文件中设置,这就是为什么我设置了sticky位,可以删除我创建的文件。)
-
suid/sgid
要理解suid/sgid,首先要理解流程和权限。
我们需要知道每个进程都有其有效的uid/gid,这决定了它在传统unix文件系统中的实际权限。
第三,进程由二进制生成,二进制从shell/shell脚本加载和执行。
正常情况下,进程的有效uid/gid是从父进程继承来的,或者只是与shell的uid/gid相同。
shell的uid/gid是根据/etc/passwd的第3和第4位数字确定的。
有了上面的概念,我们再来看看suid对有效uid/gid的影响:
如果二进制文件有suid/sgid,那么它的有效id不是从父文件继承的,而是基于二进制文件本身的用户/组。
例如,如果prog1的用户/组是root,但是没有suid/sgid,
当uid(500)/gid(500)的父进程执行这个prog1时,
那么有效的uid/gid是500.
但是,如果在prog1中设置了suid/sgid,那么它的有效uid/gid就是root!
一旦该进程生效,它对文件系统的权限就不受限制。
这也是我之前提到木马程序和病毒的原因。
想象一下:如果一个病毒的用户/组设置为root,然后由一个普通用户执行,
有没有suid/sgid会有什么区别?
好的,既然suid/sgid是系统上必须存在的(比如/usr/bin/passwd和/etc/shadow),
但同时又有很大的杀伤力,应用时要极其小心!
因此,bash shell脚本本身并不支持suid/sgid。
对于perl也是如此,除非另外安装suid-perl。
-
uid gid euid egid
根0 0
测试500 500
登录后Tset.shell 500 500 500 500 shell
测试后. passwd.process500 500 0 500 fork
(-r-s - x - x)
用户test fork二进制文件passwd后,test属于他人,拥有该文件的X权限。因为设置了suid,所以fork中的进程(passwd.process)的euid=为=
文件所有者的uid(passwd)是
passwd . process . euid=passwd . owner . uid=0
Euid和guid用于在进程passwd.process读取、写入和执行文件影子时确认访问权限。
-R-1 root root 855 sep 4 10:58/etc/shadow(passwd . uid=0具有R权限)
文件shadow.owner.uid为0,具有R权限。因为passwd.process . euid=shadow . ower . uid=0,所以测试用户生成的进程passwd . process拥有该文件。
阴影的许可
-r-s - x - x 1根根19336 2004年9月7日/usr/bin/passwd