nginx+php安全配置
nginx是一個強大的web伺服器,但它不能直接解析php、jsp等動態語言,只能處理html等靜態檔案。那常見的nginx + php
組合是怎麼工作的呢?這裡就要用到nginx強大的反向代理功能。
當nginx接收到請求時,如果是php請求,那麼它就會把這個請求交給php直譯器,然後把返回的結果傳給客戶端。因此,你可以在一個server上執行多個web容器,然後讓nginx依據被訪問檔案的字尾名把檔案交給對應的直譯器執行。
對於上面的組合,在執行過程中會涉及到兩個賬戶,一個是nginx的執行賬戶,一個是php-fpm的執行賬戶。
- 當訪問的是一個靜態檔案,那麼需要nginx的執行賬戶有該檔案的讀取許可權;
- 當訪問的是一個php檔案,nginx的執行賬戶首先需要有對該檔案的讀取許可權,讀出來是一個php檔案後,就把這個檔案轉發給php-fpm去處理,於是php-fpm的執行賬戶需要有該檔案的讀取許可權。
在瞭解完nginx + php
執行需要的許可權後,我們可以得出下面這幾條結論:
- 要讀取一個檔案,首先需要具有對檔案所在資料夾的執行許可權,然後需要對檔案的讀取許可權。
- php檔案的執行不需要檔案的執行許可權,只需要nginx和php-fpm執行賬戶有讀取php檔案的許可權。
- php檔案能不能列出一個資料夾的內容,跟php-fpm的執行賬戶對資料夾的讀取許可權有關。
- php檔案如果要執行系統命令,需要php-fpm的執行賬戶有對應sh的執行權。
根據上面的結論,我們就能解決下面幾個常見的安全問題。
-
Q:木馬上傳後不能被執行。
A:針對上傳目錄,在nginx配置檔案中加入相應的配置,使得上傳目錄無法解析php檔案。
-
Q:讓木馬執行後看不到非網站目錄檔案。
A:取消php-fpm執行賬戶對於其他目錄的讀取許可權。
-
Q:木馬不能執行系統命令。
A:取消php-fpm賬戶對於sh的執行許可權。
-
Q:限制木馬執行系統命令後的許可權。
A:php-fpm賬戶不要用root或者加入root組。
nginx + php
安全配置方案
-
修改網站目錄所有者為非php-fpm和nginx的執行賬戶,我這裡修改為root。
chown -R root:root wwwroot/
-
修改nginx及php-fpm的執行賬戶及組為nobody。
vi /usr/local/nginx/conf/nginx.conf
vi /usr/local/php/etc/php-fpm.conf
-
新增nobody對網站目錄的讀取許可權。
chmod o+r –R wwwroot/
-
取消nobody對於/bin/sh 的執行許可權。
chmod 776 /bin/sh
-
確認網站目錄對於nobody的許可權為可讀可執行,對網站檔案的許可權為可讀。
-
對於上傳目錄或者需要寫檔案的目錄新增nobody的寫入許可權。
-
配置
nginx.conf
對於上傳目錄無php的執行許可權。 -
配置
nginx.conf
禁止訪問的資料夾,如後臺等;或者限制可以訪問這些目錄的ip。 -
配置
nginx.conf
禁止訪問的檔案型別,如日誌檔案log等。
最後是幾條nginx的常用配置:
-
禁止某個目錄被訪問。
如:禁止訪問path目錄
location ^~ /path { deny all; )
可以按實際需要把path換成其它目錄,這裡的path後是否帶有
/
會有兩種不同的效果:帶/
會禁止訪問該目錄和該目錄下所有檔案的訪問;不帶/
的話,只要目錄開頭匹配上那個關鍵字就會被禁止訪問,無論是檔案或資料夾,所以這一條要放在fastcgi配置之前。 -
禁止php檔案的訪問及執行。
如:去掉單個目錄的php執行許可權
location ~ /attach/.*\.(php|php5)?$ { deny all; }
如:去掉多個目錄的PHP執行許可權
location ~ /(attach|upload)/.*\.(php|php5)?$ { deny all; }
-
禁止ip的訪問。
如:禁止一個ip段
deny 10.0.0.0/8;
如:只允許某個IP或某個IP段使用者訪問,其它使用者全都禁止
allow x.x.x.x; allow 10.0.0.0/8; deny all;