php-fpm的搭建跟加固方法
時(shí)間:2023-04-18 23:42:02 | 來源:網(wǎng)站運(yùn)營
時(shí)間:2023-04-18 23:42:02 來源:網(wǎng)站運(yùn)營
php-fpm的搭建跟加固方法:
php-fpm安裝
nginx本身不能處理PHP,它只是個(gè)web服務(wù)器,當(dāng)接收到請求后,如果是php請求,則發(fā)給php解釋器處理,并把結(jié)果返回給客戶端。 nginx一般是把請求發(fā)fastcgi管理進(jìn)程處理,fascgi管理進(jìn)程選擇cgi子進(jìn)程處理結(jié)果并返回被nginx。
那什么又是cgi呢?CGI(Common Gateway Interface)。CGI是外部應(yīng)用程序(CGI程序)與Web服務(wù)器之間的接口標(biāo)準(zhǔn),是在CGI程序和Web服務(wù)器之間傳遞信息的規(guī)程。CGI規(guī)范允許Web服務(wù)器執(zhí)行外部程序,并將它們的輸出發(fā)送給Web瀏覽器,CGI將Web的一組簡單的靜態(tài)超媒體文檔變成一個(gè)完整的新的交互式媒體。
簡單的說,就是:cgi就是專門用來和web 服務(wù)器打交道的。web服務(wù)器收到用戶請求,就會(huì)把請求提交給cgi程序(php的fastcgi),cgi程序根據(jù)請求提交的參數(shù)作應(yīng)處理(解析php),然后輸出標(biāo)準(zhǔn)的html語句返回給web服服務(wù)器,再返回給客戶端,這就是普通cgi的工作原理。
安裝
yum安裝
yum install php php-mysql php-fpm
安裝成功。
php-fpm配置文件路徑:/etc/php-fpm.d/www.conf
php配置文件路徑:/etc/php.ini
說明:
php-mysql,這個(gè)是后續(xù)鏈接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,內(nèi)容配置如下
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;
這個(gè)配置的意思是 在瀏覽器中訪問的.php文件,實(shí)際讀取的是 $document_root(網(wǎng)站根目錄)下的.php文件 -- 也就是說當(dāng)訪問127.0.0.1/index.php的時(shí)候,需要讀取網(wǎng)站根目錄下面的index.php文件,如果沒有配置這一配置項(xiàng)時(shí),nginx不回去網(wǎng)站根目錄下訪問.php文件,所以返回空白
SCRIPT_FILENAME這個(gè)參數(shù)在fastcgi_params也有,默認(rèn)是$fastcgi_script_name,可以看出只是添加了網(wǎng)站根目錄
啟動(dòng)php-fpm
開啟自啟動(dòng)
sudo systemctl enable php-fpm
測試是否設(shè)置成功
/usr/share/nginx/html目錄下新建phpinfo.php文件,內(nèi)容如下:
<?php echo 6666666666; phpinfo(); ?>
重啟nginx
sudo systemctl restart nginx
訪問
http://192.168.189.134/phpinfo.php可以訪問,已經(jīng)成功安裝了。
加固
php-fpm降權(quán)
修改/etc/php-fpm.d/www.conf將 user = apache group = apache改為 user = nobody group = nobody
php啟動(dòng)安全模式
PHP 環(huán)境提供的安全模式是一個(gè)非常重要的內(nèi)嵌安全機(jī)制,PHP 安全模式能有效控制一些 PHP 環(huán)境中的函數(shù)(例如
system()
函數(shù),
官網(wǎng)有個(gè)列表),對大部分的文件操作函數(shù)進(jìn)行權(quán)限控制,同時(shí)不允許對某些關(guān)鍵文件進(jìn)行修改(例如 /etc/passwd)。默認(rèn)的 php.ini 配置文件并沒有啟用安全模式
php5.4以前的版本修改/etc/php.ini
safe_mode = on
php5.4就移除安全模式了,下面是
官網(wǎng)的說明
下面是安全模式下的功能
用戶組安全
當(dāng)您啟用安全模式后,如果
safe_mode_gid
選項(xiàng)被關(guān)閉,PHP 腳本能夠?qū)ξ募M(jìn)行訪問,且相同用戶組的用戶也能夠?qū)υ撐募M(jìn)行訪問。
因此,建議您將該選項(xiàng)設(shè)置為關(guān)閉狀態(tài):
safe_mode_gid = off
安全模式下執(zhí)行程序主目錄
如果啟用了安全模式后,想要執(zhí)行某些程序的時(shí)候,可以指定需要執(zhí)行程序的主目錄,例如:
safe_mode_exec_dir = /usr/bin
一般情況下,如果不需要執(zhí)行什么程序,建議您不要指定執(zhí)行系統(tǒng)程序的目錄。您可以指定一個(gè)目錄,然后把需要執(zhí)行的程序拷貝到這個(gè)目錄即可,例如:
safe_mode_exec_dir = /temp/cmd
但是,更推薦您不要執(zhí)行任何程序。這種情況下,只需要將執(zhí)行目錄指向網(wǎng)頁目錄即可:
safe_mode_exec_dir = /usr/www
安全模式下包含文件
如果您需要在安全模式下包含某些公共文件,您只需要修改以下選項(xiàng)即可:
safe_mode_include_dir = /usr/www/include/
一般情況下,PHP 腳本中包含的文件都是在程序已經(jīng)寫好的,可以根據(jù)您的具體需要進(jìn)行設(shè)置。
設(shè)置 doc_root
修改/etc/php.ini
doc_root = /usr/share/nginx/hml/
上圖是修改后的,訪問的phpinfo.php不在這個(gè)目錄下,所以不被解析并訪問
查看日志,現(xiàn)在不能打開這個(gè)php,起到限制php的執(zhí)行目錄,doc_root目錄以外的php無法被解析
修改為正確的路徑
doc_root = /usr/share/nginx/html/
重啟pgp-fpm
可以被解析并訪問
控制 PHP 腳本能訪問的目錄
修改/etc/php.ini
open_basedir = /usr/share/nginx/htm/
訪問的phpinfo.php不在上面的目錄下,則禁止訪問
修改為正確路徑則訪問成功
關(guān)閉危險(xiǎn)函數(shù)
如果您啟用了安全模式,那么可以不需要設(shè)置函數(shù)禁止,但為了安全考慮,還是建議您進(jìn)行相關(guān)設(shè)置。例如,您不希望執(zhí)行包括
system()
等在內(nèi)的執(zhí)行命令的 PHP 函數(shù),以及能夠查看 PHP 信息的
phpinfo()
等函數(shù),那么您可以通過以下設(shè)置禁止這些函數(shù):
disable_functions=phpinfo
上面做測試禁用了phpinfo,重啟php-fpm
phpinfo.php里面使用了這個(gè)函數(shù),我們看下是否能執(zhí)行
沒有php的信息,函數(shù)被禁用了。
關(guān)閉 PHP 版本信息在 HTTP 頭中的泄露
暴露給黑客的信息越少,攻擊成功就會(huì)越高,php版本也是一樣的,不知道版本就不能針對具體版本進(jìn)行研究入侵了。
修改/etc/php.ini文件如下
expose_php=off
重啟php-fpm
我們驗(yàn)證是否設(shè)置成功了,圖片可看出生效了,沒有了php版本信息
錯(cuò)誤信息控制
display_errors = Offerror_reporting = E_WARNING & E_ERROR
錯(cuò)誤日志
一般 PHP 環(huán)境在沒有連接到數(shù)據(jù)庫或者其他情況下會(huì)有錯(cuò)誤提示信息,錯(cuò)誤信息中可能包含 PHP 腳本當(dāng)前的路徑信息或者查詢的 SQL 語句等信息,這類信息如果暴露給黑客是不安全的,因此建議您禁止該錯(cuò)誤提示:
修改/etc/php.ini
display_errors = Off #如果您確實(shí)要顯示錯(cuò)誤信息,一定要設(shè)置顯示錯(cuò)誤信息的級別。例如,只顯示警告以上的錯(cuò)誤信息: error_reporting = E_WARNING & E_ERROR
打開錯(cuò)誤信息提示
關(guān)閉錯(cuò)誤信息提示
對比上面的錯(cuò)誤信息,打開狀態(tài)直接暴露了phpinfo.php的路徑了,給黑客很好的信息了。
關(guān)閉注冊全局變量
在 PHP 環(huán)境中提交的變量,包括使用 POST 或者 GET 命令提交的變量,都將自動(dòng)注冊為全局變量,能夠被直接訪問。這對您的服務(wù)器是非常不安全的,因此建議您將注冊全局變量的選項(xiàng)關(guān)閉,禁止將所提交的變量注冊為全局變量。
register_globals = off
注意: 該選項(xiàng)參數(shù)在 PHP 5.3 以后的版本中已被移
防護(hù)SQL注入攻擊
php5.4以前的版本,有一個(gè)自動(dòng)將進(jìn)入 PHP 腳本的數(shù)據(jù)進(jìn)行轉(zhuǎn)義的過程。
當(dāng)打開時(shí),所有的
'(單引號),
"(雙引號),*/*(反斜線)和
NULL 字符都會(huì)被自動(dòng)加上一個(gè)反斜線進(jìn)行轉(zhuǎn)義。這和
addslashes() 作用完全相同。最好在編碼時(shí)不要轉(zhuǎn)義而在運(yùn)行時(shí)根據(jù)需要而轉(zhuǎn)義,被稱為魔術(shù)引號(Magic Quote),不過php5.4開始就被移除了.
php5.4以前的版本修改配置/etc/php.ini
magic_quotes_gpc = On
以上內(nèi)容希望幫助到大家,更多PHP大廠PDF面試文檔,PHP進(jìn)階架構(gòu)視頻資料,PHP精彩好文可以關(guān)注公眾號:PHP開源社區(qū),或者訪問:精華PHP技術(shù)文章整理合集——PHP框架篇
精華PHP技術(shù)文合集——微服務(wù)架構(gòu)篇
精華PHP技術(shù)文合集——分布式架構(gòu)篇
精華PHP技術(shù)文合集——高并發(fā)場景篇
精華PHP技術(shù)文章整理合集——數(shù)據(jù)庫篇