前言
-
我们知道在Linux里文件和目录有r、w、x这三个读、写、执行的权限。但有时还会在权限里看到s和t,例如:
这又是代表的什么权限呢?实际上,s和t是Linux里的特殊权限,具体有SUID、SGID、SBIT三种。
SUID
- 当s出现在文件所有者的x权限上时,就被称为Set UID,简称SUID。例如前言中的/usr/bin/passwd文件,它的权限状态是:
-rwsr-xr-x 1 root root
。 - SUID具体的功能和限制是:
- SUID权限仅对二进制程序有效;
- 执行者对于该程序需要具有x的可执行权限;
- 本权限仅在执行改程序的过程中有效;
- 执行者将具有该程序的拥有者(owner)权限;
- 举例来说,Linux里所有的账号和密码都记录在/etc/shadow文件里,这个文件的权限是:
-rw-r----- 1 root shadow
。但我们的一般用户修改密码时(passwd命令)必然会变动该文件的内容,而一般用户又不具有该文件的修改权限,那是怎么修改成功的呢?这就是SUID的功能了。 - 因为一般用户对于passwd(/usr/bin/passwd)都是有执行权限的;而passwd的拥有者(owner)是root账号;又因为passwd的拥有者具有s权限;所以一般用户执行passwd的过程中会获得passwd的拥有者的权限(即root权限);因此/etc/shadow可被一般用户所执行的passwd修改。
- 通过上面这个例子相信大家就能够理解SUID的作用了。
- 另外需要注意的是,SUID仅可用在二进制程序上,不能用着shell脚本上。因为shell脚本也只是将很多的二进制文件调用执行而已。所以SUID的权限部分,还是得看shell脚本调用进来的程序的设置。
- 此外,SUID对于目录是无效的,这点也需要注意。
SGID
-
当s标记在文件拥有者的x上时为SUID,那s标记在用户组的x上时则称为Set GID,简称SGID。例如:
- 和SUID不同的是,SGID对于文件和目录都有效。
- 对文件来说,SGID有如下功能:
- SGID对二进制程序有用;
- 程序执行者对于该程序来说,需具备x的权限;
- 执行者在执行过程中将会获得该程序用户组的支持;
-
举例来说,/usr/bin/locatec程序依赖/var/lib/mlocate/mlocate.db文件的内容;而一般用户对于mlocate.db没有任何权限;但在执行/usr/bin/locate程序时,一般用户会获得mlocate用户组的支持;因此就能够去读取mlocate.db文件。
对目录来说,SGID有如下功能:
- 用户若对于此目录具有r和x的权限,则能够进入此目录;
- 用户在此目录下的有效用户组(effective group)将会变成该目录的用户组;
- 若用户在此目录下具有w的权限,则用户创建的新文件的用户组和此目录的用户组相同;
-
SGID用于目录时,一般用来搭建同一用户组下所有用户都有最大权限,且不许其他人进行查阅的“共同开发目录”。例如:
-
为什么一定要用SGID权限呢,直接把用户组改成project不可以实现这个效果么?答案是无法实现。因为默认文件的所有者和所属组都是文件的创建者,除非收到修改文件所属组,否则project组下的workerb用户,只会有r权限,没有w权限。演示如下:
SBIT
- 当t标记在目录权限的x上时为SBIT。
- SBIT(Sticky Bit)只对目录有效,对文件没有效果。
- SBIT对目录的作用是:
- 当用户对于此目录具有w、x权限时;
- 当用户在该目录下创建文件或目录时,仅有自己与root才有权利删除该文件;
-
也就是说,当一个用户对目录A具有了w权限,即代表该用户可对目录A内的任何文件和子目录进行删除、重命名、移动等操作。但如果目录A有了SBIT权限,则该用户只能对自己创建的子目录和文件进行删除、重命名、移动等,而无法对别人的文件进行这些操作。以/tmp目录为例,演示如下:
SUID/SGID/SBIT的权限设置
- 我们知道可以用类似
chmod 755 dir
这样的数字权限表示法来修改目录或文件的r、w、x权限,对于特殊权限这个方法也是适用的,只需要在现有的三位数字前再加上一位数字。三个特殊权限的数字表示分别为:
SUID:4
SGID:2
SBIT:1
-
演示如下:
-
此外,字符表示法对特殊权限也是适用的。演示如下:
-
最后还有一点需要注意的是,s和t都是加在x权限位置上的,也就是说具有x权限是s和t权限的前提。如果在没有x权限的情况下加了s或t权限,则会显示大写的S或T,表示“空的”,也不会有任何效果的:
END
参考资料:《鸟哥的Linux私房菜》