Debian

Apache PHP 上傳 - 所有權和權限

  • November 5, 2017

我正在邁出安裝 VPS Web 伺服器(Debian 8 + Apache 2 + PHP 5.6)的第一步,並且需要一些文件/文件夾權限方面的幫助。

我已經找到了一些關於這個主題的類似主題(不完全相同),而且都是 4 或 5 歲的。其中一些指向使用不推薦使用的 PHP 方法的解決方案。也許今天有一些新的方法或解決方案。

嗯,有 Apache 2 在www-data使用者/組中執行。所以我創建了一個名為 的使用者webadmin,將其放入www-data組中並將其配置為主網站文件夾的所有者:

adduser webadmin
usermod -a -G www-data webadmin
chown -R webadmin:www-data /var/www/website.com

我還更改了public_html文件夾的權限,如下所示:

find /var/www/website.com/public_html -type f -exec chmod 644 {} +
find /var/www/website.com/public_html -type d -exec chmod 755 {} +
find /var/www/website.com/public_html -type d -exec chmod g+s {} +

並創建了將接收上傳文件的文件夾(僅靜態文件 - 圖像):

mkdir /var/www/website.com/public_html/uploads
chown webadmin:www-data /var/www/website.com/public_html/uploads
chmod 774 /var/www/website.com/public_html/uploads

現在,發生了什麼:我使用 SFTP 上傳的所有文件夾和 PHP/Html 文件(記錄為webadmin)當然會webadmin成為所有者。當我使用 PHP 創建子文件夾並上傳圖像時,他們將www-data使用者作為所有者。在這種情況下,我遇到了一些權限問題,例如通過 SFTP 刪除文件。

我可以指定 Apache 作為webadmin使用者和www-data組執行,但我認為我可能會遇到安全問題(不是嗎?)。請問,是否有標準和最佳實踐來配置將創建文件夾並上傳文件的伺服器或 PHP 腳本以避免此問題?

您的問題是新文件不可組寫。不要在目錄上使用setgid來設置組,而是使用ACL來提供更大的靈活性。

新文件和目錄繼承預設 ACL條目,授予 ACL 中定義的權限。為組設置預設 ACL條目webadmin以允許rwx

setfacl -m default:g:webadmin:rwx /var/www/website.com/public_html/uploads

在目錄中創建的新文件對於 group 將是可讀寫的webadmin


如果 ACL 不是一個選項,您需要更改umask,它決定了新文件的預設 UNIX 權限。新umask的明智選擇是002(世界可寫位被屏蔽)和007(所有世界權限位被屏蔽,即只有組和所有者有權訪問)。

要設置 Apache umask,請將 systemd 單元文件複製到*/etc*:

cp /lib/systemd/system/apache2.service /etc/systemd/system/

通過附加到部分來配置umask。請注意,這會影響 Apache 創建的所有文件。/etc/systemd/system/apache2.serviceUMask=<umask>[Service]

僅當您需要從 PHP/Apache 更改上傳的文件/目錄時,才需要更改sftp的**umask。預設的 umask創建文件組和世界可讀,但不是組可寫。為sftp配置預設umask的最簡單方法是使用.022pam_umask

要僅為特定組中的使用者並且僅在使用sftp時應用您的自定義**umask,請附加:/etc/pam.d/sshd

session [default=1 success=ignore] pam_succeed_if.so user notingroup <yourgroup>
session optional                   pam_umask.so umask=<umask>

第一條規則告訴pam 如果使用者不在組中則跳過下一條規則<yourgroup>,即僅在使用者在組中時應用下一條規則<yourgroup>。第二條規則將 umask 設置為<umask>


附錄:請注意,移動的現有文件mv保留其原始權限和所有權。您可以通過複製文件來應用 umask 和目錄 setgid/ACLs 的預設權限cp -d

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