Обычный сценарий для веб-приложения, в котором есть две общие папки. Один заполнен кодом, который выполняется сервером приложений, например uwsgi, а другой - статическим контентом, непосредственно доставляемым веб-сервером, например nginx.
На сервере Debian учетная запись пользователя для веб-сервера - 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 явно является членом группы с таким же name:
$ 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
Изменение владельца и группы файла на www-data с помощью chown и chgrp не меняет результата. Я не нашел ничего интересного в dmesg, messages или auth.log.
Итак, что-то происходит, но у меня нет идей.
Ответ заключается в том, что группа пользователей должна иметь разрешения на перечисление или выполнение для каждой папки, ведущей к папке, содержащей файл.
Другими словами. решение было следующим:
$ sudo setfacl -m g:www-data:X /srv/domain
$ sudo setfacl -m g:www-data:X /srv/domain/django
$ sudo setfacl -R -m g:www-data:rX /srv/domain/django/static_files