Распространенный сценарий для веб-приложения с двумя общими папками. Один заполнен кодом, который выполняется сервером приложений, например uwsgi, а другой - статическим контентом, непосредственно доставляемым веб-сервером, например nginx.
На сервере Debian учетная запись пользователя для веб-сервера - это www-данные, в то время как сервер приложений обычно уникален для каждого приложения. Это означает, что в файле кода может быть следующий 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-данными:
$ 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
Изменение владельца и группы файла на 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