php-fpm搭建及加固

php-fpm安裝

nginx自己不能處理PHP,它只是個web服務器,當接收到請求後,若是是php請求,則發給php解釋器處理,並把結果返回給客戶端。 nginx通常是把請求發fastcgi管理進程處理,fascgi管理進程選擇cgi子進程處理結果並返回被nginx。php

那什麼又是cgi呢?html

CGI(Common Gateway Interface)。CGI是外部應用程序(CGI程序)與Web服務器之間的接口標準,是在CGI程序和Web服務器之間傳遞信息的規程。CGI規範容許Web服務器執行外部程序,並將它們的輸出發送給Web瀏覽器,CGI將Web的一組簡單的靜態超媒體文檔變成一個完整的新的交互式媒體。mysql

簡單的說,就是:cgi就是專門用來和web 服務器打交道的。web服務器收到用戶請求,就會把請求提交給cgi程序(php的fastcgi),cgi程序根據請求提交的參數做應處理(解析php),而後輸出標準的html語句返回給web服服務器,再返回給客戶端,這就是普通cgi的工做原理。nginx

安裝

yum安裝

yum install php php-mysql php-fpm

安裝成功。web

php-fpm配置文件路徑:/etc/php-fpm.d/www.confsql

php配置文件路徑:/etc/php.ini數據庫

說明:apache

php-mysql,這個是後續連接mysql須要的瀏覽器

 

修改php配置

php.ini安全

將 ;cgi.fix_pathinfo=1 改成 cgi.fix_pathinfo=1 只要把前面的分號去掉就能夠了;

fix_pathinfo是用來幹嗎的呢?

爲CGI提供真正的PATH_INFO / PATH_TRANSLATED支持,不打開,nginx是解析不了路徑的。

www.conf

將 user = apache group = apache

改成 user = nginx group = nginx

 

nginx配置php-fpm解析php請求

注:nginx安裝參考

/etc/nginx/conf.d目錄下新增php-fpm.conf,內容配置以下

server {
    listen  80;
    server_name 192.168.189.134;
    location ~ .php$ {
          try_files $uri =404;
          root /usr/share/nginx/html;
          fastcgi_pass 127.0.0.1:9000;
          fastcgi_index index.php;
          fastcgi_param SCRIPT_FILENAME     $document_root$fastcgi_script_name;
          include fastcgi_params;
     }
}

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

這個配置的意思是 在瀏覽器中訪問的.php文件,實際讀取的是 $document_root(網站根目錄)下的.php文件 -- 也就是說當訪問127.0.0.1/index.php的時候,須要讀取網站根目錄下面的index.php文件,若是沒有配置這一配置項時,nginx不回去網站根目錄下訪問.php文件,因此返回空白

SCRIPT_FILENAME這個參數在fastcgi_params也有,默認是$fastcgi_script_name,能夠看出只是添加了網站根目錄

 

啓動php-fpm

開啓自啓動

sudo systemctl enable php-fpm

測試是否設置成功

/usr/share/nginx/html目錄下新建phpinfo.php文件,內容以下:

<?php
echo 6666666666;
phpinfo();
?>

重啓nginx

sudo systemctl restart nginx

訪問http://192.168.189.134/phpinfo.php

能夠訪問,已經成功安裝了。

 

加固

php-fpm降權

修改/etc/php-fpm.d/www.conf

將 user = apache group = apache

改成 user = nobody group = nobody

php啓動安全模式

PHP 環境提供的安全模式是一個很是重要的內嵌安全機制,PHP 安全模式能有效控制一些 PHP 環境中的函數(例如system()函數,官網有個列表),對大部分的文件操做函數進行權限控制,同時不容許對某些關鍵文件進行修改(例如 /etc/passwd)。默認的 php.ini 配置文件並無啓用安全模式

php5.4之前的版本修改/etc/php.ini

safe_mode = on

php5.4就移除安全模式了,下面是官網的說明

 

下面是安全模式下的功能

用戶組安全

當您啓用安全模式後,若是safe_mode_gid選項被關閉,PHP 腳本可以對文件進行訪問,且相同用戶組的用戶也可以對該文件進行訪問。

所以,建議您將該選項設置爲關閉狀態:

safe_mode_gid = off

安全模式下執行程序主目錄

若是啓用了安全模式後,想要執行某些程序的時候,能夠指定須要執行程序的主目錄,例如:

safe_mode_exec_dir = /usr/bin

