最近
Nginx的使用者是越來越多,多數網站也從原本使用很多的
apache平台或其他平台遷移到了Nginx。對於剛剛接觸Nginx的朋友來說,
如何限制Nginx+PHP的目錄權限成了實際問題,
大家都知道,在apache中可以很容易的對虛擬目錄進行權限控制,如:
程序代碼如下:
<VirtualHost www.xpb.cn>
ServerAdmin
[email protected] DocumentRoot /usr/www/xpb/
ServerName www.xpb.cn:80
ServerAli
as www.xpb.cn
ErrorLog logs/default-error_log
PHP_admin_value open_basedir "/tmp/:/usr/www/xpb/"
</VirtualHost>
關鍵是後面的這句php_admin_value,這樣就限制了PHP的操作目錄僅限於/tmp/和/usr/www/xpb/這兩個目錄了。對於apache
虛擬主機來說,這個設置十分有用,結合在php.ini中禁用一些php函數,幾乎可以杜絕PHP木馬對其他站點及系統的危害。我雖沒專業做過
Linux下的虛擬主機,但相信各大虛擬主機商也是這麼做的。
看來對於Apache最好的辦法還是使用“在php.ini中禁用一些危險的php函數和在apache虛擬主機中配置PHP_admin_value”的方式來做虛擬主機的安全。
關於Nginx的配置文件,參考了很多資料,好像是不支持php_admin_value open_basedir,也就是Nginx暫時還沒有apache的 PHP_myadmin_value這類的設置。如果用Nginx做虛擬主機,各用戶之間的目錄安全控制如何來做呢?網上很多人說,限制
上傳文件類型,做好程序安全不就行了麼?對,對於自己的站點來說這樣完全可以。但如果虛擬主機是給別人用的,又給予了
FTP權限,總不能不讓人上傳PHP文件吧。參考以上,如果用Nginx來做虛擬主機,目前看來安全的配置方法是:
1、用低權限賬號運行Nginx。
2、在php.ini中禁用危險的函數。如:system,passthru,shell_exec,exec,popen,proc_open,chroot,scandir,chgrp,chown等,但禁止太多的函數可能對某些PHP程序的正常運行產生影響。
3、在PHP.ini中設置open_basedir,如:open_basedir = "/usr/local/
webserver/nginx/
Html/www.xpb.cn_7da347bc1a9fd621/:/usr/local/
webserver/nginx/
Html/www2.xpb.cn_7da347bc1a9fd621/"
4、各個虛擬主機用戶放在不易於猜到的目錄,如:www.xpb.cn_7da347bc1a9fd621、www2.xpb.cn_7da347bc1a9fd621
5、自己找一個PHP木馬,自我測試
服務器安全!
6、【2009年7月17日更新】據網上部分資料說,在運行spawn-fcgi 的時候帶上參數 -d open_basedir 即可,例如:/usr/sbin/spawn-fCGI -a 127.0.0.1 -p 10080 -C 20 -u www -f "/usr/sbin/PHP-CGI -d open_basedir=/var/www/wwwroot/:/tmp/"
7、參見下面Rainy fox 給出的解決方案。
本方法由於時間原因暫時未做測試驗證,大家可以嘗試一下,如果可以,相對於以上的幾條,應該是比較好的解決方案。
另外,暫時還未發現專門針對Nginx的虛擬主機管理軟件,如果有知道的可以麻煩說下。
看來,在虛擬主機上還是apache是王道,幾乎所有的虛擬主機提供商的專業PHP虛擬主機仍然采用apache。期待Nginx能夠盡快完善這方面的功能設置!有更好解決方法的,也煩請告知。
順便提示一下,並非用apache就安全,也並非用Linux就安全。在
Windows下使用Apache,務必配置一下open_basedir ,甚至Apache運行權限,因為默認apache是以system權限運行的,如果站點一旦被上傳木馬,則會十分危險,當然
Linux下的也要設置一下,相信熟悉Linux的都應當熟悉,不再贅述。
引用內容
以下引用自作者:Rainy fox 來源:
http://www.key0.cn/:
先來看兩份配置文件的部分,只跟大家講原理,省略了和主題無關的部分,請勿復制就用,明白了原理,就知道該怎麼做了。
PHP.ini
; open_basedir, if set, limits all file
Operations to the defined directory
; and below. This directive makes most sense if used in a per-directory
; or per-virtualhost
web server configuration file. This directive is
; *NOT* affected by whether Safe Mode is turned On or Off.
open_basedir = "/myserver/:/tmp/:/var/tmp/"
nginx.conf
http
{
server
{
listen 80;
server_name host1.com;
root /myserver/host1;
location ~ .*\.(php|PHP5)?$
{
#fastCGI_pass
unix:/tmp/PHP-CGI.sock;
fastCGI_pass 127.0.0.1:9000;
fastCGI_index index.PHP;
include fCGI.conf;
}
}
server
{
listen 80;
server_name host2.com;
root /myserver/host2;
location ~ .*\.(php|PHP5)?$
{
#fastCGI_pass unix:/tmp/PHP-CGI.sock;
fastCGI_pass 127.0.0.1:9000;
fastCGI_index index.PHP;
include fCGI.conf;
}
}
server
{
listen 80;
server_name host3.com;
root /myserver/host3;
location ~ .*\.(php|PHP5)?$
{
#fastCGI_pass unix:/tmp/PHP-CGI.sock;
fastCGI_pass 127.0.0.1:9000;
fastCGI_index index.PHP;
include fCGI.conf;
}
}
}
配置的基本情況是 運行3個網站 host1.com host2.com host3.com ,php.ini的配置,限制PHP腳本只能在這三個網站目錄的父目錄 /myserver/ 下面執行。
這時候我們知道,如果在某一個站點上上傳了一個php木馬,那麼這個木馬將可以訪問其他兩個站點的文件。nignx 沒有apache那樣能夠單獨設置每個網站的PHP只能在本目錄下訪問的功能。這時候我們就要用一點取巧的辦法了。
來看這個PHP.ini的配置。
open_basedir = "/myserver/:/tmp/:/var/tmp/"
其實這個路徑也支持 (.) [一個點] 和 (..) [兩個點],也就是當前目錄、父目錄。於是有下面的配置方法
open_basedir = ".:/tmp/:/var/tmp/" 把PHP文件限制在當前目錄,的確,這樣確實是訪問不到別的兩個網站的目錄了,但是訪問某些頁面會出現 No input file specifIEd. 。
為什麼呢,因為上面的這個限制,當你運行或者引用了網站目錄下的子目錄(或者子目錄的子目錄....)裡的php文件(假定為/myserver/host1/dir1/myphp.php),而這個子目錄文件又要訪問上級目錄裡的文件(/myserver/host1/config.php),這時候問題就來了,php.ini裡設置了myphp.PHP只能訪問該本級目錄(/myserver/host1/dir1/)以下的文件,而不能訪問/myserver/host1下的直接文件,於是提示:No input file specifIEd.
現在解決辦法來了
再看兩個配置文件:
下面的這個 /subX1/subX2/subX3/..........(N層) ,N為你網站上最底層的php文件嵌套級數,如果你網站最多有5級子目錄下有PHP文件,那麼就嵌套5層以上。
PHP.ini
; open_basedir, if set, limits all file Operations to the defined directory
; and below. This directive makes most sense if used in a per-directory
; or per-virtualhost web server configuration file. This directive is
; *NOT* affected by whether Safe Mode is turned On or Off.
open_basedir = "../../.......(N層):/tmp/:/var/tmp/"
nginx.conf
http
{
server
{
listen 80;
server_name host1.com;
root /myserver/subA1/subA2/subA3/..........(N層)/host1;
location ~ .*\.(php|PHP5)?$
{
#fastCGI_pass unix:/tmp/PHP-CGI.sock;
fastCGI_pass 127.0.0.1:9000;
fastCGI_index index.PHP;
include fCGI.conf;
}
}
server
{
listen 80;
server_name host2.com;
root /myserver/subB1/subB2/subB3/..........(N層)/host2;
location ~ .*\.(php|PHP5)?$
{
#fastCGI_pass unix:/tmp/PHP-CGI.sock;
fastCGI_pass 127.0.0.1:9000;
fastCGI_index index.PHP;
include fCGI.conf;
}
}
server
{
listen 80;
server_name host3.com;
root /myserver/subC1/subC2/subC3/..........(N層)/host3;
location ~ .*\.(php|PHP5)?$
{
#fastCGI_pass unix:/tmp/PHP-CGI.sock;
fastCGI_pass 127.0.0.1:9000;
fastCGI_index index.PHP;
include fCGI.conf;
}
}
}
舉例N等於5....運行,當訪問最底層的php文件 /myserver/subA1/subA2/subA3/subA4/subA5/host1/dir1/dir2/dir3/dir4/myphp.php,這個php文件所能訪問的上級層到 /myserver/subA1/subA2/subA3/subA4/subA5/host1,當訪問 /myserver/subA1/subA2/subA3/subA4/subA5/host1/myphp2.PHP 文件時候,它所能最多訪問到的上級層 /myserver/subA1 ,不能躍出訪問到其他站目錄裡的文件
這樣就限制了該站目錄下的PHP程序不能訪問別的網站,而對自己網站的訪問又充分不受限制。很簡單,到此結束。
關於Nginx:
1、簡介
Nginx ("engine x") 是一個高性能的 HTTP 和 反向代理 服務器,也是一個 IMAP/POP3/SMTP 代理服務器。 Nginx 是由 Igor Sysoev 為俄羅斯訪問量第二的 Rambler.ru 站點開發的,它已經在該站點運行超過四年半了。Igor 將源代碼以類BSD許可證的形式發布。盡管還是測試版,但是,Nginx 已經因為它的穩定性、豐富的功能集、示例配置文件和低系統資源的消耗而聞名了。更多的請見官方wiki: http://wiki.codemongers.com/
2、 Nginx的優點
nginx做為HTTP服務器,有以下幾項基本特性:
1) 處理靜態文件,索引文件以及自動索引;打開文件描述符緩沖.
2) 無緩存的反向代理加速,簡單的負載均衡和容錯.
3) FastCGI,簡單的負載均衡和容錯.
4) 模塊化的結構。包括gzipping, byte ranges, chunked responses, 以及 SSI-filter等filter。如
果由FastCGI或其它代理服務器處理單頁中存在的多個SSI,則這項處理可以並行運行,而不需要相互等待。
5) 支持SSL 和 TLS SNI.
Nginx專為性能優化而開發,性能是其最重要的考量, 實現上非常注重效率 。它支持內核Poll模型,能經受高負載的考驗, 有報告表明能支持高達 50,000 個並發連接數。
Nginx具有很高的穩定性。其它HTTP服務器,當遇到訪問的峰值,或者有人惡意發起慢速連接時,也很可能會導致服務器物理內存耗盡頻繁交換,失去響應,只能重啟服務器。例如當前apache一旦上到200個以上進程,web響應速度就明顯非常緩慢了。而Nginx采取了分階段資源分配技術,使得它的CPU與內存占用率非常低。nginx官方表示保持10,000個沒有活動的連接,它只占2.5M內存,所以類似DOS這樣的攻擊對nginx來說基本上是毫無用處的。就穩定性而言, nginx比lighthttpd更勝一籌。
Nginx支持熱部署。它的啟動特別容易, 並且幾乎可以做到7*24不間斷運行,即使運行數個月也不需要重新啟動。你還能夠在不間斷服務的情況下,對軟件版本進行進行升級。
Nginx采用master-slave模型, 能夠充分利用SMP的優勢,且能夠減少工作進程在磁盤I/O的阻塞延遲。當采用select()/poll()調用時,還可以限制每個進程的連接數。
Nginx代碼質量非常高,代碼很規范, 手法成熟, 模塊擴展也很容易。特別值得一提的是強大的Upstream與Filter鏈。 Upstream為諸如reverse proxy, 與其他服務器通信模塊的編寫奠定了很好的基礎。而Filter鏈最酷的部分就是各個filter不必等待前一個filter執行完畢。它可以把前一個filter的輸出做為當前filter的輸入,這有點像Unix的管線。這意味著,一個模塊可以開始壓縮從後端服務器發送過來的請求,且可以在模塊接收完後端服務器的整個請求之前把壓縮流轉向客戶端。
Nginx采用了一些os提供的最新特性如對sendfile (Linux 2.2+),accept-filter (FreeBSD 4.1+),TCP_DEFER_ACCEPT (Linux 2.4+) 的支持,從而大大提高了性能。