SUID的介绍
我们知道当我们以某一个用户去运行二进制程序时,就会相应的产生一个进程,而这个进程也有属主和属组,默认这个进程的属主和属组为当前用户和当前用户的基本组。
但是不知道有没有人发现到/etc/shadow这个文件的属主和属组都是root,但是这个文件的权限为rw-------,也就是说只有root用户才有读和写的权限,其他用户什么权限也没有。但是我们知道
/etc/shadow这个文件里面存放的是系统上所有用户的密码相关信息,其它用户却可以使用passwd这个命令来为自身用户修改密码,并最终保存在/etc/shadow这个文件中。这又是怎么回事呢?
由上图可以看出/usr/bin/passwd这个文件的权限为rwsr-xr-x,那么这个s代表的是什么呢?
s代表的是一个特殊权限位,当s出现在文件属主的执行权限位上时,就表示为SUID;如果s出现在文件属组的执行权限位上表示为SGID。那么什么是SUID和SGID呢?
SUID:就是当某用户运行二进制程序时,当前用户或暂时获取这个二进制文件属主的权限。
因此,当某一个二进制文件具有SUID权限时,在运行该二进制程序时,当前用户将暂时具有这个二进制文件属主的权限。所以当我们使用passwd命令时,当前用户将暂时获得passwd这个二进制文件属主的权限,因此当前用户可以将密码写入到/etc/shadow文件中。
注意:当某个二进制文件的属主和属组的执行权限位没有时,使用了特殊权限位就会显示S;如果该权限位上执行有权限(x)时,则显示为s.
如何给某个文件加上特殊权限位呢?
给某个文件加上或减掉SUID权限
chmod u[+|-]s FILE
给某个文件加上或减掉SGID权限
chmod g[+|-]s FILE
例如:
关于SUID的功能总结:
1、SUID只对二进制程序有效,对于一般文件和目录无效。
2、SUID权限只在用户运行该二进制程序过程中有效。
3、使用SUID权限时,当前用户将会暂时拥有该二进制程序本身属主的权限。
SGID介绍
接下来在介绍什么是SGID?
SGID:当前用户在运行二进制程序的时候,其将获得二进制程序属组的支持。
同样的,如何给文件加上或剪掉SGID的权限呢?
chmod g[+|-] s FILE
对于二进制程序使用SGID的使用不在此说明,原理同SUID。
从上面知道,SUID只对二进制程序生效,而SGID既可以对二进制文件生效,也可以作用于目录。
因此,可以将目录设置具有SGID的权限。
如果某个目录具有SGID的权限,那么在该目录下创建的文件的属组和父目录的属组一样。
情景模拟:假设某一个开发团队,有aa和bb这两个用户,这两个用户创建的文件全部存放在/dir目录下。设这个目录的属组为hello。如果设置这个目录,使得aa和bb创建的文件可以相互访问和修改,并且不允许其他用户的访问?
1、修改/dir目录的属组为hello,且给这个目录权限设置为770。
# groupadd hello
# mkdir /dir
# chgrp hello /dir
# chmod 770 /dir
2、创建用户aa和bb,且其附加组为hello
# useradd -G hello aa
# useradd -G hello bb
这样aa和bb在/dir目录下都可以创建文件了。
3、给目录/dir设置SGID权限
# chmod g+s /dir
# ls -ld /dir
drwxrws---. 2 root hello 4096 Aug 31 00:27 /dir
4、使用aa用户在/dir目录下创建文件为aa.txt
# su - aa
$ cd /dir
$ vim aa.txt
hello,aa
$ ls -l aa.txt
-rw-rw-r--. 1 aa hello 9 Aug 31 00:34 aa.txt
//看看,创建的权限为664,且属组为hello。由于bb也是hello这个组的成员,因此用户bb是可以对这个用户进行编辑的。
5、使用用户bb对aa.txt文件进行编辑
# su - bb
$ cd /dir
$ vim aa.txt
hello,aa
hi,I am bb
$ cat aa.txt
hello,aa
hi,I am bb
同样,使用用户bb在/dir目录下创建的文件,也可以被用户aa进行编辑,这样就实现了aa和bb创建的文件可以相互修改和访问,且其他用户不能访问和修改。这就是利用目录的SGID权限来实现的。
关于SGID权限的功能:
1、对于文件具有SGID权限而言:
只对二进制程序有效。
SGID权限只在二进制程序运行过程中有效。
运行二进制程序时,当前用户将获得该二进制程序属组的支持。
2、对于目录具有SGID的权限来说:
如果用户对该目录有r和x权限,表示该用户可以进入到此目录下。
如果该用户对此目录有w权限,则在该目录下创建的文件其属组和当前目录的属组是一样的。
sticky特性
从上面我们知道,当某一个目录具有SGID的权限后,在该目录下的文件用户彼此之间可以相互访问和修改,但是也可以删除不是自己的文件,如何防止别人删除自己的文件呢?(除root用户除外)。
只要给目录加上sticky特性即可。那什么是sticky特性呢?
sticky:在一个公共目录下,每一个用户只能删除自己的文件,而不是删除别人的文件。
sticky特性设置在其他用户的权限位上(即other权限位上)。那如何设置sticky特性呢?
chmod o[+|-]t directory
sticky特性只对目录有效
如果other权限位上面没有x权限时,如果使用了sticky功能,那么显示的将是T,而不是t。
既然SUID、SGID、sticky是一种特殊权限,那么必然也有和普通权限位一样,也会有一个八进制位与之对应。
SUID:八进制权限位为4
SGID:八进制权限位为2
sticky:八进制权限位为1
注意:特殊权限位一般在普通权限位的前面
例如:chmod 5775 /test
最前面的5表示特殊权限位,因此/test目录同时具有SUID和sticky的特殊权限。