Linux特殊权限之suid、sgid、sbit权限

suid权限让程序以所有者身份运行。
上周刚处理一个系统漏洞,就是suid程序被利用的。

sgid权限让子文件属组跟父目录一样。
我手上这个项目用sgid管理共享文件很实用。

sbit权限管目录,防止别人乱删文件。
比如公共下载区就得设粘滞位。

suid最危险,sgid次之,sbit最安全。
我个人习惯用sudo替代suid。

怎么看你觉得哪个用得多?

Linux特殊权限 SUID、SGID、Sticky

哦对对对,这三种权限啊,是得好好说道说道。

首先是SUID,这个啊,关键得看文件类型。
你指定得是二进制可执行文件才行,普通文件弄这个没用。
比如说,2 02 2 年我在北京,搞了个小脚本,是个二进制文件,我要给这个文件加个SUID。
那好,你得对这文件有执行权限,不然怎么运行呢?这个很重要。

然后啊,当你用这个加了SUID的文件运行起来之后,你想想,这个进程是谁的?不是你当前登录的用户,而是这个文件原来的所有者。
就比如,我那个脚本文件,我给它加SUID了,那我运行它,进程就变成了脚本文件原来的所有者。
这就有点厉害了,比如一个普通用户,他本来没法执行某个需要root权限的操作,但他运行了一个加了SUID的程序,那这个操作就由程序的所有者,也就是root来执行了。
明白吧?
所以你看,SUID就是给普通用户一个临时的机会,让他能执行那些需要更高权限的操作,但这个机会只限于运行那个特定的二进制文件时有效。

SGID呢,这个跟SUID有点像,但也不同。
SGID可以加在二进制文件上,也可以加在目录上。
加在二进制文件上呢,跟SUID差不多,也是让进程的宿主变成文件原来的属组。
还是拿那个北京的小脚本举例,如果我对它加SGID,那当我运行它时,进程的所有者还是我,但进程的属组就变成了脚本文件原来的属组。
默认情况下,你创建文件,属组就是你自己的主组,对吧?所以加了SGID,就相当于这个进程是以文件原来的属组身份运行的。

那如果SGID加在目录上呢?这个就特别实用了。
比如说,我在公司,我们搞了个共享目录,所有项目成员都需要往里面写东西。
如果我对这个目录加SGID,那好,任何有写权限的人往这个目录里创建文件,这个文件的属组就不是他自己的,而是这个目录的属组。
这样,所有项目成员都能看到彼此创建的文件了。
这就叫协作目录,很常见。

最后是Sticky位,这个啊,只能加在目录上,文件上加没意义。
它主要是防止有人乱删别人的文件。
默认情况下,如果你有写权限到一个目录,你就可以删除里面任何文件,不管文件是谁的。
但如果你给目录加Sticky位,那就不一样了。
只有文件的所有者,或者root,才能删除自己文件或者root文件的。
其他人就算有写权限,也不能随便删。
想想看,比如公共的浏览器缓存目录,你就得加Sticky位,不然别人都能把你浏览器缓存删了,多不方便。

所以你看,这三种权限,SUID是让进程以文件所有者身份运行,SGID是让进程以文件属组身份运行,Sticky是保护目录里的文件不被随意删除。
都是很有用的东西,用对地方,能省不少事。

Linux中的特殊权限:SUID、SGID和 Sticky Bit

SUID就是程序执行时临时用所有者权限。
上周刚处理一个sudo提权问题。

SGID是目录里文件默认继承组。
我手上这个项目用得挺多。

StickyBit保护目录防止误删文件。
数据我记不清了,但大概是这样。

你自己看。