SUID
passwd这个命令是用来修改密码的,所有人都可以用来修改自己的密码,其中root可以修改其他人的密码。而密码是存在/etc/shadow文件下的,看下这个文件的权限:
[email protected]:tmp$ ll /etc/shadow
-rw-r----- 1 root shadow 1.4K 9月 14 12:32 /etc/shadow
这个文件只有root有写入的权限,那我们用passwd命令的时候,明明不是root,为什么可以把修改的密码写入这个文件呢?主要就是passwd的特殊权限:
[email protected]:tmp$ ll $(which passwd)
-rwsr-xr-x 1 root root 59K 3月 23 03:05 /usr/bin/passwd
可以发现权限不是常见的x,而是s(代表x和SUID,如果是大写的S,代表没有x只有SUID,这时SUID无效)。当二进制可执行文件拥有这种权限时,代表进程的拥有人和文件拥有人相同,而不是执行人。也就是说,任何人执行passwd时,进程的拥有人身份不是执行人,而是passwd的拥有人(root),所以这个进程可以修改shadow文件。
SGID
和SUID很像,拥有这个权限时:
如果是二进制可执行文件,代表进程的群组身份和文件所属群组相同。
SUID不能给目录特殊含义,但是SGID可以,比如:
[email protected]:tmp$ ll -d test/
drwxr-sr-x 2 allen root 6 9月 14 17:46 test/
[email protected]:tmp$ cd test/
[email protected]:test$ touch file
[email protected]:test$ ll file
-rw-r--r-- 1 allen root 0 9月 14 17:48 file
可以看到最后的file文件所属群组并不是allen组,而是和test目录同样的组(root)。所以对于目录,SGID代表的含义:任何在目录下的操作,群组身份都和目录群组相同。
SBIT
直接看典型目录:
[email protected]:/$ ll -d tmp/
drwxrwxrwt 18 root root 4.0K 9月 14 18:03 tmp/
当普通目录的权限是777时,代表任何人都可以在目录下随便增删改。但如果需要设置一个目录为:任何人都可以新增文件,但只能修改删除自己创建的文件。这时,SBIT权限的作用就体现出来了,最后一个权限值是t。
设置特殊权限
权限 | 权重 | 值 |
SUID | 4 | s |
SGID | 2 | s |
SBIT | 1 | t |
设置方法:
[email protected]:tmp$ chmod 7777 test/
[email protected]:tmp$ ll -d test/
drwsrwsrwt 2 allen allen 18 9月 14 17:48 test/
还有种方法:
[email protected]:tmp$ chmod u=s,g-s,o-t test/
[email protected]:tmp$ ll -d test/
d--Srwxrwx 2 allen allen 18 9月 14 17:48 test/