通常狀況下,若是不須要執行什麼程序,建議您不要指定執行系統程序的目錄。您能夠指定一個目錄,而後把須要執行的程序拷貝到這個目錄便可,例如:

safe_mode_exec_dir = /temp/cmd

可是,更推薦您不要執行任何程序。這種狀況下,只須要將執行目錄指向網頁目錄便可:

safe_mode_exec_dir = /usr/www

安全模式下包含文件

若是您須要在安全模式下包含某些公共文件,您只須要修改如下選項便可:

safe_mode_include_dir = /usr/www/include/

通常狀況下,PHP 腳本中包含的文件都是在程序已經寫好的,能夠根據您的具體須要進行設置。

 

設置 doc_root

修改/etc/php.ini

doc_root = /usr/share/nginx/hml/

上圖是修改後的,訪問的phpinfo.php不在這個目錄下,因此不被解析並訪問

查看日誌,如今不能打開這個php,起到限制php的執行目錄,doc_root目錄之外的php沒法被解析

 

修改成正確的路徑

doc_root = /usr/share/nginx/html/

重啓pgp-fpm

 

能夠被解析並訪問

控制 PHP 腳本能訪問的目錄

修改/etc/php.ini

open_basedir = /usr/share/nginx/htm/

訪問的phpinfo.php不在上面的目錄下,則禁止訪問

 

修改成正確路徑則訪問成功

關閉危險函數

若是您啓用了安全模式,那麼能夠不須要設置函數禁止,但爲了安全考慮,仍是建議您進行相關設置。例如,您不但願執行包括system()等在內的執行命令的 PHP 函數,以及可以查看 PHP 信息的phpinfo()等函數,那麼您能夠經過如下設置禁止這些函數:

disable_functions=phpinfo

上面作測試禁用了phpinfo,重啓php-fpm

phpinfo.php裏面使用了這個函數,咱們看下是否能執行

沒有php的信息,函數被禁用了。

 

關閉 PHP 版本信息在 HTTP 頭中的泄露

暴露給黑客的信息越少,攻擊成功就會越高,php版本也是同樣的,不知道版本就不能針對具體版本進行研究入侵了。

修改/etc/php.ini文件以下

expose_php=off

重啓php-fpm

咱們驗證是否設置成功了,圖片可看出生效了,沒有了php版本信息

錯誤信息控制

display_errors = Off

error_reporting = E_WARNING & E_ERROR

錯誤日誌

通常 PHP 環境在沒有鏈接到數據庫或者其餘狀況下會有錯誤提示信息,錯誤信息中可能包含 PHP 腳本當前的路徑信息或者查詢的 SQL 語句等信息,這類信息若是暴露給黑客是不安全的,所以建議您禁止該錯誤提示:

修改/etc/php.ini

display_errors = Off
#若是您確實要顯示錯誤信息,必定要設置顯示錯誤信息的級別。例如,只顯示警告以上的錯誤信息:
error_reporting = E_WARNING & E_ERROR

打開錯誤信息提示

 

關閉錯誤信息提示

 

對比上面的錯誤信息,打開狀態直接暴露了phpinfo.php的路徑了,給黑客很好的信息了。

關閉註冊全局變量

在 PHP 環境中提交的變量,包括使用 POST 或者 GET 命令提交的變量,都將自動註冊爲全局變量,可以被直接訪問。這對您的服務器是很是不安全的,所以建議您將註冊全局變量的選項關閉,禁止將所提交的變量註冊爲全局變量。

register_globals = off

注意: 該選項參數在 PHP 5.3 之後的版本中已被移

防禦SQL注入攻擊

php5.4之前的版本,有一個自動將進入 PHP 腳本的數據進行轉義的過程。

當打開時,全部的 '(單引號),"(雙引號),*\*(反斜線)和 NULL 字符都會被自動加上一個反斜線進行轉義。這和 addslashes() 做用徹底相同。最好在編碼時不要轉義而在運行時根據須要而轉義,被稱爲魔術引號(Magic Quote),不過php5.4開始就被移除了.

php5.4之前的版本修改配置/etc/php.ini

magic_quotes_gpc = On

 

 

參考資料

https://help.aliyun.com/knowledge_detail/50218.html

https://www.php.net/manual/zh/security.php

http://www.ttlsa.com/safe/php-environment-security-reinforcement-configuration/

https://cloud.tencent.com/developer/article/1042833

相關文章
相關標籤/搜索