答案1
從安全性角度來看,使用相同 Apache 使用者設定網頁並不是一個好主意。 Apache 使用者應該能夠讀取網頁,但不能寫入網頁。
因此,在標準配置下,Web結構對於所有人來說是正常的可讀的,而當需要寫入時,通常是Apache用戶可寫的,這是一個安全噩夢。
避免這種情況的策略之一是安裝/使用 mod_ruid2。https://github.com/mind04/mod-ruid2
對Debian來說,這樣做就夠了:
apt-get install libapache2-mod-ruid2
請注意 Apache 預設使用者隨發行版的不同而變化。在 Debian 中,它是 www-data,在 RH/CentOS 中,它是 apache,在 SuSE 中,它是 wwwrun。從現在起我將把它稱為 Apache 預設使用者。
如果您沒有在虛擬主機中定義任何指令,它將以傳統方式運作;否則行為將會改變。
它的想法是讓一個進程在虛擬主機中運行,並且用戶有權訪問該虛擬主機,因此,這些文件將擁有該所有權,並且如您所願,其他用戶將無法讀取它們。通常,您為每個虛擬主機定義一個使用者。
在虛擬主機中的虛擬主機或目錄指令中,您可以定義對該目錄有效的使用者和群組。 user:usergroup 是 Apache 在存取虛擬主機/目錄時將使用的有效權限,因此,屬於該群組的任何使用者都將能夠寫入/檢視目錄。
<Directory "/vhostdir/">
RMode config
RUidGid user usergroup
....
因此,在寫入目錄時,如果檔案由一組使用者管理,現在可以將檔案建立為 660,其所有權為 user:usergroup。同樣,這些文件也可以由具有全域讀取權限的其他使用者建立;但對於寫入來說,它不會是 Apache 預設用戶,而是另一個用戶。
那麼mod_ruid2的優點就是:
- 在虛擬主機環境中,使用者無法讀取其他使用者的檔案;
- 在單一使用者中,您仍然可以以其他使用者的身分建立文件,並且 Apache 預設使用者和 ruid2 使用者都無法覆蓋它們
- 更重要的是,寫入的檔案現在將由 ruid2 使用者完成,而不再由 Apache 預設使用者全域完成。
來自 github 頁面:
關於 mod_ruid2 是一個適用於 apache 2.0、2.2 和 2.4 的 suexec 模組,基於 mod_ruid 和 mod_suid2
-它只運行在Linux上,因為只有Linux核心實作了所需的行程功能。 - 它比 mod_suid2 具有更好的性能,因為它不需要在一個請求後殺死 httpd 子級。它利用核心功能,並在收到新請求後再次使用 suids。 -存在一些安全性問題,例如,如果攻擊者成功利用httpd進程,他可以設定有效功能並將setuid設定為root。我建議在核心中使用一些安全性補丁(grsec),或其他東西。
-主要有兩種操作模式:stat和config 1.config是預設的,必須定義uid和gid。如果沒有定義 [ug]id,則使用預設使用者和群組。
- stat httpd setuid 和 setgid 到請求檔案名稱(腳本)/目錄的 uid 和 gid 如果您使用 mod_vhost_alias 進行虛擬主機,這很好
安裝 1. 從這裡下載並安裝最新的 libcap 2. 執行 /apachedir/bin/apxs -a -i -l cap -c mod_ruid2.c 3. 設定 httpd.conf 4. 重新啟動 apache
設定選項: RMode config|stat(預設為 config) RUidGid user|#uid group|#gid - 當 RMode 為 config 時,設定為此 uid 和 gid
RMinUidGid user|#uid group|#gid - 當 uid/gid < 小於 min uid/gid 時設定為預設 uid/gid RDefaultUidGid user|#uid group|#gid
RGroups group1 group2 - 透過 setgroups @none 設定的附加群組 - 清除所有先前定義的群組。
RDocumentChrRoot - 設定 chroot 目錄和其中的文檔根目錄
例子:
<VirtualHost example.com> ServerAdmin [email protected] RDocumentChRoot /home /example.com/public_html ServerName example.com ServerAlias www.example.com RMode config # unnecessary since config is the default RUidGid user1 group1 RGroups apachetmp <Directory /home/example.com/public_html/dir> RMode stat </Directory> <Directory /home/example.com/public_html/dir/test> RMode config RUidGid user2 group2 RGroups groups1 </Directory> <Directory /home/example.com/public_html/dir/test/123> RUidGid user3 group3 </Directory> <Location /yustadir> RMode config RUidGid user4 user4 RGroups groups4 </Location>