我指的是以下内容Arch Linux Access_Control_Lists 文档
它指出:
向 Web 服务器授予私有文件的执行权限
以下技术描述了如何向 Web 服务器等进程授予对驻留在用户主目录中的文件的访问权限,而不会因授予全世界访问权限而损害安全性。
下面我们假设 Web 服务器以 http 用户身份运行,并授予其访问 geoffrey 的主目录 /home/geoffrey 的权限。
第一步是为用户http授予执行权限:
setfacl -m "u:http:--x" /home/geoffrey
注意:进程需要目录的执行权限才能列出目录的内容。
因此,在上面的示例中,他们为 http 用户设置 /home/geoffrey 目录的执行权限。根据我的理解,仅授予目录上的执行位将不允许您列出目录的内容,但它允许您访问文件(如果您知道它们的名称+目录中给定文件的权限将拥有正确的权限)套)。那么,http 用户(或他们所指的进程)如何setfacl -m "u:http:--x" /home/geoffrey
能够列出目录的内容呢?我缺少什么?
先感谢您!
答案1
您需要-x
目录的权限才能访问该目录及其中的任何文件。但是,您对目录下文件的访问取决于文件的权限,而不是目录本身。只要您对父目录(目录)具有执行权限,就不需要任何其他内容来访问它包含的文件。通过一个例子可以很容易地证明这一点:
$ sudo mkdir dir1 && echo "Hello world!" | sudo tee dir1/file1 && sudo chmod 700 dir1
Hello world!
$ ls -ld dir1/
drwx------ 2 root root 4096 Apr 12 16:09 dir1/
$ sudo ls -l dir1/
total 4
-rw-r--r-- 1 root root 13 Apr 12 16:09 file1
只有root
访问权限,因此如果我们尝试列出目录的内容或 cat 文件,它将失败:
$ ls dir1/
ls: cannot open directory 'dir1/': Permission denied
$ cat dir1/file1
cat: dir1/file1: Permission denied
cat
请注意,即使我具有对该文件的读取访问权限,该操作也会失败。现在,如果我授予用户对该目录的执行访问权限,然后重试,我可以读取该文件:
$ sudo chmod 711 dir1/
$ ls -l
total 4
drwx--x--x 2 root root 4096 Apr 12 16:09 dir1
$ cat dir1/file1
Hello world!
我仍然无法列出目录的内容,因为这需要对该目录的读取访问权限,但现在只要我知道其路径,我就可以读取该目录中的任何文件。
所以,这里的基本想法是合理的,只是最后的注释令人困惑。您需要读取访问权限才能列出内容,但如果您只需要授予用户http
对路径已知的特定文件的访问权限,则执行访问权限就足够了。
虽然措辞很糟糕,但该注释并不完全错误,只是不完整。您确实需要执行权限才能完全列出目录的内容。如果没有它们,您可以看到文件名但看不到属性:
$ ls -l
total 4
drwxr--r-- 2 root root 4096 Apr 12 16:09 dir1
$ ls -l dir1/
ls: cannot access 'dir1/file1': Permission denied
total 0
-????????? ? ? ? ? ? file1
答案2
您没有遗漏任何内容:虽然本文档的大部分内容都是正确的,但注释是错误的。
它可以跨越您的主目录,进入另一个目录。该其他目录可能是可读且可交叉的,因此列出了其内容。
我认为让你的家只能交叉是一个好主意,但我也认为你是对的,对其功能的描述是错误的。
- 您需要读取权限才能列出目录中的文件名。
- 您需要对该文件的交叉权限
stat
(找出有关该文件的任何信息,或打开它)。
您提交了错误报告吗?