如何允許 www-data 創建文件夾而不授予對父文件夾的讀取權限
我不確定要問的問題是否正確,所以我將嘗試解釋我正在嘗試做的事情。
我有一個內部 Web 應用程序(在 PHP 中),我希望能夠創建一個文件夾。問題是 Apache 使用者 www-data 無權訪問我希望在其中創建文件夾的父文件夾。
我認為授予 www-data 對父文件夾的訪問權限是不合適的,所以我想知道是否可以在 www-data 可以執行的某個地方創建一個腳本,該腳本比 www-data 具有更多權限。該腳本將簡單地執行以下操作(虛擬碼):
FOLDER_NAME = sanitise(<arg-val-1>) mkdir /some-path/$FOLDER_NAME
在哪裡適合創建此腳本,以及 www-data 將如何以 root 身份執行它?(或者,有沒有更好的方法來解決這個問題?)
我正在執行 Debian Linux。
你不能以一種有用的方式做你所說的事情,但毫無疑問,有一些足夠接近的東西會做你真正想做的事情。
即使您安排創建目錄,
www-data
使用者仍然無法訪問/some-path/subdirectory
,因為子目錄只能通過父目錄訪問。(有一些方法可以解決這個問題,但我不推薦任何方法。您可以擁有一個可以同時訪問/some-path
並/some-path/subdirectory
更改為的程序/some-path/subdirectory
,然後刪除權限;生成的程序仍然能夠訪問其目前目錄(但不能通過其絕對路徑) . 您可以將目錄綁定掛載到另一個位置,但如果您要這樣做,您不妨在其他位置創建目錄。)將這些目錄安排
www-data
在至少可以訪問(x
權限位)的目錄下。如果問題是該目錄必須屬於另一個使用者和另一個組,請在目錄上設置訪問控制列表 (setfacl -m user:www-data:x /some-path
) — 請參閱如何通過 SUDOERS 限制在特定目錄中執行命令?了解更多資訊。如果
www-data
使用者無法寫入/some-path
,您仍需要提升權限來創建目錄。你至少需要做兩件事,也許三件事:
- 以具有足夠權限的使用者身份創建子目錄;
- 如有必要,更改子目錄的所有權;
- 如有必要,更改子目錄的權限。
如果子目錄必須屬於
www-data
使用者,您可以將其創建為可以寫入的組/some-path
。如有必要,設置一個允許some-group
寫入/some-path
:的 ACLsetfacl -m group:some-group:rwx /some-path
。然後授予使用sudowww-data
執行mkdir
命令的權限。執行並添加以下規則:visudo
www-data ALL = ( : some-group) /bin/mkdir /some-path/[0-9A-Z_a-z]*, !/bin/mkdir /some/path/[!-0-9A-Z_a-z]
這允許
www-data
執行sudo -g some-group mkdir /some-path/foo-bar
以在/some-path
.如果子目錄必須屬於另一個可以寫入的使用者,請以該使用者身份
some-path
執行mkdir
命令。您可能能夠安排目錄在創建時具有正確的權限和所有權。對於sudoers
文件:www-data ALL = (some-user : some-group) /bin/mkdir -m 775 /some-path/[0-9A-Z_a-z]*, !/bin/mkdir /some/path/[!-0-9A-Z_a-z]
執行
sudo -u some-user -g some-group mkdir -m 775 /some-path/foo-bar
以創建屬於some-user:some-group
下的組可寫目錄/some-path
。