apache 和 PHP 應該以什麼使用者身份執行?/var/www 文件應該有什麼權限?
我剛剛啟動了一個 Ubuntu 11.10 機器,然後執行
apt-get install apache2 php5
在機器上安裝 apache2 和 PHP 5。現在它作為一個“網路伺服器”執行,它載入“它工作!” 頁。現在我正在嘗試加強安全性,我對 linux Web 伺服器有以下問題:
- apache 應該以誰的身份執行?
- 該使用者應屬於哪個組?
- 哪些軟體包可以使 PHP(和 Apache?)作為文件的所有者執行?(比如在共享網路主機上)我應該使用這些包嗎?在小型系統上維護它們是否容易/可行?
- 在 apache 執行時向網路提供文件和文件夾的預設權限應該是
www-data
什麼?對於以使用者身份執行的 apache/php?我在檢查預設設置時做了以下事情:
文件結構
當我
cd /
列出ls -al
內容時,我看到/var
:drwxr-xr-x 13 root root 4096 2012-02-04 20:47 var/
如果我
cd
進入var
並且ls -al
我看到:drwxr-xr-x 2 root root 4096 2012-02-04 20:47 www/
最後,在裡面
/var/www
我看到:drwxr-xr-x 2 root root 4096 2012-02-04 20:47 ./ drwxr-xr-x 13 root root 4096 2012-02-04 20:47 ../ -rw-r--r-- 1 root root 177 2012-02-04 20:47 index.html
我的主要收穫是,到目前為止,所有這些文件都屬於
root:root
,文件的權限為 644,目錄的權限為 755。阿帕奇的權限
如果我創建一個包含內容的文件作為根
/var/www/test.php
目錄:<?php echo shell_exec('whoami');
並將該文件載入到它告訴我的瀏覽器中
www-data
,這與文件中的相同/etc/apache2/envvars
:export APACHE_RUN_USER=www-data export APACHE_RUN_GROUP=www-data
如果我這樣做,
ps aux | grep -i apache
我會看到以下內容:root 1916 1.2 104664 7488 Ss 20:47 /usr/sbin/apache2 -k start www-data 1920 0.8 105144 5436 S 20:47 /usr/sbin/apache2 -k start www-data 1921 1.0 105144 6312 S 20:47 /usr/sbin/apache2 -k start www-data 1922 0.7 104688 4624 S 20:47 /usr/sbin/apache2 -k start www-data 1923 0.7 104688 4624 S 20:47 /usr/sbin/apache2 -k start www-data 1924 0.7 104688 4624 S 20:47 /usr/sbin/apache2 -k start www-data 1925 0.7 104688 4624 S 20:47 /usr/sbin/apache2 -k start
那麼 apache 以誰的身份執行?看起來第一個程序可能是 as
root
,可能來自/etc/init.d/apache
系統啟動時的腳本,而其他程序是www-data
從第一個生成的。那是對的嗎?接下來,如果我輸入
groups www-data
然後我看到www-data : www-data
- 所以它看起來只在www-data
組中。我猜這也是標準做法。共享主機和安全
因此,如果我理解正確,如果 apache 正在執行
www-data
並且我希望 apache 能夠讀取目錄,則x
需要為世界(其他)組(o+x
)設置該位,並且還需要在所有父級上設置目錄一直向上鍊(www
,var
)。如果我希望 apache 能夠從文件中讀取,則o+r
需要設置該位。不幸的是,我認為這為同一個 linux 機器上的多個應用程序和/或多個使用者引入了一個安全漏洞:所有 Web 文件都需要是世界可讀的,因此它們也可以被系統上的其他應用程序和其他使用者訪問。如果系統上安裝的一個應用程序存在安全漏洞,允許未經驗證的原始使用者輸入,然後由 PHP 執行,則遠端攻擊者可以瀏覽 Web 系統上的所有其他文件,這些文件是世界可讀的。同樣,如果盒子有多個使用者,並且一個使用者知道另一個使用者的 Web 文件的路徑,那麼他/她可以讀取文件內容(並查看數據庫連接字元串等敏感內容)。
我聽說過兩個包,
suphp
它們phpsuexec
允許使用者的文件在共享系統上“作為他們”提供。這樣做的好處之一是它允許 Web 應用程序(如 Wordpress)創建和修改文件——這對於添加主題、外掛和升級軟體非常有幫助。當然,手動執行這些操作可能更安全,但是是否可以使用上面提到的軟體包之一做出妥協?或者可能使用chown
使wordpress目錄組屬於www-data
並在組(g+s
)上設置粘性位?我只將這些作為網路託管公司的最終使用者使用過,所以我不知道它們的來龍去脈,也不知道它們是否適合安裝在小型系統上,或者是否還有其他一些我應該使用安全措施,但我想我會在這裡提到它們,因為它們似乎是解決我的一些擔憂的一種可能方式。
回到問題
- apache 應該以誰的身份執行?
- 該使用者應屬於哪個組?
- 哪些軟體包可以使 PHP(和 Apache?)作為文件的所有者執行?(比如在共享網路主機上)我應該使用這些包嗎?在小型系統上維護它們是否容易/可行?
- 在 apache 執行時向網路提供文件和文件夾的預設權限應該是
www-data
什麼?對於以使用者身份執行的 apache/php?
- 不是根
- 不是根
- 蘇執行
- 要看。文件 644 和文件夾 755 是安全的預設值。
除非您希望 php 能夠編輯該文件/文件夾的內容,否則不要將任何內容的所有權更改為 www-data
不管你做什麼:文件夾需要讀取和執行權限,使用者才能找到文件;文件需要讀取權限,使用者才能讀取它們。如果您在更改內容時遇到任何權限錯誤 - 您已經設法刪除了這些基本必需的權限。
如果您沒有通過 php 應用程序編寫任何文件,則可以保留屬於您的文件:您。在這種情況下,世界許可 (xx4/5) 是適用的。
如果您將文件歸您所有:您的文件權限為 644(文件),這意味著只有您可以編輯網站文件 - www-data 不是您 - 所以它無法編輯文件。
如果您想限制對 apache + 您的訪問並阻止所有其他訪問
chown -R you:www-data *
。文件權限為 640,文件夾權限為 750,您可以編輯,www-data 可以讀取 - 因為 apache 讀取組權限(x4/5x)。將允許 apache/php 寫入的路徑限制在最低限度 - 如果有應用程序需要寫入的 tmp 目錄 - 僅允許它寫入該文件夾- 並且對於任何可寫位置,如果可能的話,請確保它在文件根目錄或採取措施確保此可寫路徑不可通過 Web 訪問。
請注意,“您”不應是root。允許以 root 身份直接訪問 ssh 表明存在其他安全漏洞(例如不允許密碼登錄),但這本身就是一大堆問題。