文件的特殊权限主要分为SetUID、SetGID、Sticky BIT三种。
本章节主要是学习SetUID。
1、SetUID的功能
- 只有可以执行的二进制程序才能设定SetUID权限(非可执行二进制文件并非不能设定,而是设定了也无意义);
- 命令执行者要对该二进制程序拥有x(可执行)权限;
- 命令执行者在执行该二进制程序时获得程序文件的所属者身份;
- SetUID权限只在改程序执行过程中有效(身份改变只是在程序执行过程中,执行结束后自动变化原来的身份);
以用户修改密码举例说明:
在前面章节 从零开始学习Linux(二十):用户配置文件 中,我们学习了用户使用passwd命令修改密码,会修改 /etc/shadow 文件。/etc/shadow 文件的权限是000,如下图所示:
继续查看ACL权限,也没有ACL权限,如下图所示:
按照之前我们学习到的知识,没有写权限,普通用户是不能够写入文件的。但是Linux系统中非root用户是可以修改密码的,即能够编辑 /etc/shadow 文件。这个就是通过本节SetUID权限实现的。
查看passwd文件的位置,并查看passwd文件的详细信息。如下图所示:
从图中我们可以看到2个比较怪异的地方:
(1)passwd命令背景是红色标记(Linux红色表示危险或错误);
(2)passwd所属者权限是rws(以前都是rwx);
权限s是以前没有看到的,s表示是SetGID权限。
使用cat命令查看shadow文件,整个执行过程如下图所示:
使用cat命令查看/etc/shadow文件和使用passwd命令修改/etc/shadow文件,整个过程对比如下图所示:
到这我们已经说清楚了SetUID权限的功能(类似于Windows系统中的以管理员身份运行,不尽相同)。
2、设定SetUID的方法
2.1、方法一
命令格式:chmod -R 4755 文件名(-R 也可以不加);
说明:4表示SetUID权限,权限可以理解为有4位,之前我们一直设置为三位,是因为首位我们几乎不会用到。首位4表示SetUID权限,首位2表示SetGID权限,首位1表示Sticky BIT权限。
执行命令:
chmod -R 4755 neimenggu
执行过程如下图所示:
可以看到以前的权限是 -rwxr-xr-x+,执行命令后权限是 -rwsr-xr-x+ 。
2.2、方法二
命令格式:chmod -R u+s 文件名(-R 也可以不加);
3、取消SetUID的方法
3.1、方法一
命令格式:chmod -R 755 文件名(-R 也可以不加);
去除首位权限,只保留三位权限位。
3.2、方法二
命令格式:chmod -R u-s 文件名(-R 也可以不加);
执行命令:
chmod -R u-s neimenggu
可以看到,执行命令后,权限从 -rwsr-xr-x+ 又变回 -rwxr-xr-x+。
再次为neimenggu文件赋予rw-r--r--(4644)权限,然后再次查看文件详细信息:
从图中可以看到权限为既不是rwx也不是rws,是rwS。我们说过Linux是严格区分大小写的,所以这显示S不是显示错误。
S表示错误的SetUID权限,要想设置SetUID权限的前提是文件具有执行权限。我们对文件设置rw-r--r--权限,没有执行权限,所以会报错!!!
4、危险的SetUID
SetUID权限非常危险,没有特殊需求不要设置SetUID权限。
对系统中默认具有SetUID权限的文件作一列表,定时检查有没有这之外的文件被设置了SetUID权限。