一个Web应用程序的常见情况,它有两个常规文件夹。 一个填充了应用程序服务器执行的代码,例如uwsgi,另一个填充由Web服务器直接提供的静态内容,例如nginx。
在Debian服务器上,Web服务器的用户帐户是www-data,而应用程序服务器通常每个应用程序都是唯一的。 这意味着在代码文件中可以有以下的acl:
# file: code/main.py # owner: user # group: user user::rwx group::rwx group:app-server:rwx other::---
静态文件可以具有以下ACL:
# file: static/bootstrap.css # owner: user # group: user user::rwx group::rwx group:app-server:rwx group:www-data:r-- other::---
这怎么可能是一个具有这些权限的文件:
$ sudo getfacl /srv/domain/django/static_files/bootstrap/css/bootstrap.css getfacl: Removing leading '/' from absolute path names # file: srv/domain/django/static_files/bootstrap/css/bootstrap.css # owner: user # group: user user::rwx group::rwx group:www-data:r-- group:app-server:rwx group:user-organization:rwx mask::rwx other::---
不能被www-data读取:
$ sudo -u www-data cat /srv/domain/django/static_files/bootstrap/css/bootstrap.css cat: /srv/domain/django/static_files/bootstrap/css/bootstrap.css: Permission denied
当用户www-data显然是同名组的成员时:
$ id www-data uid=33(www-data) gid=33(www-data) groups=33(www-data)
事实上,放弃一切控制,允许任何人阅读,没有任何帮助的情况:
$ sudo chmod 774 /srv/domain/django/static_files/bootstrap/css/bootstrap.css $ sudo getfacl /srv/domain/django/static_files/bootstrap/css/bootstrap.css getfacl: Removing leading '/' from absolute path names # file: srv/domain/django/static_files/bootstrap/css/bootstrap.css # owner: user # group: user user::rwx group::rwx group:www-data:r-- group:app-server:rwx group:user-organization:rwx mask::rwx other::r-- $ cat /srv/domain/django/static_files/bootstrap/css/bootstrap.css cat: /srv/domain/django/static_files/bootstrap/css/bootstrap.css: Permission denied
使用chown和chgrp将文件的所有权和组更改为www-data不会改变结果。 我在dmesg,messages或auth.log中找不到任何兴趣。
所以有些事情正在发生,但我全都没有想法。
答案在于,用户组必须对包含该文件的文件夹前的每个文件夹具有列表或执行权限。
换句话说,解决scheme如下:
$ sudo setfacl -mg:www-data:X /srv/domain $ sudo setfacl -mg:www-data:X /srv/domain/django $ sudo setfacl -R -mg:www-data:rX /srv/domain/django/static_files