File-Permissions
具有 ACL 組讀取權限的使用者拒絕讀取權限
介紹
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 沒有任何興趣。
所以有些事情正在發生,但我完全沒有想法。
答案在於使用者組必須對通向包含該文件的文件夾的每個文件夾具有列出或執行權限。
換句話說,解決方案如下:
$ 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