Назад | Перейти на главную страницу

Разрешение на чтение запрещено пользователю с разрешением группы ACL на чтение

Введение

Распространенный сценарий для веб-приложения с двумя общими папками. Один заполнен кодом, который выполняется сервером приложений, например 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