通過對伺服器端特性的配置加強php的安全

來源:互聯網
上載者:User
關鍵字 通過對伺服器端特性的配置加強php的安全
作者:san < xuzhikun@nsfocus.com >
首頁:http://www.nsfocus.com
日期:2001-11-15

  前面象Shaun Clowes和rfp等都比較詳細的介紹了php、cgi程式在編程過程中遇到 的問題,以及如何通過應用程式漏洞突破系統,這篇文章我們來通過對php的一些伺服器端特性來進行配置加強php的安全。寫 cgi指令碼的時候我們的確一定注意各種安全問題,對使用者輸入進行嚴格的過濾,但是常在岸邊走哪有不濕鞋 ,吃燒餅哪有不掉芝麻,人有失蹄馬有失手,連著名的phpnuke、phpMyAdmin等程式都出現過很嚴重的 問題,更何況象我等小混混寫的指令碼。所以現在我們假設php指令碼已經出現嚴重問題,比如象前一陣子 phpnuke的可以上傳php指令碼的大問題了,我們如何通過對伺服器的配置使指令碼出現如此問題也不能突破 系統。

1、編譯的時候注意補上已知的漏洞

  從4.0.5開始,php的mail函數加入了第五個參數,但它沒有好好過濾,使得php  應用程式能突破safe_mode的限制而去執行命令。所以使用4.0.5和4.0.6的時候  在編譯前我們需要修改php源碼包裡
  ext/standard/mail.c檔案,禁止mail函數的第五參數或過濾shell字元。在mail.c
  檔案的第152行,也就是下面這行:
  if (extra_cmd != NULL) {
  後面加上extra_cmd=NULL;或extra_cmd = php_escape_shell_cmd(extra_cmd);
  然後編譯php,那麼我們就修補了這個漏洞。

2、修改php.ini設定檔

  以php發行版的php.ini-dist為藍本進行修改。
  1)Error handling and logging
   在Error handling and logging部分可以做一些設定。先找到:
   display_errors = On
   php預設是開啟錯誤資訊顯示的,我們把它改為:
   display_errors = Off

   關閉錯誤顯示後,php函數執行錯誤的資訊將不會再顯示給使用者,這樣能在一
   定程度上防止攻擊者從錯誤資訊得知指令碼的物理位置,以及一些其它有用的   資訊,起碼給攻擊者的黑箱檢測造成一定的障礙 。這些錯誤資訊可能對我們 自己有用,可以讓它寫到指定檔案中去,那麼修改以下:
   log_errors = Off
   改為:
   log_errors = On

   以及指定檔案,找到下面這行:
   ;error_log = filename
   去掉前面的;注釋,把filename改為指定檔案,如
   /usr/local/apache/logs/php_error.log

   error_log = /usr/local/apache/logs/php_error.log
   這樣所有的錯誤都會寫到php_error.log檔案裡。

  2)Safe Mode

   php的safe_mode功能對很多函數進行了限制或禁用了,能在很大程度解決php的
   安全問題。在Safe Mode部分找到:
   safe_mode = Off
   改為:
   safe_mode = On

   這樣就開啟了safe_mode功能。象一些能執行系統命令的函數shell_exec()和``   被禁止,其它的一些執行函數如:exec(), system(), passthru(), popen()   將被限制只能執行safe_mode_exec_dir指定目錄下的程式。如果你實在是要 執行一些命令或程式,找到以下:
   safe_mode_exec_dir =
   指定要執行的程式的路徑,如:
   safe_mode_exec_dir = /usr/local/php/exec

   然後把要用的程式拷到/usr/local/php/exec目錄下,這樣,象上面的被限制
   的函數還能執行該目錄裡的程式。

   關於安全模式下受限函數的詳細資料請查看php主站的說明:
   http://www.php.net/manual/en/features.safe-mode.php

  3)disable_functions

   如果你對一些函數的危害性不太清楚,而且也沒有使用,索性把這些函數禁
   止了。找到下面這行:
   disable_functions =
   在”=“後面加上要禁止的函數,多個函數用”,“隔開。

3、修改httpd.conf

  如果你只允許你的php指令碼程式在web目錄裡操作,還可以修改httpd.conf檔案限 制php的操作路徑。比如你的web目錄是/usr/local/apache/htdocs,那麼在
  httpd.conf裡加上這麼幾行:

 
   php_admin_value open_basedir /usr/local/apache/htdocs
 

  這樣,如果指令碼要讀取/usr/local/apache/htdocs以外的檔案將不會被允許,
  如果錯誤顯示開啟的話

  會提示這樣的錯誤:
  Warning: open_basedir restriction in effect. File is in wrong directory in
  /usr/local/apache/htdocs/open.php on line 4
  等等。

