set-group-ID 位通常称为 setgid 或 SGID,有两项重要用途。对于可执行普通文件,它可以改变新进程的有效组 ID;对于目录,它会让新建目录项继承该目录的组,这对协作目录树尤其有用。
权限 · 第 6 课
Setgid
学习 set-group-ID 如何影响可执行文件凭据和共享目录中的组继承。
可执行文件上的 Setgid
长列表可以在组执行位置显示 setgid:
$ ls -l /path/to/program
-rwxr-sr-x 1 root operators 24576 Jan 10 09:30 /path/to/program
小写 s 表示 setgid 和组执行都已设置。大写 S 表示已设置 setgid,但没有组执行。
当内核在执行时采用该位,进程会根据可执行文件的组所有者获得有效组 ID。nosuid 挂载等控制可以抑制该行为,不能把它当作适用于每种文件类型和环境的普遍保证。
采用可执行文件上的 setgid 时,哪个凭据来自该可执行文件的组所有者?
目录上的 Setgid
目录上的 setgid 有不同用途。新文件和子目录通常会继承目录的组,而不是创建者的默认组。在 Linux 上,新子目录也会继承 setgid 位,帮助共享项目树保持一致的组。
Setgid 本身不会授予组写入权限。目录模式、进程 umask、请求的创建模式、默认 ACL 和其他控制仍然决定访问权限。
$ sudo chgrp developers /srv/project
$ sudo chmod g+s /srv/project
$ ls -ld /srv/project
drwxr-sr-x 2 root developers 4096 Jan 10 09:30 /srv/project
/srv/project 上的 setgid 通常会让新建文件继承什么?
设置和移除 Setgid
使用符号形式设置该位:
$ sudo chmod g+s myfile
使用开头的八进制 2,把它与普通模式位一起设置:
$ sudo chmod 2755 myfile
使用 chmod g-s myfile 可只移除该特殊位。
Setgid 会为开头的特殊位八进制数字贡献哪个值?
安全使用共享目录
对于协作目录,应组合预期的组所有者、setgid 和范围严格的访问位。以代表性用户测试创建操作,并用 ls -ld 检查结果。不要为了处理组共享问题就让目录树对所有人可写;专用组、适当的 umask 或默认 ACL,再加上 setgid 目录,通常能提供更清晰的控制。
只设置 setgid 是否会让组成员获得在目录中创建文件的权限?
课程已完成
你已完成 Setgid
现在,你可以区分 setgid 在可执行文件和目录上的含义。
在组执行位置识别 setgid。
把可执行文件 setgid 与有效组 ID 联系起来。
使用目录 setgid 在共享目录树中保持组所有权。
设置或移除该位,同时不要把它与普通写入访问混淆。