我的網站文件/文件夾在 Linux 網路伺服器上應具有哪些權限?
這是關於 Linux Web 伺服器上文件權限的規範問題。
我有一個執行 Apache2 的 Linux Web 伺服器,它託管多個網站。每個網站在 /var/www/ 中都有自己的文件夾。
/var/www/contoso.com/ /var/www/contoso.net/ /var/www/fabrikam.com/
基本目錄 /var/www/ 歸 root:root 所有。Apache 以 www-data:www-data 執行。Fabrikam 網站由兩個開發人員 Alice 和 Bob 維護。這兩個 Contoso 網站都由一位開發人員 Eve 維護。所有網站都允許使用者上傳圖片。如果一個網站被入侵,影響應該盡可能的有限。
我想知道設置權限的最佳方式,以便 Apache 可以提供內容,網站免受攻擊,並且開發人員仍然可以進行更改。其中一個網站的結構如下:
/var/www/fabrikam.com /cache /modules /styles /uploads /index.php
應該如何對這些目錄和文件設置權限?我在某處讀到你不應該在網站上使用 777 權限,但我不明白這可能會導致什麼問題。在繁忙時期,網站會自動記憶體一些頁面並將結果儲存在記憶體文件夾中。網站訪問者送出的所有內容都保存在上傳文件夾中。
在決定使用什麼權限時,您需要確切地知道您的使用者是誰以及他們需要什麼。網路伺服器與兩種類型的使用者互動。
經過身份驗證的使用者在伺服器上有一個使用者帳戶,並且可以被提供特定的權限。這通常包括系統管理員、開發人員和服務帳戶。他們通常使用 SSH 或 SFTP 對系統進行更改。
匿名使用者是您網站的訪問者。儘管他們沒有直接訪問文件的權限,但他們可以請求一個網頁,並且網路伺服器會代表他們進行操作。您可以通過注意 Web 伺服器程序的權限來限制匿名使用者的訪問。在許多 Linux 發行版上,Apache 以
www-data
使用者身份執行,但它可以不同。使用ps aux | grep httpd
或ps aux | grep apache
查看 Apache 在您的系統上使用的使用者。linux權限注意事項
Linux 和其他符合 POSIX 的系統使用傳統的 unix 權限。維基百科上有一篇關於文件系統權限的優秀文章,所以我不會在這裡重複所有內容。但是有一些事情你應該注意。
執行位
解釋腳本(例如 Ruby、PHP)在沒有執行權限的情況下工作得很好。只有二進製文件和 shell 腳本需要執行位。為了遍歷(進入)一個目錄,您需要對該目錄具有執行權限。網路伺服器需要此權限才能列出目錄或提供其中的任何文件。
預設新文件權限
創建文件時,它通常會繼承創建者的組 ID。但有時您希望新文件繼承創建它們的文件夾的組 ID,因此您可以在父文件夾上啟用 SGID 位。
預設權限值取決於您的 umask。umask 會從新創建的文件中減去權限,因此 022 的公共值會導致使用 755 創建文件。與組協作時,將 umask 更改為 002 很有用,以便組成員可以修改您創建的文件。如果您想自定義上傳文件的權限,您需要更改 apache 的 umask 或在文件上傳後執行 chmod。
777的問題
當你
chmod 777
的網站,你沒有任何安全性。系統上的任何使用者都可以更改或刪除您網站中的任何文件。但更嚴重的是,請記住,Web 伺服器代表您網站的訪問者,現在 Web 伺服器能夠更改它正在執行的相同文件。如果您的網站中存在任何程式漏洞,則可以利用它們來破壞您的網站、插入網路釣魚攻擊或從您的伺服器竊取資訊,而您卻不知道。此外,如果您的伺服器執行在一個眾所周知的埠上(它應該防止非 root 使用者產生全球可訪問的偵聽服務),這意味著您的伺服器必須由 root 啟動(儘管任何理智的伺服器都會立即丟棄綁定埠後到特權較低的帳戶)。換句話說,如果您執行的網路伺服器的主要執行檔是版本控制的一部分(例如 CGI 應用程序),則保留其權限(或者,就此而言,保留包含目錄的權限,因為使用者可以重命名777 處的執行檔)允許任何使用者以root身份執行任何執行檔。
定義需求
- 開發人員需要對文件進行讀/寫訪問,以便他們可以更新網站
- 開發人員需要對目錄進行讀/寫/執行,以便他們可以瀏覽
- Apache 需要對文件和解釋腳本的讀取權限
- Apache 需要對可服務目錄的讀取/執行權限
- Apache 需要對上傳內容的目錄進行讀/寫/執行訪問
由單個使用者維護
如果只有一個使用者負責維護站點,請將其設置為網站目錄上的使用者所有者,並授予使用者完整的 rwx 權限。Apache 仍然需要訪問權限才能為文件提供服務,因此將 www-data 設置為組所有者並授予組 rx 權限。
在您的情況下,使用者名可能是
eve
的 Eve 是唯一維護的使用者contoso.com
:chown -R eve contoso.com/ chgrp -R www-data contoso.com/ chmod -R 750 contoso.com/ chmod g+s contoso.com/ ls -l drwxr-s--- 2 eve www-data 4096 Feb 5 22:52 contoso.com
如果您有需要被 Apache 寫入的文件夾,您只需修改組所有者的權限值,以便 www-data 具有寫入權限。
chmod g+w uploads ls -l drwxrws--- 2 eve www-data 4096 Feb 5 22:52 uploads
這種配置的好處是系統上的其他使用者更難(但並非不可能*)窺探,因為只有使用者和組所有者可以瀏覽您的網站目錄。如果您的配置文件中有秘密數據,這將很有用。小心你的umask!如果您在此處創建新文件,權限值可能預設為 755。您可以執行
umask 027
以使新文件預設為 640 (rw- r-- ---
)。由一組使用者維護
如果多個使用者負責維護站點,您將需要創建一個組以用於分配權限。最好為每個網站創建一個單獨的組,並以該網站命名該組。
groupadd dev-fabrikam usermod -a -G dev-fabrikam alice usermod -a -G dev-fabrikam bob
在前面的範例中,我們使用組所有者授予 Apache 權限,但現在用於開發人員組。由於使用者所有者對我們不再有用,將其設置為 root 是確保不會洩露任何權限的簡單方法。Apache 仍然需要訪問權限,因此我們為世界其他地方提供讀取訪問權限。
chown -R root fabrikam.com chgrp -R dev-fabrikam fabrikam.com chmod -R 775 fabrikam.com chmod g+s fabrikam.com ls -l drwxrwxr-x 2 root dev-fabrikam 4096 Feb 5 22:52 fabrikam.com
如果您有需要 Apache 可寫的文件夾,您可以讓 Apache 成為使用者所有者或組所有者。無論哪種方式,它都將擁有所需的所有訪問權限。就個人而言,我更喜歡將其設為使用者所有者,以便開發人員仍然可以瀏覽和修改上傳文件夾的內容。
chown -R www-data uploads ls -l drwxrwxr-x 2 www-data dev-fabrikam 4096 Feb 5 22:52 uploads
雖然這是一種常見的方法,但也有一個缺點。由於系統上的每個其他使用者都對您的網站擁有與 Apache 相同的權限,因此其他使用者很容易瀏覽您的網站並讀取可能包含機密數據的文件,例如您的配置文件。
你可以吃蛋糕也可以吃
這可以進一步改進。所有者擁有比組更少的權限是完全合法的,因此我們可以讓 Apache 成為您網站中目錄和文件的使用者所有者,而不是通過將其分配給 root 來浪費使用者所有者。這是單一維護者方案的逆轉,但它同樣有效。
chown -R www-data fabrikam.com chgrp -R dev-fabrikam fabrikam.com chmod -R 570 fabrikam.com chmod g+s fabrikam.com ls -l dr-xrwx--- 2 www-data dev-fabrikam 4096 Feb 5 22:52 fabrikam.com
如果您有需要被 Apache 寫入的文件夾,您只需修改使用者所有者的權限值,以便 www-data 具有寫入權限。
chmod u+w uploads ls -l drwxrwx--- 2 www-data dev-fabrikam 4096 Feb 5 22:52 fabrikam.com
使用此解決方案要注意的一件事是,新文件的使用者所有者將匹配創建者,而不是設置為 www-data。因此,您創建的任何新文件都不會被 Apache 讀取,除非您將它們 chown。
*Apache 權限分離
我之前提到過,無論您使用何種權限,其他使用者實際上都可以窺探您的網站。預設情況下,所有 Apache 程序都以相同的 www-data 使用者身份執行,因此任何 Apache 程序都可以從同一伺服器上配置的所有其他網站讀取文件,有時甚至可以進行更改。任何可以讓 Apache 執行腳本的使用者都可以獲得與 Apache 本身相同的訪問權限。
為了解決這個問題,Apache 中有多種方法來進行權限分離。然而,每種方法都有不同的性能和安全缺陷。在我看來,任何具有更高安全要求的站點都應該在專用伺服器上執行,而不是在共享伺服器上使用 VirtualHosts。
其他注意事項
我之前沒有提到它,但是讓開發人員直接編輯網站通常是一種不好的做法。對於較大的站點,最好有某種發布系統,從版本控制系統的內容更新網路伺服器。單一維護者的方法可能是理想的,但是您擁有自動化軟體而不是一個人。
如果您的網站允許上傳不需要提供的內容,則這些上傳內容應儲存在 Web 根目錄之外的某個位置。否則,您可能會發現人們正在下載本應保密的文件。例如,如果您允許學生送出作業,則應將它們保存到 Apache 不提供的目錄中。對於包含機密的配置文件,這也是一種很好的方法。
對於要求更複雜的網站,您可能需要研究訪問控制列表的使用。這些可以實現更複雜的權限控制。
如果您的網站有復雜的要求,您可能需要編寫一個設置所有權限的腳本。徹底測試它,然後保持安全。如果您發現自己出於某種原因需要重建您的網站,那麼它可能是物超所值的。