Linux文件的特殊权限:SUID,SGID,SBIT

时间:2022-01-09 15:12:12

本博客已迁往http://coredumper.cn


SUID

具有该权限的文件的所有者的x标志会被s标志取代。
该权限仅对二进制可执行文件有效。
执行该文件的用户(当然这个用户必须具有对该文件的可执行权限)将会暂时获得该文件所有者的权限,这种效果仅在执行该文件的过程中有效。

实例:
当普通用户使用命令passwd修改自己的密码时,命令passwd需要修改文件/etc/shadow,但是只有root用户具有对文件/etc/shadow的可读可写权限,SUID便可以解决这个问题。由于可执行文件/usr/bin/passwd具有SUID权限,它的所有者是root,所以当普通用户执行命令passwd时,将会暂时获得root的权限。





SGID
具有该权限的文件的所属用户组的x标志会被s标志取代。
该权限对二进制可执行文件和目录文件有效。


当二进制可执行文件具有该权限时:
执行该文件的用户(当然这个用户必须具有对该文件的可执行权限)将会暂时获得该文件所属用户组的支持,这种效果仅在执行该文件的过程中有效。
实例:
当普通用户使用命令locate查找文件时,命令locate会去读取文件/var/lib/mlocate/mlocate.db,该文件的所有者是root,所有者具有可读可写权限,该文件的所属用户组是slocate,所属用户组的权限是可读,其它用户没有读写权限,SGID便可以解决这个问题。由于可执行文件/usr/bin/locate具有SGID权限,它的所属用户组是slocate,所以当普通用户执行命令locate时,将会暂时获得用户组slocate的支持。



当目录文件具有该权限时:

首先要知道目录文件的可读、可写、可执行权限的作用:

可读:当对一个目录文件具有可读权限时,才可以查看该目录下的文件名
可写:当对一个目录文件具有可写权限时,才可以在该目录下新建文件、删除文件、重命名文件、转移文件
可执行:当对一个目录文件具有可执行权限时,才可以进入该目录,使其成为工作目录。注意可执行权限是可读和可写的前提,如果没有可执行权限,即使具有可读和可写权限,也无法进行可读和可写的相关操作。


其次要知道初始用户组和有效用户组的概念:

一个用户可能同时属于多个用户组,当该用户执行除创建新文件以外的操作时(如读、写、执行文件),将会得到他属于的所有用户组的支持。
可以用命令groups查看当前用户属于的所有用户组,第一个输出的用户组为有效用户组。
初始用户组:
在文件/etc/passwd中的GID就是相应用户的初始用户组。
有效用户组:
当创建一个新文件时,该文件的所属用户组是当前用户的有效用户组。

可以用命令“newgrp 新有效用户组”切换当前用户的有效用户组。需要注意的是,命令newgrp是以子进程的方式在另一个shell中实现有效用户组切换的,当用命令exit回到原来的shell时,有效用户组也会自动复原。


下面继续讲当目录文件具有SGID权限时:
当用户进入该目录时(当然用户必须具有对该目录的可执行权限),用户的有效用户组将会暂时变成该目录的所属用户组(注意该目录的所属用户组必须本来就是该用户属于的用户组之一,但不是该用户的有效用户组)。此时,用户在该目录下创建的新文件(当然用户必须具有对该目录的可写权限)的所属用户组将和该目录文件的所属用户组相同。
实例:
假设用户warren属于两个用户组warren和project,用户组warren既是用户warren的初始用户组,也是用户warren的有效用户组。目录文件/srv/project的所属用户组是project,所属用户组的权限是可读可写和SGID。当用户warren进入目录/srv/project后,他的有效用户组就会暂时变成project,则他在该目录下创建的新文件的所属用户组将会是project。





SBIT
具有该权限的文件的其他用户的x标志会被t标志取代。
该权限仅对目录文件有效。
如果其他用户对一个目录文件具有可读可写可执行权限,则一个用户在该目录下面创建的文件可以被另外一个用户删除、重命名或者转移。为了解决这个问题,可以将该目录设置SBIT权限,这样某个用户在该目录下创建的文件只能被他自己删除、重命名或者转移(当然root用户的权限不会受到约束)。
实例:
所有者、所属用户组和其他用户对目录文件/tmp都具有可读可写可执行的权限,但是/tmp同时具有SBIT权限。这样所有用户都可以在/tmp下创建自己的文件,但是一个用户不能删除、重命名或者转移其他用户在/tmp下创建的文件。