4、對php代碼進行編譯

  Zend對php的貢獻很大,php4的引擎就是用Zend的,而且它還開發了ZendOptimizer
  和ZendEncode等許多php的加強組件。最佳化器ZendOptimizer只需在
  http://www.zend.com註冊就可以免費得到,下面幾個是用於4.0.5和4.0.6的
  ZendOptimizer,檔案名稱分別對於各自的系統:

  ZendOptimizer-1[1].1.0-PHP_4.0.5-FreeBSD4.0-i386.tar.gz
  ZendOptimizer-1[1].1.0-PHP_4.0.5-linux_glibc21-i386.tar.gz
  ZendOptimizer-1[1].1.0-PHP_4.0.5-Solaris-sparc.tar.gz
  ZendOptimizer-1[1].1.0-PHP_4.0.5-Windows-i386.zip


  最佳化器的安裝非常方便,包裡面都有詳細的說明。以UNIX版本的為例,看清操
  作系統,把包裡的ZendOptimizer.so檔案解壓到一個目錄,假設是/usr/local/lib
  下,在php.ini裡加上兩句:
  zend_optimizer.optimization_level=15
  zend_extension="/usr/local/lib/ZendOptimizer.so"

  就可以了。用phpinfo()看到Zend表徵圖左邊有下面文字:
  with Zend Optimizer v1.1.0, Copyright (c) 1998-2000, by Zend Technologies

  那麼,最佳化器已經掛接成功了。
  但是編譯器ZendEncode並不是免費的,這裡提供給大家一個
  http://www.PHPease.com的馬勇設計的編譯器外殼,如果用於商業目的,請與
  http://www.zend.com聯絡取得許可協議。

  php指令碼編譯後,指令碼的執行速度增加不少,指令檔只能看到一堆亂碼,這將
  阻止攻擊者進一步分析伺服器上的指令碼程式,而且原先在php指令碼裡以明文儲存
  的口令也得到了保密,如MySQL的口令。不過在伺服器端改指令碼就比較麻煩了,
  還是本地改好再上傳吧。


5、檔案及目錄的使用權限設定

  web目錄裡除了上傳目錄,其它的目錄和檔案的許可權一定不能讓nobody使用者有寫
  許可權。否則,攻擊者可  以修改首頁檔案,所以web目錄的許可權一定要設定好
  。 還有,php指令碼的屬主千萬不能是root,因為safe_mode下讀檔案的函數被限
  製成被讀檔案的屬主必須  和當前執行指令碼的屬主是一樣才能被讀,否則如果
  錯誤顯示開啟的話會顯示諸如以下的錯誤:

  Warning: SAFE MODE Restriction in effect. The script whose uid is 500 is not
  allowed to access /etc/passwd owned by uid 0 in /usr/local/apache/htdocs/open.php
  on line 3
  這樣我們能防止許多系統檔案被讀,比如:/etc/passwd等。

  上傳目錄和上傳指令碼的屬主也要設成一樣,否則會出現錯誤的,在safe_mode下
  這些要注意。

6、mysql的啟動使用權限設定


  mysql要注意的是不要用root來啟動,最好另外建一個mysqladm使用者。可以在
  /etc/rc.local等系統啟動指令碼裡加上一句:
  su mysqladm -c "/usr/local/mysql/share/mysql/mysql.server start"

  這樣系統重啟後,也會自動用mysqladmin使用者啟動mysql進程。

7、記錄檔及上傳目錄的審核及

  查看日誌和人的惰性有很大關係,要從那麼大的記錄檔裡尋找攻擊痕迹有些大海撈針,而且也未必有。 web上傳的目錄裡的檔案,也應該經常檢查,也許
  程式有問題,使用者傳上了一些非法的檔案,比如執行指令碼等。

8、作業系統自身的補丁

  一樣,給系統打已知漏洞的補丁是系統管理員最基本的職責,這也是最後一道防線。
 

經過以上的配置,雖然說不上固若金湯,但是也在相當程度上給攻擊者的測試造成很多麻煩,即使php指令碼程式出現比較嚴重的漏洞,攻擊者也無法造成實際性的破壞。如果您還有更古怪,更變態的配置方法,希望能一起分享分享;)

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.