我想确保我的系统用户无法对文件 +x 进行 chmodding,并且我不希望 /home/ 或 /var/ 中的任何内容可执行。
我无法将它们放在单独的分区上。
运行 Ubuntu 9.04 Server。
答案1
我本来要建议对 chmod 或类似的内容使用一个包装器,但是我越想越觉得,用户最终会找到解决这个问题的方法(从另一个盒子 scp 一个可执行文件,或者运行 perl -s "chmod('FILE');" 等等...
所以,我认为 FS 方法是最好的。既然你说你不能将它们移动到新的文件系统,那么使用 --bind mount 在没有执行权限的情况下“重新挂载”/home 和 /var 怎么样?
mount -o noexec --bind /var /var
mount -o noexec --bind /home /home
我不确定这是否会有效,但看起来很有希望......
编辑:
好吧,我喜欢这个答案给我的漂亮、闪亮的“好答案”徽章,但在玩了它之后,我认为它不会起作用。我最初的测试是在旧的(2.4.9)内核上进行的,“在其自身之上挂载”功能似乎有效。我用较新的内核(2.6.18)再次尝试,但似乎不起作用。我开始寻找解决方法(例如将 /var 和 /home 重命名为其他名称,然后重新挂载它们。但我没有取得很大进展,因为我在较新的机器上的挂载手册页中找到了以下内容:
请注意,文件系统挂载选项将保持与原始挂载点上的选项相同,并且不能通过传递 -o 选项和 --bind/--rbind 来更改。
哦好吧...--bind 仍然是一个有趣的选择......
答案2
我能想到两种方法,一种是肮脏的,一种是好的。让我们从肮脏的方法开始。
编写一个 shell 脚本,定期作为 cronjob 运行,例如每 5 分钟或 10 分钟运行一次。它将明确删除这两个目录中所有文件的 exec 标志,即
chmod -R ugo-x /home /var
更好的方法是在文件系统级别执行此操作。创建新分区来容纳 var 和 home,无论如何这都被认为是最佳实践。然后将“noexec”选项添加到 mount。这将在文件系统级别阻止执行存储在这些目录中的文件。
答案3
这是一个完美的例子,说明应该这样回答这类问题:
您似乎已经想出了一个解决复杂问题的方法,现在正在询问如何实施该解决方案的具体问题。您能否描述一下您试图解决的原始问题?
我的经验是,系统管理员知道何时用“什么?为什么?”来回应请求非常重要。重要性取决于用户描述原始问题或尝试提出自己的解决方案并寻求帮助实施的倾向。在某些环境中,这是昂贵的灾难性糟糕解决方案与廉价的好解决方案之间的区别。
答案4
猜测你也可以使用 inotifywait 和 -r、-m 和 -e attrib 选项来重置 -x 标志(如果用户设置了该标志)