前段时间,在 IRC 聊天中,我所在的频道中的一位用户建议某人将目录设置为 setuid,以便它继承文件上的用户 ID,以解决其他人遇到的问题。当时我开口说“linux 不支持 setuid 目录”。之后,给出建议的人向我展示了一个 pastebin (http://codepad.org/4In62f13) 他的系统遵守目录上设置的 setuid 权限。
解释一下,当我说“Linux 不支持 setuid 目录”时,我的意思是您可以执行“chmod u+s 目录”,它将在目录中设置位。但是,Linux(据我理解)忽略了此位(在目录中)。
尽管我尽力了,但我还是无法完全复制该 pastebin。有人曾经向我建议,也许可以使用 selinux 模拟该行为 - 并且尝试使用规则,可以强制文件使用 uid,但不能从 setuid 目录权限(我可以看到)。在互联网上阅读的信息相当不详 - 大多数地方都声称“不,目录上的 setuid 不适用于 linux”,偶尔会说“在特定情况下可以做到”(例如:http://arstechnica.com/etc/linux/2003/linux.ars-12032003.html)
我不记得最初的那个人是谁,但最初的系统是 Debian 6 系统,它运行的文件系统是使用“default,acl”挂载的 xfs。我尝试过复制它,但到目前为止没有成功(到目前为止尝试过各种版本的 Debian、ubuntu、fedora 和 centos)
有人能告诉我什么或如何让系统尊重目录的 setuid 吗?
答案1
目录的 Setuid 行为与 setgid 不同。除非 shell 输出来自 FreeBSD,有人觉得无聊,想拿你开个玩笑。
在 UNIX 和 Linux 系统上,目录上的 setuid 权限设置会被忽略。[4] 可以将 FreeBSD 配置为将其解释为类似于 setgid,即强制所有文件和子目录归顶级目录所有者所有。[5]
在 FreeBSD 中,目录的行为就像其 setgid 位始终被设置一样,无论其实际值如何。如 open(2) 中所述,“当创建新文件时,会为其指定包含该文件的目录的组。”
http://en.wikipedia.org/wiki/Setuid#setuid_and_setgid_on_directories
答案2
部分答案/解决方法:
我也尝试过同样的方法,但我决定不再抗拒,而是尝试另一种方法。我尝试的是访问控制列表,以设置默认权限。(注意:您可能需要先启用它们)。
setfacl -R --set-file=- . <<EOF
# file: testdir/
# owner: testuser
# group: testgroup
user::rwx
group::rwx
group:normaluser:rwx
mask::rwx
other::r-x
default:group::rwx
default:group:normaluser:rwx
default:mask::rwx
default:other::r-x
EOF
这里使用 testuser 来运行测试,普通用户可以删除结果,而不必每次都使用 root 权限。
答案3
从 RHELman chmod
chmod 会保留目录的设置用户 ID 和设置组 ID 位,除非您明确指定其他方式。您可以使用符号模式(如 u+s 和 gs)设置或清除这些位,也可以使用数字模式设置(但不能清除)这些位。
如果我没记错的话,从数字上讲,chmod 4711 ./dir
添加了设置的 UID 位,chmod 2711 ./dir
添加了设置的 gid 位,因此6711
设置了 uid + gid 继承,如 pastebin 中的演示所示。
根据手册页chmod u+s
==chmod 4XXX
和chmod g+s
==chmod 2XXX