Linux的SUID、SGID、SBIT理解
Linux中,文件除了有r
、w
、x
,这个三个读、写、执行权限之外(如果不清楚这三个权限,请戳这里),还有其他特殊权限,那就是SUID
、SGID
、SBIT
SUID
SUID
全称Set User ID
,当设置了这个特殊权限之后,当拥有者拥有文件执行权限x
,在文件拥有者的x
权限位上显示s
,而不是显示x
;而拥有者没有文件的执行权限时,x
位上显示的是S
SUID 限制与功能
SUID
权限仅对二进制程序(Binary Program)有效- 执行者对于该程序需要具有
x
的可执行权限 - 执行者在执行具有
SUID
权限的二进制程序过程中,暂时获得该程序拥有者(owner)的权限
讲个经典例子,Linux系统中,所有用户的账号存在/etc/passwd
文件里面(好像之前账号密码都在这个文件里),密码存在/etc/shadow
文件里面,看一下这shadow
文件和用于修改密码的passwd
命令的权限
对于shadow
文件来说,对于文件的所有者也就是root
用户才有w
的权限,所属组和其他用户都没有w
权限,但是普通用户也能自己修改自己的密码呀,没有写权限,却能修改文件里密码,这是为什么呢?这个先放放
再来看看passwd
命令,我们都知道修改用户密码需要用到passwd
命令,分析一下权限,对于当前这个系统来说,系统上的每个用户都有这个命令的执行权,但是我们注意到在文件所有者权限第三位,也就是一般放x
的位置上现在是s
,这说明了这个二进制执行文件设置了特殊权限,也就是SUID
权限
到现在就可以知道为什么普通用户对存放密码的shadow
文件没有写权限,却能修改密码,因为普通用户修改密码需要执行passwd
命令,而这个命令设置了SUID
权限,所以普通用户在执行passwd
命令时会临时获得这个命令的所有者(owner)也就是root
的权限,也就能修改shadow
文件了
但如果使用cat
命令去查看shadow
文件,是不能读取了,因为cat命令没有设置SUID的权限,当普通用户使用cat命令去读取shadow文件时,他是以一个普通用户去读取,刚刚分析了shadow文件的权限,除了文件所有者和所属组的用户可以读文件之外,其他用户是不能读,这就可以解释为什么cat不到shadow文件了
注:SUID
仅对可执行二进制文件上,不能够用在shell脚本上,当然对于目录也是无效的
SGID
SGID
全称Set Group ID
,当s标志在文件所有者的x
位上位SUID
,那么当s
在所属组的x
位上就称SGID
与SUID不同的是,SGID可以针对文件或目录来设置
对于文件来说,SGID有以下功能
- SGID对二进制程序有用
- 程序执行者对于该程序来说,需具备
x
的权限 - 执行者在执行的过程中将会获得该程序用户组的支持(获得所属组的权限)
对于目录来说,SGID有以下功能
- 用户若对此目录具有
r
与x
的权限时,该用户能够进入此目录 - 用户在此目录下的有效用户组(Effective Group)将会变成该目录的用户组
- 用途:若用户在SGID的目录下所创建的文件或目录的所属组不再是创建用户的所属组,而是SGID目录(上级目录)的所属组
其实也就跟SUID差不多
SBIT
SBIT
全称Sticky Bit
,目前SBIT
只针对目录有效,对于文件已经没有效果了
SBIT对于目录的作用
- 当前用户对于此目录具有
w
、x
权限,即具有写入的权限 - 当用户在该目录下建立文件或目录时,仅有自己和root才有权力删除该文件
简单说,就是当用户甲
对A目录
具有用户组(所属组)或者其他用户的权限,并且拥有A目录
的w
的权限,意味着用户甲
可以在A目录
内任何人建立的目录或文件进行删除、更名、移动等操作。不过,当A目录
设置了SBIT权限选项时,用户甲
只能够针对自己所建立的文件或目录进行删除、更名、移动等操作,而无法删除其他用户所创建的目录或文件