Linux特殊权限SUID,SGID,SBIT

Linux特殊权限SUID,SGID,SBIT

SUID: Set UID upon execution 在执行时设置UID,让可执行文件在执行时具有它的所有者权限;
SGID: Set GID upon execution 在执行时设置GID,让可执行文件在执行时具有它的所属组权限;
SBIT: Sticky Bit 粘滞位,让某个目录下的文件只能由它的所有者和root删除,不允许其它用户删除。

SUID

SUID的作用

SUID的作用是:当一个二进制可执行文件具有SUID权限时,用一个非该二进制可执行文件所有者的用户去执行该二进制可执行文件,该二进制可执行文件在执行期间会具有它的所有者的权限。

举例说明SUID的作用

要理解前面“SUID的作用”那句话的意思,首先要知道,当一个用户去执行一个没有SUID权限的可执行文件时,可执行文件在执行期间具有的权限,就是执行它的那个用户的权限。

比如用户“laowang”去执行一个属于“xiebruce”的可执行文件test_linux,该可执行文件的功能是在当前目录生成一个test.txt文件,那么生成的test.txt文件的所有者和所属组,都是运行它的那个用户,也就是“laowang”,而不是可执行文件test_linux所有者“xiebruce”(下图是实例)
-w450

上例中,如果在生成之前,就已经有一个test.txt文件,并且该文件属于“xiebruce”呢?如下图所示
-w447

我们再来执行看看,很明显,test.txt并没有被覆盖,因为test_linux执行的期间的权限,是它的执行者,也就是“laowang”的权限,而“laowang”并没有这个权限去覆盖属于“xiebruce”的test.txt文件,所以test.txt文件的内容并未改变
-w457

这时SUID的作用就体现了,只要给test_linux设置了SUID(设置后,test_linux的所有者权限已经由rwx变成了rws),“laowang”就有权限覆盖属于“xiebruce”的test.txt文件了
-w543


test_linux所有者的执行权限去掉,再给它添加SUID权限,可以看到,这次的S也加上了,但是要注意,它是大写的S
-w480

我们来看看大写S与小写s的区别,实验证明,大写S与小写s没有区别,只不过大写S能说明test_linux这个可执行文件的所有者没有对它的执行权限而已,但只要这个所有者对test.txt文件有写权限就行了
-w460

看,即使test_linux的所有者对它本身没有任何权限(即rwx都为0),但执行它时,它生成的test.txt文件还是能覆盖原来的test.txt文件,为什么呢?因为原来的test.txt文件属于用户xiebruce,并且xiebruce对test.txt文件有rwx权限,自然就能覆盖它
-w476


另一个例子,cat默认是没有SUID权限的,所以一个普通的用户是无法通过cat命令来查看/etc/shadow文件的内容的,但是对它添加了SUID权限后,就可以让一个普通用户查看/etc/shadow的内容了,因为有SUID,普通用户在执行cat期间就相当于拥有cat的所有者的权限,而cat的所有者是root,root当然有读取/etc/shadow的权限了
-w549

SUID在Linux系统中的应用

我们知道,Linux系统的密码,并不是存在/etc/passwd中的,/etc/passwd中的第二位都是x,其实这就是密码位,因为不在这显示,所以用一个x表示,而实际密码是存在/etc/shadow文件中的,下图是/etc/passwd
-w425

所以修改密码,是必须改动/etc/shadow文件的,只不过不是手动,而是用passwd命令。我们知道,普通用户对/etc/shadow文件是没有任何权限的,但是普通用户却能通过passwd命令修改自己的密码(其实最终就是修改/etc/shadow文件),而且不需要sudo,这就是SUID的作用了。

可以看到,passwd命令,其所有者(即超级用户root)的权限是rws,最后一位是s说明有SUID权限,所以,普通用户执行passwd命令也能修改/etc/shadow文件
-w411

但是有一个问题无法解释,就是CentOS6/7的/etc/shadow权限都是000,即使这样root还是可以查看它的内容,但却无法修改,不知道CentOS或者说红帽用了什么机制

# Debian/Ubuntu上的shadow文件权限
-rw-r----- 1 root shadow 959 Aug 29 12:55 /etc/shadow
# CentOS6/7 shadow文件的权限
---------- 1 root root 1.2K Apr 29  2020 /etc/shadow

设置SUID权限的方法

#添加SUID权限
chmod u+s /path/to/二进制可执行文件
#删除SUID权限
chmod u-s /path/to/二进制可执行文件

其实还有另外的添加方式,我们平时修改文件权限,是可以通过数字修改的

chmod 755 /path/to/二进制可执行文件

其实我们并不知道,我们平时都少写了一位,它默认为0了

chmod 0755 /path/to/二进制可执行文件

