如了解 UNIX 权限和文件类型中所述,每个文件都有以下权限设置(“文件模式”):
- 所有者/用户(“
u
”), - 所有者的组 ("
g
"),以及 - 其他所有人(“
o
”)。
据我了解,文件的所有者始终可以使用chmod
. 任何在所有者下运行的应用程序也是如此。
如果所有者可以随时更改权限,那么限制所有者自己的权限的原因是什么?
我能看到的唯一用途是防止意外删除或执行,如果有意的话,很容易克服。
此处提出了一个相关问题:存在“所有者”权限是否有原因?组权限还不够吗?它讨论了为什么所有者的权限不能被由单个用户(所有者)组成的虚拟组替换。相比之下,这里我问的是原则上对所有者拥有权限的目的,无论是通过单独的“ u
”八进制还是单独的组+ ACL来实现。
减少所有者的权限有多种原因(尽管很少低于组的权限)。
最常见的是对不打算执行的文件没有执行权限。很多时候,shell 脚本是旨在从其他脚本(例如 your
.profile
)获取的片段,作为顶级进程没有意义。命令完成只会提供可执行文件,因此正确的权限有助于交互式 shell。意外覆盖文件是一个很大的风险 - 它可能通过错误输入命令发生,或者在 GUI 程序中更容易发生。从我的相机复制文件时,我做的第一件事就是使它们(及其包含的目录)不可写,因此我所做的任何编辑都必须是副本,而不是覆盖原始文件。
有时文件甚至不可读是很重要的。如果我升级我的 Emacs 并且我的目录中的本地包有问题
~/lisp
,我会选择性地禁用它们(使用chmod -r
)直到它可以成功启动;然后我可以在修复兼容性问题时一次使它们可读。一组正确的用户权限表示有意。尽管用户可以更改权限,但表现良好的程序不会这样做(至少,不是不先询问)。与其将权限视为限制用户,不如将其视为限制用户进程在给定时间点可以执行的操作。
您似乎在这里遗漏了一个相当重要的观点:行为良好的进程不会到处修改他们有权访问的文件的权限。
ls
不会随机使您指向的目录可读,以便它可以列出目录内容。ssh
如果它们是错误的,将不会“修复”权限~/.ssh
或它包含的文件,它只会拒绝运行。并且通常可以安全地假设您可能使用的任何程序都以这种方式表现良好。这意味着通常会尊重为所有者在给定文件上设置的权限(除非您是 root 用户或以其他方式能够短路 DAC 检查(例如
CAP_DAC_OVERRIDE
在 Linux 上),因为理智的程序只信任内核来检查权限),因此保护给定文件免受意外修改或执行通常很有用。虽然这可以相对容易地克服,但用户必须明确地做一些事情来克服它。IOW,它作为另一个确认步骤来表明“是的,我真的很想这样做。”。更一般地说,由于通常会尊重所有者权限,因此您可以使用它们做许多有用的事情:
.desktop
文件标记为不受信任)。正如您所建议的,大多数时候我这样做是为了防止意外删除/修改。但是,有时我这样做是为了对某个树中的所有文件/目录执行批量修改,除了我“保护”的文件/目录。
受限所有者权限在受限环境中很有用,在这些环境中用户无权访问更改权限的工具。
典型的例子是匿名 FTP 服务器。您可以创建一个“保管箱”目录,其中所有者具有写入权限但没有读取权限。这允许匿名用户上传文件,但不会列出其他用户上传的文件。同时,该目录对其组是可读的,因此我们会将允许从该目录中检索的用户放在该组中。如果 FTP 服务器不提供
chmod
命令,则匿名用户无法覆盖此命令并授予自己列出目录的权限。