首先说 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考证
首先我们讲讲linux 权限问题。linux权限从左至右,第一位数字代表文件所有者的权限,第二位数字代表同组用户的权限,第三位数字代表其他用户的权限。
而具体的权限是由数字来表示的。
读取的权限等于4,用r表示;
写入的权限等于2,用w表示;
执行的权限等于1,用x表示;
我们可以通过4、2、1的组合,得到以下几种权限:
0(没有权限);
4(读取权限);
5(4+1 | 读取+执行);
6(4+2 | 读取+写入);
7(4+2+1 | 读取+写入+执行)
以755为例: 第一位7等于4+2+1,rwx,所有者具有读取、写入、执行权限;
第二位5等于4+1+0,r-x,同组用户具有读取、执行权限但没有写入权限;
第三位5,同上,也是r-x,其他用户具有读取、执行权限但没有写入权限。
下面列出常用的linux文件权限:
444 r--r--r-- 所有组只有读取权限
555 r -xr -xr -x 所有组都是读取和执行权限
666 rw-rw-rw- 所有组只有读取和写入权限
777 rwxrwxrwx 所有组都有读取和写入和执行权限
600 rw------- 第一个组有读取和写入权限
644 rw-r--r-- 所有组都有写入和读取权限,第一个组有读取和写入权限
700 rwx------ 第一个组有读写执行权限其它没有权限
744 rwxr--r-- 第一个组有读写执行权限 第二第三有读取和写入权限
写了这么多 可能有错 自己检查下吧。就是自己组合下!今天就讲到这里!
755 rwxr-xr-x
基本上就是全部开放读写执行 *** 作权限……
一个文件有三个权限,分别是读、写和执行,它们对应的数分别是4、2和1。
如果某个用户只有读权限没有写和执行权限当然就是4,如果三个如果有读和执行权限就是5(4+1)……所以有全部权限就是7了。
而一个文件或文件夹面对的用户分三类:所属用户、所属用户的组其他用户以及组外用户。
所以777三个数字就是对应这三个用户对象全部都有读、写、执行权限。
如果是所属用户有全部权限,组员有读和执行权限,而组外用户只有读权限,那数字应该就是754……
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)