为什么在目录上忽略 setuid?

Bla*_*ing 20 linux file-permissions

在 Linux 系统上,您可以成功chmod u+s $some_directory,但不是u+s像您期望的那样强制新子目录和文件的所有权成为包含目录的所有者(并设置子目录),系统只是忽略 setuid 位。子目录和文件继续继承其创建进程的 UID,子目录默认不是 setuid。

为什么目录上的 setuid 被忽略,我怎样才能让系统识别它?

Isa*_*tch 17

回想一下 setuid 和 setgid 位是为完全不同的目的而发明的:使可执行文件以其所有者的 uid 或 gid 运行,而不是运行文件的用户的 uid 或 gid。任何其他用途只是一个额外的功能。

这些位对不可执行的普通文件不起作用。(由于安全问题,还有一些发行版上的 shell 脚本。)最初,它们也没有目录功能。显然有人认为在目录上使用未使用的 setgid 并使用它来强制执行组所有权的一致性会很酷。毕竟,如果您在玩组所有权,那是因为有不止一个人在处理该文件,并且给定目录中的所有文件都属于同一个组可能是有意义的,无论是谁创建的。由于有人忘记运行 newgrp 的麻烦被消除了。

那么,为什么不为 setuid 和文件 uid 实现相同的功能呢?嗯,uid 比 gid 更基本。如果你实现了这一点,通常一个文件将不属于创建它的用户!据推测,用户仍然可以修改文件(假设 umask 是正常的),但他们无法更改权限位。很难看出它的效用。

  • 我很想在愚蠢的一致性上引用爱默生的话。在您说服我这是一个理想的功能之前,您必须向我展示一个有意义的用例。 (4认同)
  • FreeBSD [chmod(2)](http://www.freebsd.org/cgi/man.cgi?query=chmod&sektion=2) 实际上对此有一些讨论,但只提到它通常不应该使用,因为未指明的“安全漏洞”。我怀疑大多数其他 Unix 没有采用此功能,因为虽然它确实有一些用例,但它并不是*那* 非常有用。 (2认同)
  • “很难看出它的实用性”-> 设置在主目录上,因此以 root 身份运行的配置脚本不会忘记意外地 chown 某些内容? (2认同)
  • @IsaacRabinovitch 我并不是说这一定值得实现该功能,但这是我遇到的一个用例。将文件从远程计算机复制到运行守护程序的服务器会自动读取和写入该文件。我向守护进程用户授予权限的实际解决方案涉及使用 rsync 的 `--chmod` (因为我的 umask 是 0022)。但解决此问题的一种更简单的方法(如果实现了该功能)是在守护程序正在监视的目录上设置 setuid 位。顺便说一句,我的系统也不支持 setgid 位,因此这也不是一个可行的选择。 (2认同)

小智 8

我相信这个问题的答案与导致大多数现代类 Unix 操作系统不允许“文件赠品”的“文件赠品”安全问题有关。“文件赠品”是指非超级用户将文件的所有权更改为该用户以外的其他人。这种能力为恶作剧提供了许多机会。

由于文件赠品是不允许的,因此目录上的 setuid 是不允许的,如果设置了,它将以另一种形式执行相同的功能,或者将其忽略。

至于更改行为,您必须修改操作系统库和实用程序。