Windows XP Windows 7 Windows 2003 Windows Vista Windows教程綜合 Linux 系統教程
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟件教程
 Windows教程網 >> 電腦軟件教程 >> 服務器技術 >> 關於服務器 >> LNMP PHP環境下的安全加固設置經驗

LNMP PHP環境下的安全加固設置經驗

日期:2017/2/8 10:10:39      編輯:關於服務器

以往的lamp網站向著lnmp發展, 筆者工作環境使用lnmp多年, 在這裡很高興和大家分享一下多年的lnmp網站的php安全配置,至於lamp安全後續與大家分享,其實內容上八成相同,這邊著重講php安全配置,看內容.

1. 使用open_basedir限制虛擬主機跨目錄訪問
[HOST=www.45it.com]
open_basedir=/data/site/www.45it.com/:/tmp/

[HOST=test.45it.com]
open_basedir=/data/site/test.45it.com/:/tmp/


如上配置的意思是www.45it.com下的php程序被限制在open_basedir配置的兩個目錄下, 不可以訪問到其他目錄。如果沒有做以上的配置,那麼test.45it.com與www.45it.com的程序可以互相訪問.
如果其中一個站點有漏洞被黑客植入了webshell,那麼他可以通過這個站點拿下同一台服務器的其他站點,最後掛木馬.

[warning]注意:目錄最後一定要加上/. 比如你寫/tmp,你的站點同時存在/tmp123等等以/tmp開頭的目錄,那麼黑客也可以訪問到這些目錄,另外, php5.3以上支持這個寫法,5.2不支持。[/warning]

2. 禁用不安全PHP函數
disable_functions = show_source,system,shell_exec,passthru,exec,popen,proc_open,proc_get_status,phpinfo


禁止php執行以上php函數,以上php程序可以執行linux命令, 比如可以執行ping、netstat、mysql等等.如果你的系統有提權bug,後果你懂得.

3. 關注軟件安全資訊
積極關注linux內核、php安全等信息並及時采取錯誤

4. php用戶只讀
這個方法是我最推崇的方法,但是執行之前一定要和php工程師商量. 為什麼?例如站點www.45it.com根目錄用戶與組為nobody,而運行php的用戶和組為phpuser。目錄權限為755,文件權限為644. 如此,php為只讀,無法寫入任何文件到站點目錄下。也就是說用戶不能上傳文件,即使有漏洞, 黑客也傳不了後門, 更不可能掛木馬.  這麼干之前告知程序員將文件緩存改為nosql內存緩存(例如memcached、redis等),上傳的文件通過接口傳到其他服務器(靜態服務器)。

[warning]備注:程序生成本地緩存是個非常糟糕的習慣,使用文件緩存速度緩慢、浪費磁盤空間、最重要一點是一般情況下服務器無法橫向擴展.[/warning]

5. 關閉php錯誤日志
display_errors = On
改為
display_errors = Off


程序一旦出現錯誤,詳細錯誤信息便立刻展示到用戶眼前,其中包含路徑、有的甚至是數據庫賬號密碼. 注入滲透密碼基本上都是通過這個報錯來猜取。生產環境上強烈關閉它

6. php上傳分離
將文件上傳到遠程服務器,例如nfs等。當然也可以調用你們寫好的php接口. 即使有上傳漏洞,那麼文件也被傳到了靜態服務器上。木馬等文件根本無法執行.

舉個例子:
php站點www.45it.com,目錄/data/site/www.45it.com
靜態文件站點static.45it.com,目錄/data/site/static.45it.com

文件直接被傳到了/data/site/static.45it.com,上傳的文件無法通過www.45it.com來訪問,只能使用static.45it.com訪問,但是static.45it.com不支持php.

7. 關閉php信息
expose_php = On
改為
expose_php = Off


不輕易透露自己php版本信息,防止黑客針對這個版本的php發動攻擊.

8. 禁止動態加載鏈接庫
disable_dl = On;
改為
enable_dl = Off;

9. 禁用打開遠程url
allow_url_fopen = On
改為
allow_url_fopen = Off


其實這點算不上真正的安全, 並不會導致web被入侵等問題,但是這個非常影響性能, 筆者認為它屬於狹義的安全問題.

以下方法將無法獲取遠程url內容


$data = file_get_contents("http://www.baidu.com/");


以下方法可以獲取本地文件內容


$data = file_get_contents("1.txt");


如果你的站點訪問量不大、數據庫也運行良好,但是web服務器負載出奇的高,請你直接檢查下是否有這個方法。筆者遇到過太多這個問題,目前生產環境已全線禁用,如果php工程師需要獲取遠程web的內容,建議他們使用curl.

php curl如何使用請查看我之前的文章《PHP使用curl替代file_get_contents》,以及php下curl與file_get_contents性能對比.

10.結束
今天lnmp站點的php安全暫時講到這裡,有問題後續將繼續補充.

Copyright © Windows教程網 All Rights Reserved