![在文件夹上设置 ACL 递归执行权限使文件可执行](https://linux22.com/image/212615/%E5%9C%A8%E6%96%87%E4%BB%B6%E5%A4%B9%E4%B8%8A%E8%AE%BE%E7%BD%AE%20ACL%20%E9%80%92%E5%BD%92%E6%89%A7%E8%A1%8C%E6%9D%83%E9%99%90%E4%BD%BF%E6%96%87%E4%BB%B6%E5%8F%AF%E6%89%A7%E8%A1%8C.png)
运行 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 默认条目和非默认条目之间的区别。
我似乎误解了两件事:
x
与 的重要性X
,至少在 ACL 方面是这样。为什么 Alice 在这里获得现有文件的执行权限?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 现在可以执行
alice
和bob
的文件。 - alice 和 bob 都不能执行自己的文件
- 两者都不能执行拥有的任何文件
foo
我很感激这里的任何帮助和见解,因为我完全被这种行为难住了。谢谢。
注意:我之前发布过这个服务器故障在意识到这可能是更好的地方之前。如果这违反了任何规则,请告诉我,我将删除其他问题。