當前位置: 首頁>>技術教程>>正文


permissions – www-data 擁有的文件的 SFTP 權限被拒絕

, ,

問題描述

我有一個非常標準的服務器設置,運行 Apache 和 PHP。我正在運行的應用程序創建文件,這些文件歸 Apache 用戶 www-data 所有。我通過 SFTP 上傳的文件歸我自己的用戶 charlesr 所有。所有文件都是 www-data 組的一部分。我的問題是我無法通過 SFTP 修改或覆蓋 www-data 擁有的任何文件,即使 charlesrwww-data 組的一部分。我可以通過 SSH 會話毫無問題地修改文件。

所以我不知道該怎麽做。如何授予我的 SFTP 會話權限以修改 www-data 擁有的文件?

稍微介紹一下背景,這些是我在 setting-up 服務器時為自己寫的筆記:

Now set up permissions on `/var/www` where your files are served from by
default:

$ sudo adduser $USER www-data
$ sudo chgrp -R www-data /var/www
$ sudo chmod -R g+rw /var/www
$ sudo chmod -R g+s /var/www

Now log out and log in again to make the changes take hold.

The previous set of commands does the following:

1. adds the current user ($USER) to the `www-data` group;
2. changes `/var/www` to belong to the `www-data` group;
3. adds read/write permissions to the group that `/var/www` belongs to;
4. sets the SGID bit on `/var/www`; this final point bears some explaining.

然後我繼續向自己解釋設置 SGID 位意味著什麽(即在 /var/www 中創建的所有文件都會自動成為 www-data 組的一部分)。


更新

問題似乎是由應用程序本身引起的,或者更具體地說,是應用程序框架 ( Kohana ) 將其寫入的某些文件設置為 0644 (rw-r–r–);即不可組寫。這一點,再加上這些文件也歸 www-data 所有,這意味著當 logged-in 為 charlesr 時,我無法通過 SFTP 編輯文件。我不確定為什麽我可以通過 SSH 編輯文件。我的猜測是我一定用過 sudo。

這是我現在使用的權限策略,感謝 tireless help of Marty Fried ,他指出了我之前策略中的缺陷,並幫助我在 Linux 權限的世界中進行了醃製,直到我最終理解它。謝謝馬蒂!

Overview

  • /var/www 中的文件和目錄應該歸 root:webmasters 所有

  • 所有開發者都應該是 webmasters 組的成員

  • /var/www 中的所有目錄都應設置為:2775u=rwx,g=rwxs,o=rx (rwxrwx-r-x)

  • /var/www 中的所有文件都應設置為:0664ug=rw,o=r (rw-rw-r–)

以下內容應歸 www-data:webmasters 所有(即這些是 Apache 需要能夠寫入的目錄):

  • 應用程序/緩存

  • 應用程序/日誌

  • 上傳

  • client_helpers/上傳

HOWTO

要在默認情況下提供文件的 /var/www 上設置權限:

  1. sudo addgroup webmasters

  2. sudo adduser $USER webmasters

  3. sudo chown -R root:webmasters /var/www

  4. sudo find /var/www -type f -exec chmod 664 {} \;

  5. sudo find /var/www -type d -exec chmod 775 {} \;

  6. sudo find /var/www -type d -exec chmod g+s {} \;

  7. sudo chown -R www-data:webmasters application/cache/ [等…]

現在注銷並再次登錄以使更改生效。

上一組命令執行以下操作:

  1. 創建一個名為 webmasters 的新組;所有需要對應用程序文件進行寫入訪問的用戶都將添加到該組中。

  2. 將當前用戶 ( $USER ) 添加到 webmasters 組。

  3. /var/www 的所有者更改為 root,將組更改為 webmasters 組。

  4. 664 permissions (-rw-rw-r–) 添加到 /var/www 中的所有文件。

  5. 775 permissions (drwxrwxr-x) 添加到 /var/www 中的所有目錄。

  6. /var/www 和其中的所有目錄上設置 SGID 位;最後一點需要解釋一下。另請注意,您也可以在 chmod 八進製(例如 2644)的前麵放一個 2 來做同樣的事情。

  7. 將所有者設置為 www-data (Apache 的用戶),將提供的目錄的組設置為 webmaster 。這確保目錄可由 Apache 和 webmasters 組中的任何人寫入。對需要可寫的所有其他目錄執行相同操作。

最佳方法

Ubuntu.com 有很好的服務器指南,例如 Apache guide 。你從哪裏得到你這麽仔細寫下的程序?我從來沒有為我設置的任何服務器遇到那麽多麻煩,盡管我願意接受我沒有做對的可能性 – 而且,我實際上沒有安裝服務器任何非常公開或非常大的東西,所以可能存在我不知道的安全漏洞。

