我試圖不是在我的資料夾中授予777
權限/var/www/html
,但我想在沒有sudo
.所以我想在我的主目錄中建立一個資料夾的符號連結/var/www/html
。我使用以下方法創建了它:
sudo ln -sT /home/andre/www/moodle/ moodle
輸出ls -la
是這樣的:
andre@andre-270E5G:/var/www/html$ ls -la
total 8
drwxr-xr-x 2 root root 4096 Mai 4 10:20 .
drwxr-xr-x 4 root root 4096 Abr 29 14:29 ..
lrwxrwxrwx 1 root root 23 Mai 4 10:20 moodle -> /home/andre/www/moodle/
所以,我的moodle
資料夾對每個人都有讀、寫和執行權限,但這不是我想要的。我使用了命令:
sudo chmod -R 775 moodle/
嘗試更改它,但它保留了對所有人的讀取、寫入和執行權限。我對moodle
中的資料夾進行了相同的嘗試/home/andre/www/moodle
,但它保持不變。ls -la
in的輸出/home/andre/www/
為:
andre@andre-270E5G:~/www$ ls -la
total 28
drwxrwxr-x 3 andre andre 4096 Mai 4 10:02 .
drwx------ 49 andre andre 20480 Mai 4 10:01 ..
drwxrwxr-x 41 andre andre 4096 Mai 4 10:02 moodle
moodle
這樣裡面的資料夾/home/andre/www/
就有了我想要的權限。
作為另一個問題,當我訪問時,localhost/moodle
我收到 403 Forbidden 錯誤。
我在這裡做錯了什麼?
答案1
您永遠不必從主目錄中運行網站。 曾經。 否則,您必須讓 Web 伺服器能夠遍歷/home/
以查看目錄結構,並且還可以進入/home/$USER/
(您的用戶的主目錄,我們可以在其中嘗試查看您的用戶目錄中還存在哪些內容)以及任何其他子資料夾在那裡。配置不當、配置錯誤或未打補丁的網路伺服器可能會導致大量資料洩露,或憑證遺失,從而使您的個人資料和登入資訊面臨風險。您使用的符號連結方法也沒有幫助,原因與嘗試授予 Apache 讀取權限相同/home/andre/www/moodle
- Web 伺服器必須能夠遍歷您的主目錄才能到達符號連結指向的位置/var/www/html
,這仍然是造成這種安全風險。
首先,使用sudo cp -r /home/andre/www/moodle/ /var/www/html/
.這會將您的檔案複製到/var/www/html
,並使其遠離您自己的主目錄。然後,我們將重做權限,以便您和 Web 伺服器可以存取該目錄中的所有內容,並為您的使用者提供對所有檔案和目錄的完全讀取/寫入權限。然後,您只需/var/www/html
為您的網站工作即可。
將資料複製回後,這實際上需要四個步驟/var/www/html
:
- 授予 Apache 存取資料夾和檔案的權限,以便它可以為網站提供服務而不會出現 403 錯誤。
- 授予您的使用者檔案和資料夾的「所有者」權限,並授予您自己對所有檔案和資料夾的讀取/寫入權限以及遍歷目錄的能力。
- (可選但建議)進行設置,以便在整個目錄結構中從此處建立的任何檔案或資料夾的群組都設置為
www-data
。 - (選修的)最後的安全清理,我們設定權限,以便您和 Web 伺服器可以查看網站數據,但其他使用者無法存取網站的檔案或目錄結構。
(1) 允許 Apache 存取資料夾和檔案。
sudo chgrp -R www-data /var/www/html
sudo find /var/www/html -type d -exec chmod g+rx {} +
sudo find /var/www/html -type f -exec chmod g+r {} +
這會遞歸地將“群組”設定www-data
為資料夾和檔案。然後,這將授予 Web 伺服器遞歸權限並存取網站文件根目錄結構(+x
僅適用於目錄)。然後,它還確保 Web 伺服器具有所有檔案的讀取權限,以便可以接收網站資料。
在某些情況下,您可能必須授予 Web 伺服器對檔案或目錄的寫入權限 - 這可以透過執行下列操作來實現sudo chmod g+w /var/www/html/PATH
(其中PATH
是目錄結構中檔案或資料夾的路徑,您需要在其中套用Web 伺服器的寫入權限)。
注意:在許多情況下,這可能會暴露有關網站配置的「安全性」資訊(例如資料庫存取憑證等),您應該使用以下命令刪除對這些單獨檔案或目錄上的資料的「其他」存取權限:以下: (sudo chmod o-rwx /var/www/html/FILEPATH
替換為相對於檔案資料夾FILEPATH
的路徑)。/var/www/html
另請注意,如果「新檔案」遇到 403 問題,您可能需要在將來重新執行這些命令,以便向 Web 伺服器授予正確的權限,以便繼續能夠存取在其中建立或複製的檔案和資料夾沒有www-data
正確設定組。
(2) 授予擁有者對資料夾和檔案的讀取/寫入權限,並允許資料夾存取遍歷目錄結構。
sudo chown -R USER /var/www/html/
sudo find /var/www/html -type d -exec chmod u+rwx {} +
sudo find /var/www/html -type f -exec chmod u+rw {} +
USER
將第一個命令替換為您自己的用戶名!
我們在這裡做三件事。首先,我們將您的用戶設定為/var/www/html
.接下來,我們設定資料夾的讀寫權限,並允許您存取資料夾並進入其中(+x
目錄項目上的項目)。然後,我們將所有檔案設定為擁有剛剛設定的擁有者的讀取/寫入權限。
(3)(選修的)確保此後的每個新文件都是以www-data
“訪問”用戶身份創建的。
sudo find /var/www/html -type d -exec chmod g+s {} +
這會為目錄上的群組設定“set gid”位元。在這些目錄中建立的文件和資料夾將始終www-data
作為一個群組,允許 Web 伺服器存取。
(4)(選修的)最後的安全清理,如果您不希望其他用戶能夠看到數據
我們需要您的使用者查看目錄和檔案。我們也需要網頁伺服器來做到這一點。我們可能不希望其他系統使用者(root 除外)看到這些資料。因此,我們不要授予他們存取權限,而應確保只有您的使用者和 Web 伺服器才能看到資料。
sudo chmod -R o-rwx /var/www/html/
筆記:您不必稍後重新執行此命令,也不必在此編輯「其他」權限類別的權限。如果「其他」使用者無法存取/var/www/html/
(他們沒有必要的+x
位元來/var/www/html
遍歷檔案結構和目錄結構,也沒有位元+r
來讀取檔案清單),則其他使用者對該目錄下的項目的權限或團體實際上並不重要。
還有一個侵入性較小的解決方案,儘管它不能保證適用於所有新文件,也不能保證適用於所有文件系統,涉及文件存取控制列表。這使您可以保留文件的所有權www-data
,但為您提供有效的所有者權利,無論出於何種意圖和目的,即使您個人不擁有這些文件。
此解決方案的侵入性較小,允許您擁有一個目錄以及其中的所有文件,該目錄由www-data:www-data
或擁有root:www-data
,但也允許您自己存取。它用存取控制列表,它允許您讓多個使用者擁有權限,而無需設定單獨的群組。這也允許root
系統www-data
使用者擁有文件,但也允許您根據具體情況添加額外的權限,並微調某些使用者的權限,以便他們可以讀取內容但不能編輯,等等。
假設我們仍在使用/var/www/html/
,我們不希望我們和系統(當然還有 root)以外的窺探使用者查看我們的數據,我們需要執行以下操作:
- 將所有權歸還給網路伺服器系統使用者
www-data
。
sudo chown -R www-data:www-data /var/www/html
- 遞歸地為您提供對文件的讀取/寫入權限,同時不允許其他使用者(當然不包括
www-data
)root
存取這些文件。
sudo find /var/www/html -type f -exec setfacl -mu:您的使用者名稱:rw -m other::--- {} \;
- 遞歸地授予自己對目錄的讀取/寫入/遍歷權限,刪除其他使用者對資料夾的存取權限(不包括
www-data
和root
),並將其設定為目錄中新檔案的「預設」ACL。
sudo find /var/www/html -type d -exec setfacl -d -mu:您的使用者名稱:rwx -mo::--- {} \;
- 我們還需要為所有目錄設定該
setgid
位,以便如果您建立文件,網路伺服器仍然可以www-data
透過群組權限存取它。
sudo find /var/www/html -type d -exec chmod g+s {} \;
現在您可以存取所有目錄,和您不必取消存取權限www-data
,因為網頁伺服器仍然可以根據需要在任何地方建立檔案(例如基於 PHP 的前端有自己的快取目錄,並且需要建立和寫入才能正確操作)。
唯一的警告:如果您手動建立新文件,則需要相應地對它們進行 chown 以將所有權授予網路伺服器。這很簡單sudo chown www-data:www-data filename
,存取控制清單仍然應該讓您擁有該檔案的有效擁有者權限。
在多種情況下,我必須以系統管理員身份執行某些類型的非標準訪問,而不更改給定文件的所有者。這可行,但有其自身令人頭痛的問題,因為並非每個檔案系統支援文件訪問列表。
答案2
托馬斯·沃德的出色回答 https://askubuntu.com/a/767534/717860
您只需 3 個命令(而不是 8 個命令)即可完成所有建議的步驟:
3條命令:
sudo chown -R ubuntu:www-data /var/www
sudo find /var/www -type d -exec chmod 2750 {} \+
sudo find /var/www -type f -exec chmod 640 {} \+
與以下 8 個命令執行相同的工作:
sudo chgrp -R www-data /var/www
sudo find /var/www -type d -exec chmod g+rx {} +
sudo find /var/www -type f -exec chmod g+r {} +
sudo chown -R ubuntu /var/www/
sudo find /var/www -type d -exec chmod u+rwx {} +
sudo find /var/www -type f -exec chmod u+rw {} +
sudo find /var/www -type d -exec chmod g+s {} +
sudo chmod -R o-rwx /var/www/
答案3
使用符號連結解決權限問題的整個想法是有缺陷的並且行不通。符號連結本身顯示的權限大多無關緊要,它們不能用於規避「真實」目錄的權限。建立從/var/www/html/moodle
到 的符號連結/home/andre/www/moodle/
不會規避 的權限/home/andre/www/moodle/
。任何想要在 中執行操作的人/var/www/html/moodle
都必須獲得 的必要權限才能這樣做/home/andre/www/moodle/
。
你的執行sudo chmod -R 775 moodle/
實際上做過有效果,但與您認為的不同,它沒有改變符號連結的權限,而是改變符號連結目標的權限/home/andre/www/moodle/
。
您在網頁伺服器中收到的 403 錯誤可能是因為您的網頁伺服器沒有進入/home/andre
.這不是“額外的問題”,而是由於相同的權限問題。
因此,您必須弄清楚允許您編輯文件和 Web 伺服器來存取它們(甚至編輯它們,這取決於應用程式)的權限,而不是使用符號連結。這些權限到底是什麼,取決於您的特定用例(您的應用程式和伺服器設定)。
一般來說,我認為您擁有這些檔案並具有 rw 權限是個好主意,Web 伺服器只能透過群組權限對檔案進行讀取訪問,而所有其他使用者都沒有任何存取權限。
權限範例(由於缺少訊息,可能不適用於您的用例):
andre@fermat:/var/www/html$ ls -al moodle/
total 0
drwxr-x--- 2 andre www-data 60 mai 4 16:20 .
drwxr-xr-x 3 root root 80 mai 4 16:20 ..
-rw-r----- 1 andre www-data 0 mai 4 16:20 index.html
您可以看到目錄具有足夠的存取權限,您作為所有者可以進入該目錄並修改其內容,Web 伺服器(在群組中www-data
)可以進入並讀取。文件本身對您(所有者)是可讀和可寫入的,並且對 Web 伺服器(在群組中www-data
)是可讀的。所有其他使用者都沒有任何存取權限。
再次強調,請僅以此為例。 Web 伺服器的確切使用者/群組取決於您的配置。而且您的應用程式(moodle)可能需要不同的權限,您必須查閱其文件。