使用Chroot解決PHP的執行安全問題

2021-06-22 05:30:19 字數 2586 閱讀 7210

近些日子,小蔣的一篇博文引起了廣大主機商的關注。其原因是小蔣運營的創智主機被提交了漏洞到烏雲網上在這篇文章中小蔣給出了解決方法,就是採用禁用函式的方法來保證伺服器環境的安全。

但是,禁用函式真的是最好的選擇麼?不是的!

amh面板的開發者amysql告訴我們,更好的選擇是chroot!

amh面板是一款lnmp面板,一方面,為了方便版本公升級,另一方面,面板是開發者乙個人開發的,所以amh沒有像kangle,wdcp,lum,webmin等採用二進位制檔案實現平台的環境,而是使用基於amp的php程式來控制平台。這樣,就要考慮到php的安全問題了。由於php寫成的程式,所以需要大量的的使用exec,shell_exec兩個函式來實現面板和系統的資訊交換處理。顯然,小蔣給出的限制函式的方法並不適合amh這樣的面板。那麼,amysql如何解決php的執行安全問題呢?

amysql採用了這樣的方法。對於amh下的虛擬主機,一律開啟chroot來保證安全,而控制台php則關閉chroot來保證面板的正常運作。

說了這麼多,那麼什麼是chroot呢?

據維基百科的詞條解釋,chroot本是unix下的乙個命令,但是,在php-fpm中,也是引入了這一功能。

維基詞條:chroot是在unix系統的乙個操作,用於對當前的程式和它的子程序改變真實的磁碟根目錄。

chroot的工作原理是什麼呢?

由於lnmp環境下,php-fpm與nginx的通訊只能通過cgi實現,所以,如果你在fpm設定中對檔案的根目錄進行修改,那麼,你的php程式就無法跨越這個指定的根目錄。而面板所在的虛擬主機,由於沒有開啟chroot,所以使用的根目錄依然是系統的根目錄 /

具體解釋一下?

就拿我用的amh面板的控制台和普通虛擬主機來說明。控制台檔案放在/home/wwwroot/index/web資料夾下,普通主機的檔案放在/home/wwwroot/domain/web資料夾下。對於控制台程式,由於沒有開啟chroot,所以,這個php檔案的實際位置和執行位置相同,都是/home/wwwroot/index/web/,而其根目錄就是/;對於普通虛擬主機,開啟chroot,那麼,雖然,執行的檔案的位置是/home/wwwroot/domain/web/index.php,但是經過chroot的導向,在php程式中,實際認為的檔案位址是/web/index.php。同時在/home/wwwroot/domain/為了使入侵者認為自己進入的是根系統,而仿照unix的資料夾命名規則,建立了etc,usr,tmp,lib等資料夾,如同為php程式建立了乙個沙盒.所以,使用chroot的使用者不用害怕中**刀,因為他只能在沙盤內起作用,無法對主系統產生影響,從而造成經濟損失。

沙盒(英語:sandbox),有時也稱為沙箱,是為一些**不可信、具備破壞力或無法判定程式意圖的程式提供試驗的環境。然而,沙盒中的所有改動對作業系統不會造成任何損失。通常,這種技術被計算機技術人員廣泛使用,尤其是計算機防毒軟體行業,沙盒是乙個觀察計算機病毒的重要環境。

我們都知道,在類unix系統中,所有程式,甚至裝置,都是由檔案表示,我們所使用的ls,wget命令,事實上都對應著乙個特定的可執行檔案,而當我們使用chroot後,由於/home/wwwwroot/domain/usr下沒有相應的檔案,也就無法執行相應的命令。從而保證系統資訊的安全。

與禁用函式相比,chroot有什麼優點呢?

禁用函式是針對整個php程式而言的,所有需要通過php程式進行解析的檔案,都會受到禁用函式的設定。**程式不同,那麼有可能需要的函式不同,不同的虛擬主機無法單獨設定。而chroot可以根據不同的虛擬主機,進行特異化設定。對於需要使用特殊函式的程式,可以關閉chroot,來保證**程式的正常運轉;程式不需要呼叫特殊的程式,就可以開啟chroot模式;如果只是要啟用乙個或兩個特定的程式,你可以仿照如下的過程新增函式。比如說,當我們開啟chroot時,php程式是無法使用sendmail()函式來發信的,我們可以使用mini_sendmail替代sendmail來修**信。

以上**,在/tmp目錄下編譯mini_sendmail,然後將生成的可執行檔案複製到chroot後目錄下相應位置,以保證發件系統的正常執行。

非amh使用者如何使用chroot功能

找到fastcgi_param script_filename $document_root$fastcgi_script_name;,更改為fastcgi_param script_filename /web$fastcgi_script_name;同時,將php-fpm.conf檔案中的chroot改為chroot = /home/wwwroot/domain

有什麼需要注意的呢?

tips one:chroot模式下,各種探針,如雅黑探針將會失效,報錯。

綜合以上分析,我建議,與其使用死板的禁用函式,我們為什麼不試試更加好用的chroot。

linux使用crontab實現PHP執行定時任務

首先說說cron,它是乙個linux下的定時執行工具。根使用者以外的使用者可以使用 crontab 工具來配置 cron 任務。所有使用者定義的 crontab 都被儲存在 var spool cron 目錄中,並使用建立它們的使用者身份來執行。要以某使用者身份建立乙個 crontab 專案,登入為...

Linux使用crontab實現PHP執行定時任務

安裝crontab yum install crontabs說明 sbin service crond start 啟動服務 sbin service crond stop 關閉服務 sbin service crond restart 重啟服務 sbin service crond reload ...

linux使用crontab實現PHP執行定時任務

檢視 crontab l 檔案位置 var spool cron 安裝crontab yum install crontabs 說明 sbin service crond start 啟動服務 sbin service crond stop 關閉服務 sbin service crond resta...