1. 程式人生 > >nginx+php安全配置

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執行需要的許可權後,我們可以得出下面這幾條結論:

  1. 要讀取一個檔案,首先需要具有對檔案所在資料夾的執行許可權,然後需要對檔案的讀取許可權。
  2. php檔案的執行不需要檔案的執行許可權,只需要nginx和php-fpm執行賬戶有讀取php檔案的許可權。
  3. php檔案能不能列出一個資料夾的內容,跟php-fpm的執行賬戶對資料夾的讀取許可權有關。
  4. 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安全配置方案

  1. 修改網站目錄所有者為非php-fpm和nginx的執行賬戶,我這裡修改為root。

     chown -R root:root wwwroot/
    

    1

  2. 修改nginx及php-fpm的執行賬戶及組為nobody。

     vi /usr/local/nginx/conf/nginx.conf
    

    2

     vi /usr/local/php/etc/php-fpm.conf
    

    3

  3. 新增nobody對網站目錄的讀取許可權。

     chmod o+r –R wwwroot/
    
  4. 取消nobody對於/bin/sh 的執行許可權。

     chmod 776 /bin/sh
    
  5. 確認網站目錄對於nobody的許可權為可讀可執行,對網站檔案的許可權為可讀。

  6. 對於上傳目錄或者需要寫檔案的目錄新增nobody的寫入許可權。

  7. 配置nginx.conf對於上傳目錄無php的執行許可權。

  8. 配置nginx.conf禁止訪問的資料夾,如後臺等;或者限制可以訪問這些目錄的ip。

  9. 配置nginx.conf禁止訪問的檔案型別,如日誌檔案log等。

最後是幾條nginx的常用配置:

  1. 禁止某個目錄被訪問。

    如:禁止訪問path目錄

     location ^~ /path {
         deny all;
     )
    

    可以按實際需要把path換成其它目錄,這裡的path後是否帶有/會有兩種不同的效果:帶/會禁止訪問該目錄和該目錄下所有檔案的訪問;不帶/的話,只要目錄開頭匹配上那個關鍵字就會被禁止訪問,無論是檔案或資料夾,所以這一條要放在fastcgi配置之前。

  2. 禁止php檔案的訪問及執行。

    如:去掉單個目錄的php執行許可權

     location ~ /attach/.*\.(php|php5)?$ { 
         deny all; 
     } 
    

    如:去掉多個目錄的PHP執行許可權

     location ~ /(attach|upload)/.*\.(php|php5)?$ { 
         deny all; 
     } 
    
  3. 禁止ip的訪問。

    如:禁止一個ip段

     deny 10.0.0.0/8;
    

    如:只允許某個IP或某個IP段使用者訪問,其它使用者全都禁止

     allow x.x.x.x;  
     allow 10.0.0.0/8;  
     deny all;