3.2.6 文件特殊属性:SUID/SGID/Sticky

在介绍SUID之前,让我们来看一个奇怪的问题:通过前两章的学习我们已经了解到,每个用户都可以使用passwd(该命令的绝对路径是usrbin/passwd)来修改自己的密码。系统用于记录用户信息和密码的文件分别是etcpasswd和etcshadow,命令passwd执行的最终结果是去修改etcshadow中对应用户的密码。对于这个文件,只有root用户有读权限,而普通用户在修改自己的密码时,最终也会修改这个文件。注意,虽然etcshadow文件对于root用户来说只有读权限,但是实际上root是可以使用强写的方式来更新这个文件的。但是普通用户在运行这个命令时居然有权限来写etcshadow文件,怎么可能呢?先来确认一下etcpasswd和etcshadow的文件属性,从而确定普通用户根本没有写权限:


  1. [root@localhost ]# ls -l etcpasswd
  2. -rw-r--r-- 1 root root 1379 Dec 10 04:41 etcpasswd
  3. [root@localhost ]# ls -l etcshadow
  4. -r-------- 1 root root 859 Dec 10 04:41 etcshadow

再来看一下usrbin/passwd的权限,发现有个特别的s权限在用户权限上,这就是奥秘所在——该命令是设置了SUID权限的,这意味着普通用户可以使用root的身份来执行这个命令。那么以上的疑问就很容易解释了。但是必须注意的是,SUID权限只能用于二进制文件。确认一下usrbin/passwd的权限:


  1. [root@localhost ~]# ll usrbin/passwd
  2. -rwsr-xr-x 1 root root 22984 Jan 7 2007 usrbin/passwd

下面是给一个二进制文件添加SUID权限的方法:


  1. [root@localhost ~]# chmod u+s somefile

介绍完SUID之后,想必再来理解SGID就很容易了:如果某个二进制文件的用户组权限被设置了s权限,则该文件的用户组中所有的用户将都能以该文件的用户身份去运行这个命令,一般来说SGID命令在系统中用得很少,给一个二进制文件添加SGID权限的方法如下:


  1. [root@localhost ~]# chmod g+s somefile

Sticky权限只能用于设置在目录上,设置了这种权限的目录,任何用户都可以在该目录中创建或修改文件,但是只有该文件的创建者和root可以删除自己的文件。RedHat或CentOS系统中的/tmp目录就拥有Sticky权限(注意看权限部分的最后是t),如下所示:


  1. [root@localhost ~]# ll -d tmp
  2. drwxrwxrwt 3 root root 4096 Jan 4 04:53 tmp

举个例子,用户john登录后,在/tmp下创建了一个文件john_file,然后,用户jack也登录到系统中进入/tmp目录,他试图删除这个文件,系统会告诉他没有权限删除这个文件,如下所示:


  1. #
  2. 用户john
  3. 登录到系统中并创建了tmpjohn_file
  4. [john@localhost ]$ cd tmp
  5. [john@localhost tmp]$ touch john_file
  6. #
  7. 用户jack
  8. 登录到系统中试图删除tmpjohn_file
  9. [jack@localhost ]$ cd tmp
  10. [jack@localhost tmp]$ rm john_file
  11. rm: remove write-protected regular empty file 'john_file'? y
  12. rm: cannot remove 'john_file': Operation not permitted

给一个目录添加t权限的方式如下:


  1. [root@localhost ~]# chmod o+t somedir