如果前面这位不为0,其实就可以设置,但不为0那要写多少呢?写4!如果一个二进制可执行文件的权限原来是755,则以下两句是等效的

chmod 4755 /path/to/二进制可执行文件
chmod u+s /path/to/二进制可执行文件

可是为什么要写4呢?这跟SGID和Sticky Bit也有关,它们是一起设计的,请看完SGIDSticky Bit后,再看使用数字的方式设置SUID/SGID/Sticky Bit权限的方法

SUID总结

看完前面的所有例子,理解了什么是SUID后,我们再来分析一下前面SUID的作用里说的这句话

SUID的作用是:当一个二进制可执行文件具有SUID权限时,用一个非该二进制可执行文件所有者的用户去执行该二进制可执行文件,该二进制可执行文件在执行期间会具有它的所有者的权限。

  • 二进制可执行文件特地加粗了,是否在强调,如果不是二进制可执行文件(比如你写个shell脚本也可以是可执行文件),是不是就没有作用呢?可以说是的!
    因为SUID其实就是为了让普通用户操作某些命令时(比如passwd命令)有权限做读取或者写入等操作的,而shell脚本本身是无法做这个操作的,它要做这个操作,需要依赖于其它二进制可执行文件命令,比如生成一个文件用touch,所以给非二进制文件添加SUID,其实是没什么用的。
    以下例子就说明了问题,当然最后内容没有改变,是因为touch生成的是空文件,如果原来有一个有内容的同名文件,它是不会覆盖的,我也没办法找到其它能创建非空文件的命令来说明,重定向符>虽然可以创建一个有内容的文件,但它貌似不是一个命令,也没法对它添加SUID权限,但给touch添加SUID权限后再执行test.sh没有报错,就说明它是可以的。
    -w470

  • 在执行期间也加粗了,是否在强调必须在执行期间SUID才有效?是的!SUID只用在执行期间,不执行的时候是没有任何作用的,所以,如果一个普通用户对一个具有SUID权限的二进制可执行文件没有执行权限时,这个SUID对这个用户起不到任何作用。

  • 其实如果一个用户对一个文件没有可执行权限时,这个文件是不是二进制文件已经不重要了,因为只有在执行期间SUID都会起作用,所以对于不可执行的文件来说(比如文本文件),你虽然可以给它添加SUID,但是这个SUID却不会起作用作用。

SGID

SGID的作用

SGID的作用1:当一个二进制可执行文件具有SGID权限时,用一个非该二进制可执行文件所属组的用户去执行该二进制可执行文件,该二进制可执行文件在执行期间会具有它的所属组的权限。

SGID的作用2:当一个目录具有SGID权限时,任意用户在该目录下创建的文件的所属组都与该目录的所属组相同(当然这个“任意用户”必须对该目录有r和x权限,因为这是一个用户在一个目录下创建文件的条件)。

举例说明SUID作用于可执行文件上

与SUID的s标记会标在二进制可执行文件所有者的x位上类似,SGID作用于二进制可执行文件时,s标记位会标在二进制可执行文件的所属组的x位上
-w460
解析:
首先可以看到,testdir这个目录只有所有者和所属组有写权限,而其它人没有写权限。

“laowang”这个用户明显属于其它人,所以它没有在这个目录下创建文件的权限,用它去运行test_linux这个二进制可执行文件,自然也就无法生成test.txt文件了。

test_linux添加SGID后,“laowang”运行它时,就具有它的所属组的权限,而它的所属组的权限是rwx也就是有写权限,所以能成功生成文件。

就作用于二进制可执行文件上来说,SGID与SUID没什么区别,只不过SGID作用在所属组上,而SUID作用于所有者上而已。

举例说明SGID作用于目录上

-w733

如上图所示,laowang加入了xiebruce组,所以它可以在权限为xiebruce:xiebruce的目录testdir2里创建文件,但是创建的文件的所有者和所属组都是“laowang”,这是常规操作,有点Linux基础的童鞋应该都知道。

但是,当我给testdir2目录添加了SUID后,再重复前面的创建文件动作,发现这次它创建的文件,所属组已经不是它自己,而是与testdir2所属组相同(即xiebruce)。

试过一下,如果有很多用户都向testdir2上传文件,那么它的用户组都会是xiebruce,而且xiebruce都有权限读写这些文件,如果不是这样的话,那么xiebruce要加入所有上传文件的用户的组才行读写他们的文件,算是比较麻烦!

设置SGID权限的方法

其实设置方法与SUID是一样的,只不过u变g而已

#添加SGID权限
chmod u+s /path/to/二进制可执行文件
#删除SGID权限
chmod u-s /path/to/二进制可执行文件

另一种方法,也是跟SUID一样,用数字方法设置,不同的是,SGID是设置为2,如果有一个可执行文件的权限是755,则以下两个命令的效果是一样的,为什么是设置2,后面再说

