在文件夹上设置 ACL 递归执行权限使文件可执行

在文件夹上设置 ACL 递归执行权限使文件可执行

运行 Ubuntu 20.04 LTS,运行 Nginx 1.18.0 和 PHP-FPM 来为网站提供服务。

我在 中创建一个新文件夹作为文档根目录/var/www,由 FPM 用户拥有foo,该文件夹将托管一个站点:

$ sudo mkdir foo
$ sudo chown -R foo:foo
$ sudo chmod -R u=rwX,g=rX,o= foo
$ sudo chmod -R g+s foo
$ ls -la

drwxr-s--- ... foo foo ... foo

我将Nginx添加到foo组中,但由于我不希望它能够写入,所以我将组权限设置为rX上面。

我设置了默认 ACL。我希望所有新文件默认都具有相同的权限:

$ sudo setfacl -Rm d:u::rwX foo
$ getfacl foo

user::rwx
group::r-x
other::---
default:user::rwx
default:group::r-x
default:other::---

我特别确保使用rwX,因为我希望目录可遍历,但默认情况下不使文件可执行。

现在,爱丽丝和鲍勃想要在那里做一些事情,所以我将他们都添加到foo组中:

$ sudo usermod -aG foo bob
$ sudo usermod -aG foo alice

我给鲍勃访问权限。我想添加 ACL 覆盖,以便 Alice 和 Bob 作为foo组中的人类用户能够进行写入。鲍勃首先:

$ sudo setfacl -Rm u:bob:rwX,d:u:bob:rwX foo
$ getfacl foo

user::rwx
user:bob:rwx
group::r-x
mask::rwx
other::---
default:user::rwx
default:user:bob:rwx
default:group::r-x
default:mask::rwx
default:other::---

鲍勃测试了他新发现的神力:

$ touch foo/bobfile
$ ls -la foo

drwxrws---+ ... foo  foo  ... .
drwxr-xr-x  ... root root ... ..
-rw-rw----+ ... bob  foo  ... bobfile

我尽职尽责地注意到,ls现在显示bobfile为具有组写入权限,但我知道这只是因为ls代表适用于至少一个实体的最高可用权限,不是每个用户都拥有的。

我给爱丽丝访问权限。我希望她拥有与鲍勃相同的权限:

$ sudo setfacl -Rm u:alice:rwX,d:u:alice:rwX foo
$ getfacl foo

user::rwx
user:bob:rwx
user:alice:rwx
group::r-x
mask::rwx
other::---
default:user::rwx
default:user:bob:rwx
default:user:alice:rwx
default:group::r-x
default:mask::rwx
default:other::---

现在爱丽丝可以执行鲍勃的文件。啊?

$ ls -la foo

drwxrws---+ ... foo  foo  ... .
drwxr-xr-x  ... root root ... ..
-rw-rwx---+ ... bob  foo  ... bobfile*

事实上,Alice 现在可以执行foo/bobfile.同时,所有者 Bob 无法执行他自己的文件(本应如此)。

如果 Alice 现在创建一个新文件,她也无法执行它 - 只能执行它bobfile,在添加她的 ACL 时该文件已经存在。

有趣的是,Bob 也无法执行 Alice 的文件。对我来说,这表明了 ACL 默认条目和非默认条目之间的区别。

我似乎误解了两件事:

  1. x与 的重要性X,至少在 ACL 方面是这样。为什么 Alice 在这里获得现有文件的执行权限?

  2. ACL 默认规则与非默认规则的重要性,因为添加 ACL 条目X使现有文件可执行,但不能执行新文件。

达到预期结果的正确命令是什么?


更新:事情变得更奇怪了。

出现上述结果后,我删除了所有文件的执行权限:

$ sudo chmod -R ug-x+X foo

这按预期进行。

不过,我随后删除了 Alice 的 ACL 条目:

$ sudo setfacl -Rx u:alice,d:u:alice foo

你猜怎么了?这使得所有文件都bob可以alice执行:

$ ls -la foo

-rw-rwx---+ ... alice foo ... alicefile*
-rw-rwx---+ ... bob   foo ... bobfile*
-rw-rw----+ ... foo   foo ... foofile

这些文件的测试执行显示:

  • alice 现在再次能够执行拥有的文件bob
  • 鲍勃现在能够执行以下拥有的文件alice
  • foo 现在可以执行alicebob的文件。
  • alice 和 bob 都不能执行自己的文件
  • 两者都不能执行拥有的任何文件foo

我很感激这里的任何帮助和见解,因为我完全被这种行为难住了。谢谢。


注意:我之前发布过这个服务器故障在意识到这可能是更好的地方之前。如果这违反了任何规则,请告诉我,我将删除其他问题。

相关内容