但是,我從來不需要成為 www-data 組的成員,而且 www 中的源文件不屬於 www-data。我的理解是Apache隻對自己的文件使用這個,對其他文件本身沒有寫權限,因為理論上沒有重要的文件會允許www-data有寫權限。我猜 www-data 擁有的文件會給其他人隻讀權限,沒有人應該對其文件有寫權限。當然,我可能完全錯了,如果我是,我希望有人會告訴我並指出我解釋不同的實際文檔(而不是像我這樣的隨機互聯網用戶製作了對他有用的說明的論壇)。

也許我遺漏了一些東西,但您的問題應該相當簡單。使用 sftp 登錄的用戶需要是 www-data 組的成員,並且您嘗試修改的文件必須具有 www-data 組的寫權限。您可以使用 ssh 修改文件,但不能使用 sftp,這對我來說沒有意義;你確定你登錄的是同一個賬戶嗎?在 sftp 中,您可以輸入諸如 !groups 之類的命令來列出您的組,或輸入 !whoami 之類的命令來檢查您使用的登錄名。結果應該與您使用 ssh 看到的相匹配(使用相同的命令減去感歎號)。

如果您有權限,您還應該能夠從 sftp 使用 chmod、chown、chgrp。

順便說一句,我認為您的列表中至少有一個非常糟糕的命令:

sudo chmod -R g+rw /var/www

這賦予了世界對 /var/www 中的每個文件和文件夾的寫權限。這聽起來是個壞主意。一般情況下,隻有root才有這些目錄的寫權限,除非特定的需要更多權限,通常隻有單個目錄。

注意:這是我的錯誤。感謝 DonalLafferty 指出這一點,它指定 “g”,而不是 “a”,所以它隻更改組權限。我疲憊的老眼睛(或糟糕的字體)一定是把它讀成了 “a”。

澄清的編輯

通常,Apache 創建的文件對於 www-data 組和所有其他用戶都是隻讀的,與 /var/www 中的 root-owned 文件相同。因此,沒有理由讓任何人成為 www-data 的成員。問題是給每個人寫訪問權限,這是一種不同的情況。這應該通過在您的站點中提供特定目錄來完成,這可以通過使用 chmod 來完成,或者使用 sudo,因為它可能由 root 擁有,或者通過自己創建所有者而不使用 sudo。

如果你有更多的開發者需要訪問整個站點,那就是當你想創建一個用戶+組,比如 “webmasters”,讓它成為站點的所有者,授予該組的寫入權限,並使所有開發人員成為該組的成員團體。因此,站點目錄的列表將類似於:

drwxrwxr-x  ##  webmasters     webmasters   #### ####-##-## ##:##  mysite.com

更多編輯

從那以後,我意識到您實際上並不需要創建用戶 “webmasters”,隻需創建一個組即可。那麽文件可以歸root:webmasters所有,即root是所有者,webmasters是組。

在回答以下問題時,Apache 寫入的文件將歸 www-data 和 www-data 組所有。這些文件通常不是您寫入的內容,因此 www-data 的非成員可能具有隻讀訪問權限 – 我認為這取決於目錄權限。如果您確實需要的不僅僅是偶爾的寫訪問權限,那麽將自己添加到組中可能會很有用。通常,您將特定目錄設為可寫入 Apache 保存的內容。還要考慮到,大多數運行 Apache 的共享 Web 托管沒有 shell 訪問權限甚至無法設置組。

但是,Apache 甚至可以讀取 root 擁有的文件。幾乎所有文件都有 world-readable 訪問權限,隻是不可寫。所以,除非你想改變這一點,Apache 不需要在網站管理員組中。

這都是基本的 Linux 設置,而不是真正的 Apache。 Apache 隻關心來自 Web 服務器內部的訪問,這是由配置文件設置的。出於這個原因,我在我的帖子中包含的 Ubuntu 文檔鏈接應該被認為是比公共 wiki 更好的來源。

順便說一句,O’Reilly Apache Cookbook 說“文檔目錄,例如 htdocs、cgi-bin 和圖標,必須以對您的特定網站的開發模型最有意義的方式設置權限,但在在任何情況下,Web 服務器用戶都不應寫入其中包含的任何這些目錄或文件。”

最後,如果您需要更多控製,使用 ACL 是設置文件權限的好方法。這甚至可能是一直設置它們的好方法,這是我應該調查的事情。

次佳方法

我注意到你沒有使用 chown

要正確設置文件/文件夾的所有權,您可以這樣設置整個目錄:chown -R www-data:www-data

這將所有權設置為組 www-data 和用戶 www-data

此外,您可以將此作為臨時解決方法:

chmod 777 /var/data/<filename>chmod 777 /var/data/<foldername>

根據需要編輯文件,然後

chmod 644 /var/data/<filename>chmod 755 /var/data/<foldername>

小心使用 “-R” 開關,因為它也會更改所有子文件和文件夾的權限。

664是Apache標準文件權限,755是標準文件夾權限。

希望這可以幫助 :)

星星

參考資料

本文由Ubuntu問答整理, 博文地址: https://ubuntuqa.com/zh-tw/article/12275.html,未經允許,請勿轉載。