Linux下的三个特殊权限

Linux下的三个特殊权限,第1张

估计很多人都知道 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考证

读(read),写(write),执行r(recute)简写即为(r,w,x),亦可用数字来(4,2,1)表示

举例:如果某文件权限为7则代表可读、可写、可执行(4+2+1).

若权限为6(4+2)则代表可读、可写。

权限为5代表可读(4)和可执行(1).

权限为3代表可写(2)和可执行(1)。

下图中文件所有者(属主)为root,所有组(属组)为root,文件名为install.log,权限为的第一个减号“-”代表的是文件类型:

-:普通文件,d:目录文件,l:链接文件,b:设备文件,c:字符设备文件,p:管道文件

文件的权限为rw-r-r-也就是分别表示所有者(属主)有读写权限,所有组(属组)有读权限,其余人也仅有读权限。

普通文件即实际保存数据的地方,其并不具备删除自身的权限:

r:可读取文件的实际内容

w:可编辑、新增、修改该文件的实际内容

x:可被执行

目录文件即保存有目录结构和文件权限:

r:可读取目录结构和权限

w:可更改目录结构列表、新建、删除、重命名、转移子文件、目录

x:表示用户可进入到该目录中

1.可读权限r

表示具有读取/阅读文件内容的权限。

2.可写权限w

表示具有新增、修改文件内容的权限。

①如果没有r,用vi编辑器,输入“:wq!"可以强制覆盖,但原文件内容会被清除因此可以使用echo追加内容到文件。

②删除文件(修改文件名等)的权限是受父目录的权限控制,和文件本身的权限无关,文件名在父目录的block里。

3.可执行权限x

表示具有执行文件的权限。

①文件本身要能够执行。

②普通用户必须还要有r权限才能够执行,无r就不能执行。

③root即使没有r权限,只要有x权限就能执行。

④root用户位没有执行权限,但只要其他权限位还有x权限,那它就能执行。


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

原文地址:https://54852.com/yw/8621169.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存