![澄清一些关于 Linux 目录权限的问题](https://linux22.com/image/543678/%E6%BE%84%E6%B8%85%E4%B8%80%E4%BA%9B%E5%85%B3%E4%BA%8E%20Linux%20%E7%9B%AE%E5%BD%95%E6%9D%83%E9%99%90%E7%9A%84%E9%97%AE%E9%A2%98.png)
我几乎羞于承认,在文件权限方面,有一件事我仍然不确定。
假设我有一个权限为 750 的目录 (drwxr.x...)。然后我在其中创建了一些权限为 644 的后代文件 (.rw.r..r..)。
系统中的任何其他用户(所有者或组之外的用户)是否可以读取该目录中的文件,为什么?一方面,这些文件具有全局可读位,因此这应该表明任何人都可以读取该文件。另一方面,上升目录不是全局可执行的(也不是可读的),因此只要这阻止了对目录内容的访问,文件的全局可读位就无关紧要。这绝对是真的吗?或者有什么办法可以解决这个问题?
现在,我似乎经常看到有人推荐 chmod -R o-rwx 或类似的东西。我相信,一个例子是在 Postfix 创建的 Debian Maildir 目录中 - 所有文件(不仅仅是目录)都已删除了全局/组读取权限。如果目录没有全局访问权限,是否真的有必要从内部文件中删除该全局读取位?我问这个问题是因为我正在尝试计划如何在服务器上设置 /var/www 并使其无法被全局读取,即其他本地用户无法读取。
答案1
是的,这些文件可以被读取,因为它们是全世界可读的,但如果目录不是全世界可读的,假设用户不属于该目录的拥有者组,则用户将需要另一个指向该文件的链接。例如:
cd directory
ln file /tmp
现在用户可以访问该文件,但必须使用 /tmp/file 进行访问。
答案2
您所问的问题与虚拟文件系统执行目录遍历的方式更相关。由于 Linux 系统上的所有内容都是文件,因此在处理目录时会产生特殊性。虽然它们具有执行字段,但尝试执行目录是毫无意义的。此外,在 ext2/3/4 文件系统中,所使用的数据结构与“真实”文件几乎没有相似之处。相反,权限在应用于目录时具有略微不同的含义。
- 读取——指定人员被允许打印所有目录条目的列表
- 写入——指定者被允许创建新的目录条目
- 执行——指定者被允许获取目录条目的 inode
了解了这些区别,我们可以看到,如果用户对特定目录的权限是,--x
那么我们就可以确定该用户有能力试图文件访问,但实际上无法查看目录条目本身。或者更简洁地说,根据 coredump,“使用 --x 你不能列表目录,但你能读取里面的文件如果文件权限允许它。”
了解了这些之后,我们以文件/home/user/public/file
为例。一般来说,人们不应该全局打开他们的主目录,但是他们想全局提供“公共”文件。因此,你应该这样设置权限:
/home
-- 755/home/user
-- 711(或者可能是 751)/home/user/public
-- 755
答案3
不,他们不能。所有的路径树到该文件也必须是可访问的。
[可以创建您无法看到其内容的目录,但您仍然可以读取其中的文件;即隐藏文件的目录,但没有像您的示例中那样具有 0750 权限]
不过,根据您希望的访问方式创建所有文件和目录更为安全。如果您将该文件从现有目录移至具有全球可读性的目录,那么您过去认为“受保护”的文件将突然不再受保护。如果您的文件权限也是 o-rwx,那么文件本身将受到保护,并且不会依赖目录来保护它。
答案4
这种行为很容易自我测试。
$ mkdir foo
$ echo readable > foo/bar
$ ls -ld foo/
drwxr-xr-x 2 sciurus sciurus 4096 2011-03-22 1329 foo/
$ ls -l foo/
total 4
-rw-r--r-- 1 sciurus sciurus 9 2011-03-22 13:29 bar
$ cat foo/bar
readable
$ chmod a-r foo
$ ls -ld foo/
d-wx--x--x 2 sciurus sciurus 4096 2011-03-22 1329 foo/
$ ls -l foo/
ls cannot open directory foo/: Permission denied
$ cat foo/bar
readable
$ chmod a+r foo
$ chmod a-x foo
$ ls -ld foo/
drw-r--r-- 2 sciurus sciurus 4096 2011-03-22 1329 foo/
$ ls -l foo/
ls cannot access foo/bar: Permission denied
total 0
-????????? ? ? ? ? ? bar
$ cat foo/bar
cat foo/bar: Permission denied