Linux特殊权限 SUID、SGID、Sticky

Linux特殊权限 SUID、SGID、Sticky,第1张

文件的特殊权限有三种:1、suid2、sgid3、sticky,其中,suid和sgid用于累加提升权限,简单来说就是如果原来的用户可以访问,反而切换到的用户或者组不能访问,这时候照样是可以访问的,下面介绍下这三种权限。

SUID:

1、需要注意的是,只对二进制可执行程序有效,不能为普通文件

2、发起者对程序文件必须拥有执行权限

3、启动为进程之后,其进程的宿主为原程序文件的宿主

4、SUID设置在目录上毫无意义。

SGID:

可以应用在二进制文件和作用在文件夹下,当作用在二进制文件下时,作用和SUID相似,只不过SUID是把发起者临时变为文件的所有者,而SGID是把进程的发起者变成源程序文件的属组,默认情况下,用户创建文件时,其属组为此用户所属的主组,当SGID作用在目录下时,则对此目录有写权限的用户在此目录中创建的文件所属的组为此目录的属组,通常用于创建一个协作目录。

Sticky:

默认情况下用户可以删除具有写权限的目录中的任何文件,无论该文件的权限或拥有权,如果在目录设置Sticky位,只有文件的所有者或root**可以删除该文件,Sticky位是作用在文件夹的,设置在文件上毫无意义。

估计很多人都知道 rwx 三个权限,但是可能不知道 SUID, SGID, SBIT 这三个特殊权限,这里我就讲讲吧。有的时候,你想用 ACL ,或者在执行文件里检测执行者的ID,这些方法,来解决的问题,可以用这三个特殊权限解决 

首先说 SUID 这个权限,仔细看,s 在什么位置?

估计很多人都知道 rwx 三个权限,但是可能不知道 SUID, SGID, SBIT 这三个特殊权限,这里我就讲讲吧。有的时候,你想用 ACL ,或者在执行文件里检测执行者的ID,这些方法,来解决的问题,可以用这三个特殊权限解决

首先说 SUID 这个权限,仔细看,s 在什么位置?

我们知道,rwx 这三个权限,是一个权限占一格,如果没有x的权限,就会变成一条横杠(rw-),而不是变成两个权限(rw)。

由此可以看出,这个 s 必然与 x (执行)有关。

先看下passwd这个程序,当你执行passwd的时候,你其实就是修改密码,但是,密码是存在 shadow 这个文件里的,权限 rw------- ,除了root ,谁能改这个文件里的内容?但是,实际情况是,任何用户都能通过 passwd 这个程序,修改自己的密码。

如果你想到,这个 s 与提权有关,恭喜你,猜对了!

这个s,全称Set UID。那么,这个 SUID 有什么作用呢?

就是使有 Set UID 权限的可执行文件的执行者,变成这个文件的 own 。比如说,前面说到的修改密码,就是通过执行者变成这个文件的own实现的。

不过,SUID 也有限制的!

首先,是仅对可执行文件有效。如果不是可执行文件,你给它 s 权限,也没有意义。

其次,运行者要对这个文件有执行权限。比如说,如果你把passwd这个bin的权限改成 rws------ ,那么,别的用户也是无法运行的。

最后,这个权限仅在运行具有s权限的可执行文件时有效,也就是你 passwd 里密码一改完,你又变会原来的用户了!

接下来,说第二个,SGID。

刚刚说的 SUID 是变成那个文件的 own ,这个就是变成那个文件的 Group 了!总的来说,对于可执行文件方面,与 SUID 几乎一样,只是 own 不变,group 变了。

有个特殊条件:

执行这个bin的用户要对其有执行权限的。

其实这个与上面的 SUID 是一样的。

但是,它与SUID不一样,它对目录有效。

如果一个用户要进入某个目录,需要对这个目录有两个权限,一个是 r ,一个是 x 。

那如果我进了一个有 SGID 权限的目录呢?

在这个目录里创建的文件的属主全部是那个目录的属主了(当然需要对目录有w权限)!这个非常适合团队开发。

这么做的意义在哪儿呢

防止用户修改其他用户的密码么

-----------------------------------------

举个例子,如果你有一台http服务器,你想使其以最低权限运行,怎么办呢?

其中,一个方案就是,开一个账户,比如说www,给它很小的权限,然后设置apache/nginx以这个用户跑。

但是!!!如果我以root这个用户运行 apache 或者 nginx ,它就会继承 root 权限,怎么才能避免呢?用SUID,设置apache/nginx的bin的属主为 www ,权限 rwsr--r-- ,不管谁启动这个bin,它都会以这个用户来跑。

回到你刚刚说到的问题,当你运行了passwd以后,其实是继承了你的身份在跑,一个在以 user:user 这个身份跑的程序,怎么修改 /etc/shadow 这个文件呢?就要给执行者提权,而且密码一改好,立刻回归普通用户的权限,即保证了密码能顺利改好,又能保证非root用户看不到 shadow 里的内容

你看,ps出来有两个passwd进程,因为 SUID 权限的存在,使得 passwd 的执行者变成了root,而下面的 grep 进程,依然是 fyyz 的。

这是第三个特殊权限,通常 /tmp 里可以体现。

tmp 目录是放临时文件的,可以近似地理解为内存里的文件,注意,是近似地理解,不是说它就是内存(虽然tmp可以挂到内存里去)!如果某个程序跑到一半,突然它的临时文件被删了,程序基本上就崩溃了。怎么办?就要用第三种特殊权限了,SBIT。

SBIT只对目录有效。

如果使用者对拥有SBIT权限的目录有读写权限时,能在这个目录里读写,文件的属主是自己。

但是!!仅有文件的属主与 root 才有权力删除SBIT权限下的目录里的文件。

你们自己试试看:

进入 /tmp 当中(不要以root身份)

touch test,并且更改 test 权限成为 777

通过su切换到另一个用户(别切换到root)

尝试删除 test 这个文件

你会发现,无法删除这个文件! 

这三种高级权限,怎么设置呢?

首先,KDE 的 Dolphin 里可以在高级权限里设置

你看,这个高级权限窗口里的可以勾选的三个权限,就是我刚刚说的,SUID,SGID,SBIT。

如果是命令行里,怎么设置?

你或许看到有些软件里表示权限(一下子想不起来linux下有哪些软件,但是我记得winscp这个软件里就是这样),用的是 -755 这种样子,最前面的 - 是什么?就是特殊权限位!

SUID,SGID,SBIT 分别对应 4 2 1 ,如果你要给一个文件 SUID 权限,那就:

要注意的是,s 权限必须要有 x 作为铺垫,没有x的话。。。

s 就会大写,这就相当于一个报错。  

现在,我来简单总结下。

SUID 就是让执行者的身份变成文件的own,只对bin有效。

SGID 就是让执行者的组变为文件的组,对bin有效;也可用于目录,目录里创建的所有文件的属组都是那个组。

SBIT 仅对目录有效,目录里创建的所有文件,只有文件的属主和root才能删除。

SUID,SGID,SBIT 分别对应 4 2 1,可以用 chmod 修改文件的权限。

转自 嘉为教育-rhce认证_rhce培训_linux培训_linux认证_linux考证


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8358477.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-15
下一篇 2023-04-15

发表评论

登录后才能评论

评论列表(0条)

保存