7.10 设置和清除suid

chmod u[+-]s

在7.6节中介绍了几种可能的权限。主要介绍的是rwx,因为它们是最常用的几种权限,不过其他权限迟早也会遇到。我们先来看看suid,它只适用于可执行文件,不能用于目录。

在设置suid以后,用户就可以使用拥有者的权限执行这个文件了,就好像是程序的拥有者在运行它一样。使用suid的一个常见例子是passwd命令的权限设置,这个命令可以让用户设置和修改他们的密码。

  1. $ ls -l /usr/bin/passwd
  2. -rwsr-xr-x 1 root root ... /usr/bin/passwd

可以看到passwd设置了suid权限,因为在用户的x权限位置,现在有一个s权限。passwd的拥有者是root用户,但是有必要让普通用户也能运行这个命令,否则他们就不能修改自己的密码。为了让所有人都能执行passwd命令,需要为用户、组及系统的其他用户都设置x权限。不过,这还不够。答案是将passwd设成suid root,这样所有人都能以root用户的权限运行这个命令。

说明 或许你已经看到用sS都可以表示设置了suid。在设置suid之前,如果拥有者已经具有执行权限(x),就会看到s;而S则表示在设置suid之前,拥有者没有执行的权限。最终的结果是一样的,但是字母的大小写能够告诉你最初的情形是什么样的。

有两种办法可以用于设置和取消suid,即字母表示法和数字表示法。字母表示法如下所示:

  1. $ pwd
  2. /home/scott/bin
  3. $ ls -l
  4. -rwxr-xr-- 1 scott admins ... backup_data
  5. $ chmod u+s backup_data
  6. $ ls -l
  7. -rwsr-xr-- 1 scott admins ... backup_data

现在admins组的任何成员都能够运行backup_data脚本,好像他们就是用户scott一样。但是要注意,任何非admins组的成员都不能运行这个程序,因为他们只有程序的读权限。如果有必要让系统中的每个用户都能够作为scott来运行backup_data脚本,那么就应该把权限设置成-rwsr-xr-x

使用u-来代替u+即可删除suid

  1. $ ls -l
  2. -rwsr-xr-- 1 scott admins ... backup_data
  3. $ chmod u-s backup_data
  4. $ ls -l
  5. -rwxr-xr-- 1 scott admins ... backup_data

使用八进制权限表示法设置suid要更复杂些,这是因为它在原来使用的数字权限表示法中引入了新的一位数字。回想一下,数字权限表示法使用了3个数字,第一个数字表示拥有者的权限,第二个表示组用户的权限,第三个则表示其他人的权限。其实在拥有者数字的左边还有第四个数字。只不过在绝大多数情况下,这个数字为0,所以没有必要显示或使用它。换句话说,chmod 644 libby.jpgchmod 0644 libby.jpg是完全相同的。只有在修改suid(或sgid、sticky bit,随后几节将详细介绍)时,才需要第四位数字。

要将suid的数字设置为4,可以按如下所示的方法来修改backup_data

  1. $ pwd
  2. /home/scott/bin
  3. $ ls -l
  4. -rwxr-xr-- 1 scott admins ... backup_data
  5. $ chmod 4754 backup_data
  6. $ ls -l
  7. -rwsr-xr-- 1 scott admins ... backup_data

要删除suid,只要将这一位数字设置为0,就能将权限设置回默认状态,不设置suid权限。

  1. $ ls -l
  2. -rwsr-xr-- 1 scott admins ... backup_data
  3. $ chmod 0754 backup_data
  4. $ ls -l
  5. -rwxr-xr-- 1 scott admins ... backup_data

说明 作为普通用户,一般很少需要将程序的权限修改为suid。它的使用通常都与root用户拥有的程序有关,但是对此有所了解仍然是件好事情,以备在偶尔需要时能派上用场。