Linux特殊权限 SUID、SGID、Sticky
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux特殊权限 SUID、SGID、Sticky相关的知识,希望对你有一定的参考价值。
文件的特殊权限有三种:1、suid;2、sgid;3、sticky,其中,suid和sgid用于累加提升权限,简单来说就是如果原来的用户可以访问,反而切换到的用户或者组不能访问,这时候照样是可以访问的,下面介绍下这三种权限。
SUID:
1、需要注意的是,只对二进制可执行程序有效,不能为普通文件;
2、发起者对程序文件必须拥有执行权限;
3、启动为进程之后,其进程的宿主为原程序文件的宿主;
4、SUID设置在目录上毫无意义。
SGID:
可以应用在二进制文件和作用在文件夹下,当作用在二进制文件下时,作用和SUID相似,只不过SUID是把发起者临时变为文件的所有者,而SGID是把进程的发起者变成源程序文件的属组,默认情况下,用户创建文件时,其属组为此用户所属的主组,当SGID作用在目录下时,则对此目录有写权限的用户在此目录中创建的文件所属的组为此目录的属组,通常用于创建一个协作目录。
Sticky:
默认情况下用户可以删除具有写权限的目录中的任何文件,无论该文件的权限或拥有权,如果在目录设置Sticky位,只有文件的所有者或root**可以删除该文件,Sticky位是作用在文件夹的,设置在文件上毫无意义。
参考技术A 在理解特殊权限之前,需要先具备几个关于安全上下文的认知:前提:进程有属主和属组;文件有属主和属组;
字母表示法:
数字表示法:
在普通三位数字权限位之前,用4代表添加的SUID位
文件权限表示:
环境前提:
linux中有一个二进制程序cat,属主属组均为root
linux中有一个系统文件/etc/shadow,属主属组均为root
我们创建一个普通用户叫user1
user1具有对cat的执行权限
user1 不具有对/etc/shadow的任何权限
默认情况下
user1执行cat,系统创建一个cat进程,进程的属主属组取程序发起者,也就是user1:user1
cat进程访问/etc/shadow,由于进程属主属组是user1:user1,与/etc/shadow的属组属主都不匹配,所以被拒绝访问.
给cat设置SUID之后
user1执行cat.系统创建一个cat进程,进程的属主取cat的属主,属组取程序发起者,就是root:user1
cat进程访问/etc/shadow,由于进程属主是root,与/etc/shadow的属主匹配,所以被允许访问.
举例说明:
passwd命令是linux系统中用来修改密码的命令.系统中所有用户都可以使用.
而passwd命令改密码的行为是通过修改/etc/shadow文件来实现.
看一下/etc/shadow的文件权限:
可见/etc/shadow对普通用户没有任何权限.
所以普通用户默认无法使用文本编辑器打开或者编辑这个文件.
那为什么通过passwd这个命令就可以编辑呢?
用ls命令查看passwd命令的源文件信息:
我们发现passwd这个程序的属主位的执行位不是x而是s,说明passwd被设置了特殊权限SUID.
于是普通用户运行passwd命令,系统创建的passwd进程的属主由默认为"程序发起者"变为了passwd的属主
而passwd的属主是root,所以普通用户其实是在用root的权限修改/etc/shadow文件.最后passwd命令执行结束,passwd进程被关闭.
做个实验:
给命令vim添加SUID,可以让普通用户自己把自己变为超级用户.
看一下vim的原权限
给vim加个SUID
权限变为
现在用普通用户登录
尝试使用vim编辑系统账户文件/etc/passwd
找到自己的用户名一行,修改第三列自己的uid为0,root的uid不用改,然后保存,提示只读文件,使用w!强制保存,成功!
我们知道普通用户quintin对vim是有执行权限的,而对/etc/passwd则没有编辑权限.
通常情况下quintin启动vim后,系统会创建一个以当前用户quintin为属主属组的vim进程,此时vim进程的属主属组为quintin:quintin,由于无论是属主还是属组都不具有对/etc/passwd的编辑权限,所以这个vim进程无权编辑/etc/passwd.
而给/usr/bin/vim设置了SUID之后,quintin或任何用户启动vim程序时,系统创建的vim进程的属主则是取了/usr/bin/vim这个程序文件自身的属主root,所以此时vim进程的属主属组为root:quintin. 系统检查发现正好匹配了/etc/passwd的属主,于是放行vim进程.
其他文本编辑器同理.
退出vim并重新登陆quintin帐户,这时发现命令提示符已完全变为root,而且系统认为我就是root,因为linux只通过uid判断超级管理员,而quintin帐户把自己的uid变成了超级管理员一样的0,所以重新登陆之后,quintin具有了root的身份.
测试:
找一个属主属组都为root且other位无w的文件
作用在二进制程序上时:
执行sgid权限的程序时,此用户将继承此程序的所属组权限
作用于目录上时:
此文件夹下所有用户新建文件都自动继承此目录的用户组.
字母表示法
数字表示法 :
文件权限表示:
作用在二进制程序上时,原理同SUID,只是由user位变为group位.
作用于目录上时演示:
普通帐户quintin在/tmp中创建一个目录叫quintindir,添加SGID.权限777
切换到普通用户user1,在quintindir目录中创建一个文件和一个目录
结果显示,user1在quintindir目录下创建的文件和目录都自动继承了quintindir的属组,而且新目录的权限也继承了SGID,所以设定了SGID的目录中的所有新建文件和目录都会自动属于quintin组.
对于一个多人可写的目录,如果设置了sticky,则每个用户仅能删除和改名自己的文件或目录;只能作用在目录上.普通文件设置无意义,且会被linux内核忽略,用户在设置Sticky权限的目录下新建的目录不会自动继承Sticky权限
字母表示法:
数字表示法:
在普通数字权限位前,用1代表添加Sticky位
文件权限表示:
目的:
我希望在系统中创建一个很多用户可以共同使用的目录,但是要求用户之间不能互相删除改变对方的文件.
实现:
root用户先创建一个777权限目录/app/tmp
普通用户quintin和wang分别在其中创建几个文件和目录
这时候有个问题,就是目录中的任何用户都可以随意删除其他人的文件.
所以root要给/tmp这个文件夹设定一个Sticky位.
设定完毕可见目录tmp的other权限中的x位已经显示为t.说明已设定成功.
测试
切换到quintin用户,进入/app/tmp目录,尝试删除或改名用户wang的文件或目录
改名文件
改名目录
移动文件
删除文件
删除目录
以上所有操作均提示Operation not permitted,表明Sticky权限已发挥作用.
提示:
普通用户在设定了Sticky位的目录下创建的子目录不会继承这个Sticky权限,所以要注意设定好自己目录的权限.
SUID:作用于文件(二进制程序),此用户将继承此程序的所有者权限
SGID:作用于文件(二进制程序)和目录
对于文件:此用户将继承此程序的所属组权限.
对于目录:此文件夹下所有用户新建文件都自动继承此目录的用户组.
Sticky:作用于目录
设定后,目录中的用户只能删除、移动或改名自己的文件或目录
字母权限法很灵活,无论目录还是文件都可以随意添加删除超级权限
数字权限表示法添加/删除时:
数字权限法可以同时删除文件的所有三种超级权限
数字权限法只能删除目录的Sticky.不能删除目录的SUID和SGID.数字权限法每次只能设置一种超级权限.添加权限时:对于文件,会删除掉原有的其他超级权限.对于目录,添加SUID或SGID时,Sticky会被删除.
所有表示为大写字母的权限均为无效(故障)权限,因为缺少了相应的x权限.
SUID:
user, 占据属主的执行权限位;
s: 属主拥有x权限
S:属主没有x权限
SGID:
group, 占据group的执行权限位;
s: group拥有x权限
S:group没有x权限
Sticky:
other, 占据ohter的执行权限位;
t: other拥有x权限
T:other没有x权限
以上是关于Linux特殊权限 SUID、SGID、Sticky的主要内容,如果未能解决你的问题,请参考以下文章