Debian

如何允許 www-data 創建文件夾而不授予對父文件夾的讀取權限

  • July 15, 2016

我不確定要問的問題是否正確,所以我將嘗試解釋我正在嘗試做的事情。

我有一個內部 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,您仍需要提升權限來創建目錄。你至少需要做兩件事,也許三件事:

  1. 以具有足夠權限的使用者身份創建子目錄;
  2. 如有必要,更改子目錄的所有權;
  3. 如有必要,更改子目錄的權限。

如果子目錄必須屬於www-data使用者,您可以將其創建為可以寫入的組/some-path。如有必要,設置一個允許some-group寫入/some-path:的 ACL setfacl -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

引用自:https://unix.stackexchange.com/questions/58351