7.11 设置和清除sgid

chmod g[+-]s

suid密切相关的是sgidsgid权限既适用于文件,也适用于目录。对于文件,sgidsuid的功能类似,只不过用户是以组的权限执行文件,而不是以拥有者的权限执行文件。例如,系统中的crontab命令就可能设置为sgid,以便用户就能够让cron为他们运行程序。不过,是以更加受限的crontab组,而不是以无所不能的root用户来运行程序。

  1. $ ls -l /usr/bin/crontab
  2. -rwxr-sr-x 1 root crontab ... /usr/bin/crontab

对于目录,sgid则会做些有趣的事情:任何后来在该目录中创建的文件都属于分配给该目录的组。下面的示例会将这些阐述得更明白。

假设有三个用户,Alice、Bob和Carol,他们都是admins组的成员。Alice的用户名是alice,她的主要组也是alice,这在大多数Linux系统中很常见。Bob和Carol也遵循同样的模式,他们的用户名和主要组分别是bobcarol。如果Alice在admins组共享的目录中创建了一个文件,那么这个文件的拥有者和用户组就是alice,这意味着admins组的其他成员将不能写该文件。然而,在Alice创建新文件以后,她可以运行chgrp admins document(或chown :admins document)修改权限,但是这样很快就会变得相当烦琐。

不过,如果将共享目录设置为sgid,那么任何在该目录中创建的新文件的拥有者仍然是创建该文件的用户,但其用户组会自动地分配为共享目录的用户组。在这个例子中,为admins组。这样,Alice、Bob和Carol都能够读取和编辑在共享目录中创建的任何文件,而且实现的途径也最简捷。

同样,可以使用字母表示法或数字表示法设置sgid。使用字母时,设置sgid与设置suid类似,只是这里使用的是g,而不是u。将sgid应用于目录,如下所示。(不过记住当用于文件时,其处理过程也是一样的。)

  1. $ ls -lF
  2. drwxr-xr-x 11 scott admins ... bin/
  3. $ chmod g+s bin
  4. $ ls -lF
  5. drwxr-Sr-x 11 scott admins ... bin/

说明 或许你可能看到在表示设置了sgid权限时既使用了s,也使用了S。在设置sgid之前,如果用户组已经具有了执行权限(x),结果就会看到s;而S表示在设置sgid之前,还没有为用户组设置执行的权限。最终的结果是一样的,但是字母的大小写能够告诉你最初的情形是什么样的。

删除sgid权限的过程差不多就是与添加相反的过程。

  1. $ ls -lF
  2. drwxr-Sr-x 11 scott admins ... bin/
  3. $ chmod g-s bin
  4. $ ls -lF
  5. drwxr-xr-x 11 scott admins ... bin/

如果你还没有阅读7.11节,那么可以回去看看,因为7.11节介绍了在表示拥有者权限的数字之前,另外出现那个神秘的第四位数字的来龙去脉。对于suid,那个数字是4;对于sgid,这个数字是2。

  1. $ ls -lF
  2. drwxr-xr-x 11 scott admins ... bin/
  3. $ chmod 2755 bin
  4. $ ls -lF
  5. drwxr-Sr-x 11 scott admins ... bin/

删除sgid的方法和删除suid的方法是一样的,在开头输入0,就去掉了sgid权限。

  1. $ ls -lF
  2. drwxr-Sr-x 11 scott admins ... bin/
  3. $ chmod 0755 bin
  4. $ ls -lF
  5. drwxr-xr-x 11 scott admins ... bin/

说明 你已经知道在sgid目录中创建新文件将会发生什么,不过,也要小心sgid对其他的文件系统处理的影响。如果使用cp命令将文件复制到sgid目录,新复制过来的文件能够获得目录的用户组。但是如果用mv命令将文件移动到sgid目录,文件将仍然保持它当前所属的用户组,并不会获得目录的用户组。最后,如果用mkdir命令在sgid目录中创建新目录,它不仅能够继承sgid目录所属于的用户组,其本身也将拥有sgid权限。