chmod u+s /path/to/二进制可执行文件
chmod 2755 /path/to/二进制可执行文件

SBIT

SBIT的作用

我们都知道,一个文件的权限分为所有者(owner),所属组(group),其它人(others),前面已经说过关于所有者的SUID和关于所属组的SGID了,根据推测,你是不是以为SBIT是作用于其它人?NO!并不是!

SBIT的作用是:如果一个目录设置了SBIT,那么用户在该目录下创建的文件,只能由它自己或者root用户来删除,其它用户无法删除。

举例说明SBIT的作用

-w497

首先你要知道,当一个用户对某个目录具有rwx权限时,它就可以删除这个目录下的文件,无论是否是它自己的(上图有示例,laowang可以删除xiebruce的文件)。因为对一个目录来说,r表示读取这个目录下的文件,x表示允许进入目录,而w,就是表示对目录的内容进行修改,而目录的内容就是文件,所以w权限其实就是添加或删除文件的权限。

但是当我对这个目录添加SBIT后,laowang删除xiebruce的文件就报“Operation not permitted”(操作不被允许)。


最典型的应用,就是/tmp/目录,如下图,可以看到它就是设置了SBIT的
-w403

设置SBIT权限的方法

chmod o+t /path/to/dir

当然也有数字的设置方法,SBIT是用1代表的,比如,dir目录的权限是777,那么以下两句是等效的

chmod o+t /path/to/dir
chmod 1777 /path/to/dir

设置SUID/SGID/SBIT的方法

其实前面都说过了,这里总体说一下。

SUID/SGID/SBIT的标记的位置,都是替换原来的x位置,SUID是用s替换文件所有者权限的x位,SGID也是用s,不过替换的是文件所属组权限的x位,而SBIT就不是用s了,而是用t,替换的是其它人权限的x位。

非数字方式

#添加/删除SUID
chmod u+s /path/to/file
chmod u-s /path/to/file

#添加/删除SGID
chmod g+s /path/to/file
chmod g-s /path/to/file

#添加/删除SBIT
chmod o+t /path/to/file
chmod o-t /path/to/file

数字方式

前面我们都知道了,数字设置方式,就是在常规的三位数字权限前再加一位数字,设置SUID用4,SGID用2,SBIT用1,只不过你可能不知道为什么,其实它是有规律的!

因为SUID/SGID/SBIT是分别设置到所有者、所属组、其它人里的的,我们把所有者、所属组、其它人按顺序排开,如下所示

# 如果设置SUID,则在所有者上标1,表示设置了,其它两个标0表示未设置(二进制都是用1和0表示是和否的),那么连起来就是100,转成八进制是4
  1     0     0
所有者 所属组 其它人

# 如果设置SGID,则在所属组上标1,其它两个标0,连起来是010,转成八进制,是2
  0     1     0
所有者 所属组 其它人

# 如果设置SBIT,则在其它人上标1,其它两个标0,连起来就是001,转成八进制,是1
  0     0     1
所有者 所属组 其它人

现在知道为什么设置SUID/SGID/SBIT分别用4/2/1代表了吧。

如果同时设置,相加就行了(这里只是从操作上说明是可以同时设置这三个权限的,但同时设置后是否有作用,你就要根据前面的定义去套了)

  • 同时设置SUID和SGID,那就是4+2=6,其实你用前面的方式也是一样的,110转成八进制也是6;
  • 同理,同时设置SUID和SBIT是4+1=5,用前面的方式就是101,转八进制也一样是5;
  • 还有就是SGID和SBIT是2+1=3,用前面的方式就是011,转成八进制就是3。

那数字方式怎么删除SUID/SGID/SBIT呢?其实非常简单,0就表示3个都不设置,不设置就是删除了,从7变成6,那就是减了1,说明删掉了SBIT,从7变成4,那就是删掉了SGID和SBIT只留下了SUID……

只不过要注意,这种方式属于同时设置SUID,SGID或SBIT与常规权限的,所以也要注意后面三位常规权限是否正确。

# 设置SUID
chmod 4755 /path/to/path

# 设置SGID
chmod 2755 /path/to/path

# 设置SBIT
chmod 1755 /path/to/path

# 同时设置SUID和SGID
chmod 6755 /path/to/path

# 同时设置SUID和SBIT
chmod 5755 /path/to/path

# 同时设置SGID和SBIT
chmod 3755 /path/to/path

参考:Linux 特殊权限 SUID,SGID,SBIT

打赏

订阅评论
提醒
guest

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

0 评论
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x

扫码在手机查看
iPhone请用自带相机扫
安卓用UC/QQ浏览器扫

Linux特殊权限SUID,SGID,SBIT