一、文件特殊权限
文件特殊权限:SetUID,SetGID,Sticky BIT。
这三个文件不是太安全,是Linux系统应对特殊情况所准备的权限,给Linux系统的一些特殊命令提供的。不推荐用户手动来设置,尤其是SetUID。这三个选项了解一下就好。
我们之前说过umask值的时候,如下:
[root@localhost ~ ] # umask
0022
可以看到umask值是一个4位数,后三位是我们之间讲过的基本权限(读写执行),第一位我们之前空过去了,如果忘记了,可以查看https://www.jianshu.com/p/04b8613210ad
现在来说一下,第一位就是定义SetUID,SetGID,Sticky BIT
,这三个特殊权限的。
还有一点,我们之前说过,普通用户是可以修改自己的密码的,但是我们查看下面两个文件,/etc/passwd
文件和/etc/shadow
文件。
我们知道/etc/passwd
文件存放着用户的信息,/etc/shadow
文件中存放着用户的密码。但是我们可以看到/etc/shadow
文件的权限是000
,也就是说普通用户对这个文件是没有任何操作权限的,不能看也不能打开,也不能写。
但是我们知道密码的修改,最终是要写入/etc/shadow
文件中的。那用户对/etc/shadow
文件没有任何权限,那怎么是把密码最终写入到/etc/shadow
文件中呢。
这个奥秘就是passwd
命令中,我们查看一下passwd
命令。
可以看到所有者权限中,有一个标识为小s
的权限,我们之前说的基本权限,读写执行分别为rwx
。这个小s
权限标识,就是表示该文件有SetUID
特殊权限。
- 为什么要给
passwd
命令设置SetUID
特殊权限?
/usr/bin/passwd
命令拥有特殊权限SetUID,也就是在属主的权限位的执行权限上是小s
。可以这样来理解它:当一个具有执行权限的文件设置SetUID权限后,用户执行这个文件时将以文件所有者的身份执行。
/usr/bin/passwd
命令具有SetUID权限,所有者为root(Linux中的命令默认所有者都是root)
也就是说当普通用户使用passwd
命令,更改自己密码的时候,实际是在用passwd
命令所有者root的身份在执行passwd
命令,root当然可以将密码写入/etc/shadow
文件(不要忘记root这个用户什么事都可以干),所以普通用户也可以修改/etc/shadow文件,命令执行完成后该身份也随之消失。
总结:passwd
命令有SetUID权限,为的就是普通用户修改自己密码的时候,执行passwd
命令能够修改/etc/shadow
文件。
如果取消SetUID权限,则普通用户就不能修改自己的密码了。
小s
权限标识在所有者位的时候,特殊权限位SetUID
。
小s
权限标识在所属组位的时候,特殊权限位SetGID
。
小t
权限标识在其他人位的时候,特殊权限位Sticky BIT
。
二 、SetUID
1、SetUID是什么
SetUID的功能可以这样理解(SetUID如果可以想正确执行)
(1)只有可以执行的二进制程序(自己写的脚本也可以,只要是执行文件就行)才能设定SUID权限。
如果给非执行文件赋值SetUID,如下
#给abc文件赋值SetUID权限
[root@localhost ~ ] # chmod u+s abc
g+s是给组赋值SetGID权限,和基本权限赋值是一样的。
查看abc文件信息
可以看到abc文件的所有者权限上有一个大S
权限。表示abc文件没有什么作用,因为该文件不是一个可执行文件。可以理解成小s = 大s + x(执行权限)
。
(2)命令执行者要对该程序拥有x(执行)权限
查看passwd
命令,普通用户对于passwd
命令是属于其他人权限组里。其他人的权限中是有执行权限的。
SetUID权限是,必须是用户在执行的时候SetUID权限才生效。
(3)命令执行者在执行该程序时获得该程序文件属主的身份(在执行程序的过程中灵魂附体为文件的属主)
看上边一中的《为什么要给passwd
命令设置SetUID
特殊权限?》问题,有解释。
(4)SetUID权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效
注意:Linux系统自带的命令赋予了特殊权限,一般没有什么问题,很安全。最危险的是自己写的脚本赋予了特殊权限,不建议手动赋予。