SUID的介绍

我们知道当我们以某一个用户去运行二进制程序时,就会相应的产生一个进程,而这个进程也有属主和属组,默认这个进程的属主和属组为当前用户和当前用户的基本组。

但是不知道有没有人发现到/etc/shadow这个文件的属主和属组都是root,但是这个文件的权限为rw-------,也就是说只有root用户才有读和写的权限,其他用户什么权限也没有。但是我们知道

/etc/shadow这个文件里面存放的是系统上所有用户的密码相关信息,其它用户却可以使用passwd这个命令来为自身用户修改密码,并最终保存在/etc/shadow这个文件中。这又是怎么回事呢?

wKiom1OoJ-jRc35pAAFIK3x9gqw309.jpg

由上图可以看出/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

例如:

wKiom1OuIZChJ46tAAPIZUqqFfs024.jpg


关于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

wKiom1OucFCBHoEHAALyszxuPiQ749.jpg

sticky特性只对目录有效

如果other权限位上面没有x权限时,如果使用了sticky功能,那么显示的将是T,而不是t。


既然SUID、SGID、sticky是一种特殊权限,那么必然也有和普通权限位一样,也会有一个八进制位与之对应。

SUID:八进制权限位为4

SGID:八进制权限位为2

sticky:八进制权限位为1

注意:特殊权限位一般在普通权限位的前面

例如:chmod 5775 /test

最前面的5表示特殊权限位,因此/test目录同时具有SUID和sticky的特殊权限。