Linux中除了rwx权限外,另外还有三种特殊权限:SUID、SGID、SBIT
假如本来在该位上有x,则这些特别标志 (SUID,SGID,SBIT)显示为小写字母 (s,s,t)。否则显示为大写字母 (S,S,T) 。在数字权限上与rwx类似,对应三位数的二进制,有权限的位置上为1,无权限的位置上为0。SUID,SGID,SBIT分别表示4,2,1。并且需要在最前面增加一位。看个例子就懂了,/usr/bin/passwd的权限:
s出现在文件所有者的x权限上
1)SUID只能用于二进制可执行文件,对目录无效
2)执行者若具有该文件的x权限,则将具有文件所有者的权限
3)权限只在文件执行时有效,执行完毕不再拥有所有者权限
s权限的具体含义是,当某个文件的拥有者执行权限位是s的话,其他用户执行这个二进制时,在执行期间,用户获得文件拥有者的权限。需要注意的是,执行程序的用户本身要对这个程序有x权限。如果一个属于root:root的文件的权限是-rws------,那么让一般用户来执行还是没有权限的。必须改成-rws-----x才可。
使用SUID的场景比较经典的有“有限制地对文件进行读写”。比如有一个属于root的文件file,我希望其他用户可以在一定限制下对其进行读写。显然不能开放rw给他们。那么我可以这么做,将这个文件设置成只有root可读可写,然后写一个二进制程序(程序所有者得是root),在程序中做出读写的控制,而后把这个程序的所属者执行位设置为s。这样其他用户可以通过这个程序来对文件读写,做到了“有限制的读写”。这种做法有点类似于面向对象编程中的私有变量。不允许直接改变变量,但是留出setVar方法作为接口来改变变量值。
linux中用户改密码的机制就是通过SUID来实现的
在之前用户管理的学习中,创建用户后使用passwd命令来为该用户设置密码。通过which命令查看passwd命令的位置
使用passwd命令实则是通过执行/usr/bin/passwd来改变的密码,不过密码信息都放在/etc/shadow里面,这个文件只有root可读可强制写,即修改这个文件不能直接修改
普通用户只能通过/usr/bin/passwd这个二进制文件来进行,所以/usr/bin/passwd是具有SUID权限的一个文件
可以通过chmod 4xxx <文件名> 或用chmod u+s <文件名> 的方法来添加SUID权限
s出现在文件所属群组的x权限上
1)SGID和SUID不同,可以用于目录
2)使用者若有此目录的x,w权限,则可进入和修改此目录
3)使用者在此目录下的群组将变成该目录的群组,新建的文件,群组是此目录的群组。
SGID权限和SUID是类似的,无非是把“执行中具有文件所有者权限”改成了“执行中具有文件所有组的组员的权限”。
对于目录而言其效果是:首先用户要有对这个目录的读和执行权限,这样才能保证他能够进到目录中,然后用户在此目录下的所有动作,其有效用户组都是该目录的用户组;再次,如果用户对该目录有w权限,那么用户创建的所有新文件的用户组都和这个目录的用户组相同。
首先我们使用root用户在tmp目录下创建一个目录并且添加sgid特殊权限
可见,此目录的创建者是root,所属组是root
现在切换到普通用户,并且进入该目录创建一个文件和一个目录
用户组为root,也就是他们上层目录dir_sgid这个目录的所属用户组。
t出现在文件其他用户的x权限上
1)和SUID,SGID不同的是,只能用于目录
2)使用者在该目录下,仅自己与root才有权力删除新建的目录或文件
前提条件还是一样的,用户需要对目录有w和x权限,也就是说用户有在这个目录下新建和删除文件的权限,然后特别的地方在于,用户在这个目录下只能删除自己创建的文件和目录,对于别人创建的是不能删除的。
同样我们在tmp目录下创建一个目录并且添加sbit特殊权限
然后切换到一个普通用户,创建一个文件file1。然后切换到另一个普通用户
删除file1失败!
其实根目录下的/tmp目录就设置了SBIT
tmp目录本来就是用户存放不同用户的临时信息的,肯定不希望自己的信息被别的用户删除啊,所以要设置SBIT