一.学习的内容
1、先介绍两个重要命令
1.1chmod命令
chmod命令用于设置文件的一般权限和特殊权限。命令格式:chmod [参数] 文件名称
例如,要把一个普通文件的权限设置成其所有者可读可写可执行、所属组可读可写、其他人没有任何权限,则相应的字符法表示为rwxrw----,其对应的数字法表示为760。
设置目录文件时,要加上 -R 参数 ,如图2 所示:
使用chmod命令设置特殊权限的参数如表1所示。
参数 | 作用 |
u+s | 设置SUID权限 |
u-s | 取消SUID权限 |
g+s | 设置SGID权限 |
g-s | 取消SGID权限 |
o+t | 设置SBIT权限 |
o-t | 取消SBIT权限 |
1.2 chown命令
chown命令用于设置文件的所有者和所属组。
命令格式:chown [参数] 所有者:所属组 文件名
下面使用“所有者:所有组”的格式把 anaconda-ks.cfg 文件的所属信息轻松修改一下,变更后的效果如下:
针对目录进行操作时需要加上大写参数-R来表示递归操作,即对目录内所有的文件进行整体操作。
2、SUID
在复杂多变的生产环境中,单纯设置文件的rwx权限无法满足我们对安全和灵活性的需求,因此便有了SUID、SGID与SBIT的特殊权限位。这是一种对文件权限进行设置的特殊功能,可以与一般权限同时使用,以弥补一般权限不能实现的功能。下面具体解释这3个特殊权限位的功能以及用法。
SUID是一种对二进制程序进行设置的特殊权限,能够让二进制程序的执行者临时拥有所有者的权限(仅对拥有执行权限的二进制程序有效)。
例如,所有用户都可以执行passwd命令来修改自己的用户密码,而用户密码保存在/etc/shadow文件中。仔细查看这个文件就会发现它的默认权限是000,也就是说除了root管理员以外,所有用户都没有查看或编辑该文件的权限。但是,在使用 passwd命令 时如果加上SUID特殊权限位,就可让普通用户临时获得程序所有者的身份,把变更的密码信息写入到shadow文件中。
查看passwd命令属性时发现所有者的权限由rwx变成了rws,其中x改变成s就意味着该文件被赋予了SUID权限。如果原先权限位上没有x执行权限,那么被赋予特殊权限后将变成大写的S。
3、SGID
SGID特殊权限有两种应用场景:当对二进制程序进行设置时,能够让执行者临时获取文件所属组的权限;当对目录进行设置时,则是让目录内新创建的文件自动继承该目录原有用户组的名称。
SGID的第一种功能是参考SUID而设计的,不同点在于执行程序的用户获取的不再是文件所有者的临时权限,而是获取到文件所属组的权限。
如果现在需要在一个部门内设置共享目录,让部门内的所有人员都能够读取目录中的内容,那么就可以在创建部门共享目录后,在该目录上设置SGID特殊权限位。这样,部门内的任何人员在里面创建的任何文件都会归属于该目录的所属组,而不再是自己的基本用户组。此时,用到的就是SGID的第二个功能,即在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)。
在使用上述命令设置好目录的777权限(确保普通用户可以向其中写入文件),并为该目录设置了SGID特殊权限位后,就可以切换至一个普通用户,然后尝试在该目录中创建文件,并查看新创建的文件是否会继承新创建的文件所在的目录的所属组名称:
4、SBIT
现在,大学里的很多老师都要求学生将作业上传到服务器的特定共享目录中,但总是有几个“破坏分子”喜欢删除其他同学的作业,这时就要设置SBIT(Sticky Bit)特殊权限位了(也可以称之为特殊权限位之粘滞位)。具体来说,当目录被设置了粘滞位(Sticky Bit)时,在该目录下创建的文件只能被文件所有者、目录所有者和超级用户删除。这意味着即使其他用户拥有对该目录的写权限,也不能删除其他用户创建的文件,除非他们是该文件的所有者或者是超级用户。
创建三个独立的用户,lxw1、2、3,然后将 /home/lxw1 文件的权限设置为 rwxrwxrwt 。如下图所示:
然后,切换到 lxw1 用户,并在家目录下创建文件 test1
接着,切换到 lxw2 用户,并进入到 /home/lxw1 目录下创建文件 test2
最后,切换到用户lxw3,并创建test3
我们做以上准备是为了验证,在 目录为 rwt 权限时,它内部的文件能被谁删除。下面我们切换到 lxw3 用户,试着删除上面创建的三个test
最后,发现只能删除自己创建的 test3 文件,而其他两个无法删除。
下面我们,切换到用户 lxw1 ,然后试着删除这三个文件。
最后发现,用户lxw1 不仅能删除test1 ,还能删除另外两个。这是因为 lxw1 是 /home/lxw1 的所有者。通过上面两个实验,验证了:当目录被设置了粘滞位(Sticky Bit)时,在该目录下创建的文件只能被文件所有者、目录所有者和超级用户删除。
切换回root管理员的身份下,在家目录中创建一个名为linux的新目录,随后为其设置SBIT权限:
上述代码中的o+t参数是在一般权限已经设置完毕的前提下,又新增了一项特殊权限。如果我们想将一般权限和特殊权限一起设置,有什么高效率的方法么?
其实,SUID、SGID与SBIT也有对应的数字表示法,分别为4、2、1。也就是说777还不是最大权限,最大权限应该是7777,其中第1个数字代表的是特殊权限位。既然知道了数字表示法是由“特殊权限+一般权限”构成的,现在就以上面linux目录的权限为例,为大家梳理一下计算方法。
在rwxr-xr-t权限中,最后一位是t,这说明该文件的一般权限为rwxr-xr-x,并带有SBIT特殊权限。对于可读(r)、可写(w)、可执行(x)权限的数字计算方法大家应该很熟悉了—rwxr-xr-x即755,而SBIT特殊权限位是1,则合并后的结果为1755。
再增加点难度,如果权限是“rwsrwSr--”呢?首先不要慌,大写S表示原先没有执行权限,因此一般权限为rwxrw-r--,将其转换为数字表示法后结果是764。带有的SUID和SGID特殊权限的数字法表示是4和2,心算得出结果是6,合并后的结果为6764。我们试着设置为 linux 文件设置这个权限,输出结果如下图所示。使用ls 命令查看文件权限,发现确实变成了 rwsreSr--
将权限的数字表示法转换成字符表示法的难度略微高一些,这里以5537为例讲解。首先,特殊权限的5是由4+1组成的,意味着有SUID和SBIT。SUID和SGID的写法是,原先有执行权限则是小写s,如果没有执行权限则是大写S;而SBIT的写法则是,原先有执行权限是小写t,没有执行权限是大写T。一般权限的537进行字符转换后应为r-x-wxrwx,然后在此基础上增加SUID和SBIT特殊权限,合并后的结果是r-s-wxrwt。
二.本次学习遇到的问题
/usr/bin/passwd 和 /bin/passwd 有什么区别?
三、问题的答案及解决办法
在RHEL 8中,/usr/bin/passwd 和 /bin/passwd 是同一个命令的不同路径,都用于更改用户密码。它们指向同一个二进制文件,因此在功能上是相同的。通常来说,/bin/passwd 是对应的更早的传统路径,而/usr/bin/passwd 则是更现代的路径。
注意:SBIT能直接通过 数字表示的方法改回去,而 SUID、SGID只能通过 u-s和g-s改回去