在复杂多变的生产环境中,单纯设置文件的 rwx 权限无法满足我们对安全和灵活性的需求,因此便有了 SUID、SGID 与 SBIT 的特殊权限位。这是一种对文件权限进行设置的特殊功能,可以与一般权限同时使用,以弥补一般权限不能实现的功能。
其实,SUID、SGID 与 SBIT 也有对应的数字表示法,分别为 4、2、1。也就是说 777 还不是最大权限,最大权限应该是 7777,其中第 1 个数字代表的是特殊权限位。rwxr-xr-x 即 755,而 SBIT 特殊权限位是 1,则合并后的结果为 1755。 如果权限是“rwsrwSr--”呢?大写 S 表示原先没有执行权限,因此一般权限为 rwxrw-r--,将其转换为数字表示法后结果是 764。带有的 SUID 和 SGID特殊权限的数字法表示是 4 和 2,心算得出结果是 6,合并后的结果为 6764。
权限 | 数字表示 |
---|---|
SBIT | 1 |
SGID | 2 |
SUID | 4 |
SUID 是一种对二进制程序进行设置的特殊权限,能够让二进制程序的执行者临时拥有所有者的权限(仅对拥有执行权限的二进制程序有效)。
例如,所有用户都可以执行 passwd 命令来修改自己的用户密码,而用户密码保存在/etc/shadow 文件中。仔细查看这个文件就会发现它的默认权限是 000,也就是说除了 root 管理员以外,所有用户都没有查看或编辑该文件的权限。但是,在使用 passwd 命令时如果加上 SUID 特殊权限位,就可让普通用户临时获得程序所有者的身份,把变更的密码信息写入到 shadow 文件中。
查看 passwd 命令属性时发现所有者的权限由 rwx 变成了 rws,其中 x 改变成 s 就意味着该文件被赋予了 SUID 权限。如果原先权限位上没有 x 执行权限,那么被赋予特殊权限后将变成大写的 S。
[root@servera ~]# ls -l /etc/shadow
----------. 1 root root 1309 Sep 19 15:04 /etc/shadow
[root@servera ~]# ls -l /bin/passwd
-rwsr-xr-x. 1 root root 34512 Aug 12 2018 /bin/passwd
一定要小心这个权限,因为一旦某个命令文件被设置了 SUID 权限,就意味着凡是执行该文件的人都可以临时获取到文件所有者所对应的更高权限。因此,千万不要将 SUID 权限设置到 vim、cat、rm 等命令上面!!!
[root@servera ~]# chmod -R u+s /usr/sbin/reboot #添加SUID权限
[root@servera ~]# chmod -R u-s /usr/sbin/reboot #删除SUID权限
SGID 特殊权限有两种应用场景:
即在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)
[root@servera ~]# mkdir /test
[root@servera ~]# ls -l / | grep test
drwxr-xr-x. 2 root root 6 Sep 24 22:08 test
[root@servera ~]# chmod -R 777 /test #给所有者,所属组和其他人全部权限
[root@servera ~]# chmod -R g+s /test #给属组添加继承属组权限
[root@servera ~]# ls -l / | grep test
drwxrwsrwx. 2 root root 6 Sep 24 22:08 test
切换至普通用户在该目录中创建文件,并查看新创建文件是否会继承新创建的文件所在的目录的所属组名称:
[zhangxu@servera /]$ cd /test/
[zhangxu@servera test]$ touch zhangxumk
[zhangxu@servera test]$ ls -l
-rw-rw-r--. 1 zhangxu root 0 Sep 24 22:13 zhangxumk
SBIT 特殊权限位可确保用户只能删除自己的文件,而不能删除其他用户的文件。
简单说当对某个目录设置了 SBIT 粘滞位权限后,那么该目录中的文件就只能被其所有者执行删除操作了。
与前面所学的 SUID 和 SGID 权限显示方法不同,当目录被设置 SBIT 特殊权限位后,文件的其他用户权限部分的 x 执行权限就会被替换成 t 或者 T—原本有 x 执行权限则会写成 t,原本没有 x 执行权限则会被写成 T。
RHEL 8 系统中的/tmp 作为一个共享文件的目录,默认已经设置了 SBIT 特殊权限位,因此除非是该目录的所有者,否则无法删除这里面的文件。由下可知,/tmp 目录上的 SBIT 权限默认已经存在,这体现为“其他用户”权限字段的权限变为 rwt:
[root@servera ~]# ls -ld /tmp/
drwxrwxrwt. 20 root root 4096 Sep 24 22:28 /tmp/
在以下情况下任何用户都可创建,删除,修改文件。
[root@servera ~]# mkdir /net
[root@servera ~]# chmod -R 777 /net
[root@servera ~]# ls -ld /net/
drwxrwxrwx. 2 root root 6 Sep 24 22:34 /net/
添加 o+s 后,切换到普通用户下,删除这个由其他人创建的文件,这时就会发现,即便读、写、执行权限全开,但是由于 SBIT 特殊权限位的缘故,依然无法删除该文件:
[root@servera /]# chmod o+t /net
[root@servera /]# ls -ld /net/
drwxrwxrwt. 2 root root 19 Sep 24 22:40 /net/