我们之前认识的文件的权限仅局限于r,w,x,但如果我们执行命令“ll /tmp; ll /usr/bin/passwd”,会出现除了r,w,x之外的其他字母:
即出现了特殊权限(s跟t)。
【SetUID】
当s这个标志出现在文件所有者的x权限上时,此时就被称为Set UID,简称为SUID的特殊权限。
我们认识一下SUID的权限对于文件的功能:
- SUID权限仅对二进制程序(binary program)有效;
- 执行者对于该程序需要具有x的可执行权限;
- 本权限仅在执行该程序的过程中(run-time)有效;
- 执行者将具有该程序所有者(owner)的权限。
举个例子,我们的Linux系统中,所有账号的密码都记录在/etc/shadow这个文件里面,这个文件的权限为“-r-------- 1 root root”,意思是这个文件仅有root可读且仅有root可以强制写入而已。既然这个文件仅有root可以修改,那为什么liuyu这个一般账号用户却能自行修改自己的密码呢?
明明/etc/shadow的权限就不能让liuyu这个一般账号去访问的,为什么liuyu还能够修改这个文件内的密码呢?
这就是SUID的功能了!!
由上述介绍的功能,我们可以知道:
- liuyu对于/usr/bin/passwd这个程序来说是具有x权限的,表示liuyu能执行passwd;
- passwd的拥有者是root这个账户;
- liuyu执行passwd的过程中,会“暂时”获得root的权限;
- /etc/shadow可以被liuyu所执行的passwd所修改。
但如果liuyu使用cat却不能读取/etc/shadow!!这是因为cat不具有SUID的权限,所以liuyu执行“cat /etc/shadow”是不能读取/etc/shadow的。
此外,SUID仅可用在二进制程序上,不能够用在shell script上面。这是因为shell script只是将很多的二进制执行文件调进来执行而已。所以SUID的权限部分,还是得要看shell script调用进来的程序的设置,而不是shell script本身。当然,SUID对于目录也是无效的!!
【Set GID】
当s这个标志出现在用户组的x权限上时,此时就被称为Set UID, SUID。
与SUID不同的是,SGID既可以针对文件,也可以针对目录来设置。
对文件来说,SGID具有如下功能:
SGID对二进制程序有用;
程序执行者对于该程序来说,需具备x的权限;
执行者在执行的过程中将会获得该程序用户组的支持。
当一个目录设置了SGID的权限后,它将具有如下的功能:
用户若对于此目录具有r与x的权限时,该用户能够进入此目录;
用户在此目录下的有效用户组将会变成该目录的用户组;
若用户在此目录下具有w的权限(可以创建文件),则用户所创建的新文件的用户组与此目录的用户组相同。
SGID对于项目开发来说是非常重要的,因为这涉及用户组权限的问题。
【Sticky Bit】
这个SBIT目前只针对目录有效,对于文件已经没有效果了。
SBIT对于目录的作用是:
当用户