1. 程式人生 > 程式設計 >Linux下PHP+Apache的26個必知的安全設定

Linux下PHP+Apache的26個必知的安全設定

PHP是一種開源伺服器端指令碼語言,應用很廣泛。Apache web伺服器提供了這種便利:通過HTTP或HTTPS協議,訪問檔案和內容。配置不當的伺服器端指令碼語言會帶來各種各樣的問題。所以,使用php時要小心。以下是Linux下PHP+Apache的26個PHP程式設計師必知的安全方面的設定

為PHP安全提示而提供的示例環境

檔案根目錄(DocumentRoot):/var/www/html

預設的Web伺服器:Apache(可以使用Lighttpd或Nginx來取代Apache)

預設的PHP配置檔案:/etc/php.ini

預設的PHP載入模組配置目錄:/etc/php.d/

我們的示例php安全配置檔案:/etc/php.d/security.ini(需要使用文字編輯器來建立該檔案)

作業系統:RHEL/CentOS/FedoraLinux(相關指令應該與Debian/Ubuntu等其他任何Linux發行版或者OpenBSD/FreeBSD/HP-UX等其他類似Unix的作業系統相容)。

預設的php伺服器TCP/UDP埠:無

為本文所列的大多數操作編寫程式碼時,假定它們將由執行bash外殼程式或其他任何現代外殼程式的根使用者來執行:

$ php -v

示例輸出:

PHP 5.3.3 (cli) (built: Oct 24 2011 08:35:41)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0,Copyright (c) 1998-2010 Zend Technologies

出於演示的用途,我會使用以下作業系統:

$cat/etc/redhat-release

示例輸出:

Red HatEnterprise Linux Server release 6.1 (Santiago)

第1個設定項:瞭解你的對手

基於PHP的應用程式面臨不同型別的攻擊。我注意到了幾種不同型別的攻擊:

XSS:跨站指令碼是Web PHP應用程式中的一種安全漏洞,攻擊者可以利用該漏洞來竊取使用者的資訊。你可以配置Apache,編寫更安全的PHP指令碼(驗證所有的使用者輸入),以避免XSS攻擊。

SQL注入攻擊:這是PHP應用程式的資料庫層中的安全漏洞。使用者輸入不正確地過濾時,應用程式就能執行任何SQL語句。你可以配置Apache,編寫安全程式碼(驗證和轉換所有的使用者輸入),以避免SQL注入攻擊。PHP中的一個常見做法是,在傳送SQL查詢之前,使用名為mysql_real_escape_string()的函式,轉換引數。

檔案上傳:它讓訪客可以將檔案放在(將檔案上傳到)你的伺服器上。這會帶來眾多安全問題,比如刪除你的檔案、刪除資料庫、獲取使用者詳細資料,不一而足。你可以使用php來禁用檔案上傳,或編寫安全程式碼(比如驗證使用者輸入,只允許PNG或GIF等影象檔案型別)。

新增本地和遠端檔案:攻擊者可以從遠端伺服器開啟檔案,執行任何PHP程式碼。這讓他們得以上傳檔案、刪除檔案和安裝後門。可以配置php以禁用遠端檔案執行功能。

eval() :將字串作為PHP程式碼來進行評估。攻擊者常常利用該函式來隱藏其在伺服器本身上面的程式碼和工具。你可以配置PHP,禁用eval()。

sea-surf攻擊(跨站請求偽造,CSRF):這種攻擊迫使終端使用者針對目前已驗證其身份的Web應用程式執行有害的操作。如果是平常的使用者,得逞的CSRF攻擊會危及終端使用者的資料和操作。但如果被盯上的終端使用者使用管理員帳戶,這會危及整個Web應用程式。

第2個設定項:查詢內建的PHP模組

想檢視一組編譯進去的PHP模組,請輸入以下命令:

# php -m

我建議你使用模組數量減少的PHP,以增強效能和安全。比如說,你可以通過刪除(移除)配置檔案或者更名(或移動)一個名為/etc/php.d/sqlite3.ini的檔案來禁用sqlite3模組,操作如下:

#rm/etc/php.d/sqlite3.ini

或者

#mv/etc/php.d/sqlite3.ini /etc/php.d/sqlite3.disable

其他編譯進去的模組只能通過重新安裝精簡配置的PHP來移除。可以從php.net下載php原始碼,然後按以下方法編譯它,支援GD、fastcgi和mysql:

./configure --with-libdir=lib64 --with-gd --with-mysql --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc --datadir=/usr/share --includedir=/usr/include --libexecdir=/usr/libexec --localstatedir=/var --sharedstatedir=/usr/com --mandir=/usr/share/man--infodir=/usr/share/info--cache-file=../config.cache --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --enable-fastcgi --enable-force-cgi-redirect

參閱如何編譯php,並重新安裝到類似Unix的作業系統上(http://www.php.net/manual/en/install.unix.php),以瞭解更多資訊。

第3個設定項:限制PHP資訊洩露

要限制PHP資訊洩露,就要禁用expose_php。編輯/etc/php.d/secutity.ini,執行以下指令:

expose_php=Off

啟用後,expose_php向外界報告PHP安裝在伺服器上,這包括HTTP頭裡面的PHP版本(如X-Powered-By: PHP/5.3.3)。PHP標識的全域性唯一識別符號(GUID,見示例http://www.php.net/?=PHPE9568F34-D428-11d2-A769-00AA001ACF42)也顯示出來,因而將它們新增到支援PHP的網站的URL後面,就會顯示相應標識。expose_php啟用後,你可以使用以下命令,檢視PHP版本:

$curl-I //www.jb51.net

示例輸出:

HTTP/1.1 200 OK
X-Powered-By: PHP/5.3.3
Content-type: text/html; charset=UTF-8
Vary:accept-Encoding,Cookie
X-Vary-Options: Accept-Encoding;list-contains=gzip,Cookie;string-contains=wikiToken;string-contains=wikiLoggedOut;string-contains=wiki_session
last-Modified: Thu,03 Nov 2011 22:32:55 GMT
...

我還建議,你應在httpd.conf中執行ServerTokens和ServerSignature命令,隱藏Apache版本及其他資訊(http://www.cyberciti.biz/faq/rhel-centos-hide-httpd-version/)。

第4個設定項:儘量減少可裝入的PHP模組(動態載入模組)

PHP支援“動態載入模組”(Dynamic Extensions)。預設情況下,RHEL裝入/etc/php.d/目錄裡面的所有載入模組。要啟用或禁用某一個模組,只要在/etc/php.d/目錄中找到配置檔案、為模組名稱添加註釋。你還可以更名或刪除模組配置檔案。想獲得最佳的PHP效能和安全,你應該只啟用Web應用程式需要的載入模組。比如說,要禁用gd載入模組,輸入以下命令:

#cd/etc/php.d/
# mv gd.{ini,disable}
# /sbin/servicehttpd restart

要啟用名為gd的php模組,請輸入:

# mv gd.{disable,ini}
# /sbin/service httpd restart

第5個設定項:將所有PHP錯誤記入日誌

別讓PHP錯誤資訊暴露在網站的所有訪客面前。編輯/etc/php.d/security.ini,執行以下指令:

display_errors=Off

確保你將所有PHP錯誤記入到日誌檔案中(http://www.cyberciti.biz/tips/php-howto-turn-on-error-log-file.html):

log_errors=On

error_log=/var/log/httpd/php_scripts_error.log

第6個設定項:不允許上傳檔案

出於安全原因,編輯/etc/php.d/security.ini,執行以下命令:

file_uploads=Off

如果使用你應用程式的使用者需要上傳檔案,只要設定upload_max_filesize(http://www.cyberciti.biz/faq/linux-unix-apache-increase-php-upload-limit/),即可啟用該功能,該設定限制了PHP允許通過上傳的檔案的最大值:

file_uploads=On

使用者通過PHP上傳的檔案最大1MB

upload_max_filesize=1M

第7個設定項:關閉遠端程式碼執行

如果啟用,allow_url_fopen允許PHP的檔案函式——如file_get_contents()、include語句和require語句——可以從遠端地方(如ftp或網站)獲取資料。

allow_url_fopen選項允許PHP的檔案函式——如file_get_contents()、include語句和require語句——可以使用FTP或HTTP協議,從遠端地方獲取資料。

程式設計員們常常忘了這一點,將使用者提供的資料傳送給這些函式時,沒有進行適當的輸入過濾,因而給程式碼注入安全漏洞留下了隱患。基於PHP的Web應用程式中存在的眾多程式碼注入安全漏洞是由啟用allow_url_fopen和糟糕的輸入過濾共同引起的。編輯/etc/php.d/security.ini,執行以下指令:

allow_url_fopen=Off

出於安全原因,我還建議禁用allow_url_include:

allow_url_include=Off

第8個設定項:啟用SQL安全模式

編輯/etc/php.d/security.ini,執行以下指令:

sql.safe_mode=On

如果啟用,mysql_connect()和mysql_pconnect()就忽視傳送給它們的任何變數。請注意:你可能得對自己的程式碼作一些更改。sql.safe_mode啟用後,第三方開源應用程式(如WorkdPress)及其他應用程式可能根本執行不了。我還建議你針對所有安裝的php 5.3.x關閉magic_quotes_gpc(http://php.net/manual/en/security.magicquotes.php),因為它的過濾並不有效、不是很可靠。mysql_escape_string()和自定義過濾函式能起到更好的作用(向Eric Hansen致謝,https://www.facebook.com/EricHansen.SFU):

magic_quotes_gpc=Off

第9個設定項:控制POST請求的大小

作為請求的一部分,客戶機(瀏覽器或使用者)需要將資料傳送到Apache Web伺服器時,比如上傳檔案或提交填好的表單時,就要用到HTTP POST請求方法。攻擊者可能會企圖傳送過大的POST請求,大量消耗你的系統資源。你可以限制PHP將處理的POST請求的最大大小。編輯/etc/php.d/security.ini,執行以下命令:

post_max_size=1K

1K設定了php應用程式允許的POST請求資料的最大大小。該設定還影響檔案上傳。要上傳大容量檔案,這個值必須大於upload_max_filesize。我還建議你限制使用Apache Web伺服器的可用方法。編輯httpd.conf,執行鍼對檔案根目錄/var/www/html的以下指令:

Order allow,deny
## 可在此新增配置的其餘部分... ##

第10個設定項:資源控制(拒絕服務控制)

你可以設定每個php指令碼的最長執行時間,以秒為單位。另一個建議的選項是設定每個指令碼可能用於解析請求資料的最長時間,以及指令碼可能耗用的最大記憶體數量。編輯/etc/php.d/security.ini,執行以下命令:

設定,以秒為單位

max_execution_time = 30

max_input_time = 30

memory_limit = 40M

第11個設定項:為PHP安裝Suhosin高階保護系統

來自Suhosin專案網頁(http://www.hardened-php.net/suhosin/):

Suhosin是一款高階的保護系統,面向安裝的PHP。它旨在保護伺服器和使用者,遠離PHP應用程式和PHP核心中的已知缺陷和未知缺陷。Suhosin分兩個獨立部分,可以單獨使用,也可以組合使用。第一個部分是針對PHP核心的小補丁,實施了幾個低階防護措施,以防範緩衝器溢位或格式字串安全漏洞;第二個部分是功能強大的PHP載入模組,實施了其他所有的保護措施。

看看如何在Linux作業系統下安裝和配置suhosin(http://www.cyberciti.biz/faq/rhel-linux-install-suhosin-php-protection/)。

第12個設定項:禁用危險的PHP函式

PHP有許多函式,如果使用不當,它們可以用來闖入你的伺服器。你可以使用disable_functions命令,在/etc/php.d/security.ini中禁用一系列函式:

disable_functions=exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source

第13個設定項:PHP Fastcgi/CGI - cgi.force_redirect命令

PHP可與FastCGI協同工作。 Fascgi減少了Web伺服器佔用的記憶體資源,但是仍為你提供了整個PHP語言具有的速度和功能。你可以配置Apache2+PHP+FastCGI或cgi,如這裡描述的那樣。配置命令cgi.force_redirect可以防止任何人使用http://www.cyberciti.biz/cgi-bin/php/hackerdir/backdoor.php這樣的地址,直接呼叫PHP。出於安全原因,應啟用cgi.force_redirect。編輯/etc/php.d/security.ini,執行以下命令:

出於安全原因,在典型的*Apache+PHP-CGI/FastCGI*環境中,啟用cgi.force_redirect

cgi.force_redirect=On

第14個設定項:PHP使用者和使用者組ID

mod_fastcgi是面向Apache Web伺服器的cgi模組。它可以連線至外部的FASTCGI伺服器。你要確保PHP以非根目錄使用者的身份來執行。如果PHP以根目錄或100以下UID的身份來執行,它可以訪問及/或處理系統檔案。你必須使用Apache的suEXEC或mod_suPHP,以非特權使用者的身份來執行PHP CGI。suEXEC功能讓Apache使用者們能夠以有別於呼叫Web伺服器的使用者ID的使用者ID來執行CGI程式。在該示例中,我的php-cgi以phpcgi使用者的身份來執行,Apache以apache使用者的身份來執行:

#psaux |grepphp-cgi

示例輸出:

phpcgi   6012 0.0 0.4 225036 60140 ?    S  Nov22 0:12 /usr/bin/php-cgi
phpcgi   6054 0.0 0.5 229928 62820 ?    S  Nov22 0:11 /usr/bin/php-cgi
phpcgi   6055 0.1 0.4 224944 53260 ?    S  Nov22 0:18 /usr/bin/php-cgi
phpcgi   6085 0.0 0.4 224680 56948 ?    S  Nov22 0:11 /usr/bin/php-cgi
phpcgi   6103 0.0 0.4 224564 57956 ?    S  Nov22 0:11 /usr/bin/php-cgi
phpcgi   6815 0.4 0.5 228556 61220 ?    S  00:52 0:19 /usr/bin/php-cgi
phpcgi   6821 0.3 0.5 228008 61252 ?    S  00:55 0:12 /usr/bin/php-cgi
phpcgi   6823 0.3 0.4 225536 58536 ?    S  00:57 0:13 /usr/bin/php-cgi

你可以使用spawn-fcgi等工具,以phpcgi使用者的身份(先要為系統新增phpcgi使用者)來建立遠端和本地FastCGI程序:

# spawn-fcgi -a 127.0.0.1 -p 9000 -u phpcgi -g phpcgi -f /usr/bin/php-cgi

現在,你可以配置Apache、Lighttpd和Nginx web伺服器了,使用在127.0.0.1ip地址處埠9000上執行的php FastCGI。

第15個設定項:限制PHP對檔案系統的訪問

open_basedir命令設定了允許PHP使用fopen()和其他函式來訪問哪些目錄的檔案。如果檔案在open_basdir定義的路徑外面,PHP就拒絕開啟該檔案。你無法使用符號連結作為變通辦法。比如說,只允許訪問/var/www/html目錄、不允許訪問/var/www、/tmp或/etc目錄:

限制PHP程序訪問/var/www/html/等專門指定的目錄外面的檔案

; Limits the PHP process from accessing files outside; of specifically designated directories suchas/var/www/html/open_basedir="/var/www/html/"; ------------------------------------; Multipledirsexample; open_basedir="/home/httpd/vhost/cyberciti.biz/html/:/home/httpd/vhost/nixcraft.com/html/:/home/httpd/vhost/theos.in/html/"; ------------------------------------

第16個設定項:會話路徑

PHP中的會話支援包括在隨後的訪問中保留某些資料的一種方法。這讓你能夠開發更加定製的應用程式,並加大網站的吸引力。該路徑在/etc/php.ini檔案中定義,與某一個會話有關的所有資料都將存放在session.save_path選項指定的目錄下的檔案中。在RHEL/CentOS/Fedora Linux下,預設路徑如下:

session.save_path="/var/lib/php/session"

設定用於上傳檔案時儲存檔案的臨時目錄

upload_tmp_dir="/var/lib/php/session"

確保路徑是outside /var/www/html,而且無法被其他任何系統使用者讀取或寫入:

#ls-Z /var/lib/php/

示例輸出:

drwxrwx---. root apache system_u:object_r:httpd_var_run_t:s0 session

注意:ls命令的-Z選項顯示了SELinux 安全上下文,比如檔案模組、使用者、使用者組、安全上下文和檔名稱。

第17個設定項:保持PHP、軟體和作業系統版本最新

打安全補丁是維護Linux、Apache、PHP和MySQL伺服器的一個重要環節。應該使用以下其中任何一個工具(如果你通過軟體包管理器來安裝PHP),儘快檢查所有的PHP安全更新版本,並儘快打上:

#yumupdate

#apt-getupdate && apt-get upgrade

你可以配置紅帽/CentOS/Fedora Linux,以便通過電子郵件傳送yum軟體包更新通知。另一個選項是通過cron job(計劃任務)打上所有的安全更新版。在Debian/Ubuntu Linux下,可以使用apticron來發送安全通知。

注意:經常訪問php.net(http://php.net/),尋找原始碼安裝的最新版本。

第18個設定項:限制檔案和目錄訪問

確保你以Apache或www等非根使用者的身份來執行Apache。所有檔案和目錄都應該歸非根使用者(或apache使用者)所有,放在/var/www/html下:

#chown-R apache:apache /var/www/html/

/var/www/html/是個子目錄,這是其他使用者可以修改的檔案根目錄,因為根目錄從來不在那裡執行任何檔案,也不會在那裡建立檔案。

確保在/var/www/html/下,檔案許可權設成了0444(只讀):

#chmod-R 0444 /var/www/html/

確保在/var/www/html/下,所有目錄許可權設成了0445:

#find/var/www/html/ -type d -print0 |xargs-0 -I {} chmod 0445 {}

關於設定合適檔案許可權的補充

chown和chmod命令確保:不管在什麼情況下,檔案根目錄或檔案根目錄裡面的檔案都可以被Web伺服器使用者apache寫入。請注意:你需要設定對你網站的開發模型最合理的許可權,所以可以根據自身需要,隨意調整chown和chmod命令。在這個示例中,Apache伺服器以apache使用者的身份來執行。這可以在你的httpd.conf檔案中用User和Group命令來配置。apache使用者需要對檔案根目錄下的所有內容享有讀取訪問權,但是不應該享有寫入訪問權。

確保httpd.conf有以下命令,實現限制性配置:

Options None

AllowOverride None

Order allow,deny

你只要在需要時才應該授予寫入訪問權。WordPress等一些Web應用程式及其他應用程式可能需要快取目錄。你可以使用以下命令,授予寫入到緩衝目錄的訪問權:

# chmod a+w/var/www/html/blog/wp-content/cache

### block access to all ###

#echo'deny from all' > /var/www/html/blog/wp-content/cache/.htaccess

第19個設定項:防寫Apache、PHP和MySQL配置檔案

使用chattr命令來防寫配置檔案:

# chattr +i /etc/php.ini
# chattr +i /etc/php.d/*
# chattr +i /etc/my.ini
# chattr +i /etc/httpd/conf/httpd.conf
# chattr +i /etc/chattr

命令還可以防寫/var/www/html目錄中的一個php檔案或多個檔案:

# chattr +i /var/www/html/file1.php
# chattr +i /var/www/html/

第20個設定項:使用Linux安全載入模組(如SELinux)

Linux自帶各種安全補丁,可以用來防護配置不當或受到危及的伺服器程式。可能的話,使用SELinux及其他Linux安全載入模組,對網路及其他程式實行限制。比如說,SELinux為Linux核心和Apache Web伺服器提供了眾多安全策略。要列出所有的Apache SELinux保護變數,請輸入:

# getsebool -a | grep httpd

示例輸出:

allow_httpd_anon_write --> off
allow_httpd_mod_auth_ntlm_winbind --> off
allow_httpd_mod_auth_pam --> off
allow_httpd_sys_script_anon_write --> off
httpd_builtin_scripting --> on
httpd_can_check_spam --> off
httpd_can_network_connect --> off
httpd_can_network_connect_cobbler --> off
httpd_can_network_connect_db --> off
httpd_can_network_memcache --> off
httpd_can_network_relay --> off
httpd_can_sendmail --> off
httpd_dbus_avahi --> on
httpd_enable_cgi --> on
httpd_enable_ftp_server --> off
httpd_enable_homedirs --> off
httpd_execmem --> off
httpd_read_user_content --> off
httpd_setrlimit --> off
httpd_ssi_exec --> off
httpd_tmp_exec --> off
httpd_tty_comm --> on
httpd_unified --> on
httpd_use_cifs --> off
httpd_use_gpg --> off
httpd_use_nfs --> off

要禁用Apache cgi支援,請輸入:

# setsebool -P httpd_enable_cgi off

參閱紅帽SELinux指南(http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/6/html/Security-Enhanced_Linux/index.html),即可瞭解更多資訊。

第21個設定項:安裝Mod_security

ModSecurity是一個保護Web應用程式的開源入侵檢測和預防引擎。你在Linux下很容易安裝mod_security,安裝後就能保護基於Apache和PHP的應用程式,遠離XSS及其他各種攻擊:

##幾個例項##
#不允許開啟/etc/中的檔案
SecFilter /etc/
#阻止SQL注入攻擊
SecFilter "delete[[:space:]]+from"
SecFilter "select.+from"

第22個設定項:儘可能在chrootjail環境中執行Apache / PHP

將PHP及/或Apache放在chroot jail環境中可以儘量減小潛在的入侵事件造成的破壞,因為它將Web伺服器隔離到檔案系統的一小部分。你可以使用Apache自帶的那種傳統的chroot jail環境。不過建議使用FreeBSD jail、運用容器概念的XEN虛擬化、KVM虛擬化或OpenVZ虛擬化。

第23個設定項:使用防火牆限制出站連線

攻擊者會使用wget之類的工具,將檔案本地下載到你的Web伺服器上。你可以使用iptables阻止apache使用者的出站連線。ipt_owner模組會試圖比對本地建立的資料包與資料包建立者的各個特點。它只有在OUTPUT鏈中才有效。在這個示例中,允許vivek使用者使用埠80連線外界(這適用於RHN或centos repo訪問)。

# /sbin/iptables -A OUTPUT -o eth0 -m owner --uid-owner vivek -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT

下面是另一個示例,阻止apache使用者的所有出站連線(通向我們自己的smtp伺服器的出站連線除外),以及垃圾郵件驗證API服務:

# ..../sbin/iptables --new-chain apache_user/sbin/iptables --append OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT/sbin/iptables --append OUTPUT -m owner --uid-owner apache -j apache_user# allow apache user to connec to our smtp server/sbin/iptables --append apache_user -p tcp --syn -d 192.168.1.100 --dport 25 -j RETURN# Allow apache user to connec to api server for spam validation/sbin/iptables --append apache_user -p tcp --syn -d 66.135.58.62 --dport 80 -j RETURN/sbin/iptables --append apache_user -p tcp --syn -d 66.135.58.61 --dport 80 -j RETURN/sbin/iptables --append apache_user -p tcp --syn -d 72.233.69.89 --dport 80 -j RETURN/sbin/iptables --append apache_user -p tcp --syn -d 72.233.69.88 --dport 80 -j RETURN########################### Addmorerules here ############################ No editing below# Drop everything for apache outgoing connection

# /sbin/iptables --append apache_user -jreject

第24個設定項:關注日誌和審查

檢查apache日誌檔案:

#tail-f /var/log/httpd/error_log
# grep 'login.php' /var/log/httpd/error_log
#egrep-i "denied|error|warn" /var/log/httpd/error_log

檢查php日誌檔案:

# tail -f /var/log/httpd/php_scripts_error.log
# grep "...etc/passwd" /var/log/httpd/php_scripts_error.log

日誌檔案讓你對於伺服器遭到什麼攻擊有所瞭解,並讓你可以檢查必要的安全級別有沒有落實到位。提供了用於系統審查的auditd服務。啟用該服務,就可以審查SELinux事件、驗證事件、檔案修改和帳戶修改等。我還建議使用標準的Linux系統監測工具(http://www.cyberciti.biz/tips/top-linux-monitoring-tools.html),用於監測你的Web伺服器。

第25個設定項:按照系統或虛擬機器例項來執行服務

對於安裝的大型系統來說,建議你藉助不同的伺服器執行資料庫、靜態內容和動態內容。

圖1:在不同的伺服器上執行服務

在不同的伺服器或虛擬機器例項上執行不同的網路服務。這限制了可能受到危及的其他服務的數量。比如說,如果攻擊者成功地利用了Apache flow等軟體的漏洞,就能訪問整個伺服器,包括在同一臺伺服器上執行的其他服務(比如MySQL和電子郵件服務等)。但是在上述例子中,按以下方式提供不同內容:

static.lan.cyberciti.biz:使用lighttpd或nginx伺服器,用於提供js/css/images等靜態資產。

phpcgi1.lan.cyberciti.biz和phpcgi2.lan.cyberciti.biz:Apache web伺服器,php用於生成動態內容。

mysql1.lan.cyberciti.biz:MySQL資料庫伺服器。

mcache1.lan.cyberciti.biz:Memcached伺服器是用於MySQL的速度非常快的快取系統。它使用libevent或epoll(Linux執行時環境),可以擴充套件至任何數量的開啟的連線,並使用非阻塞的網路輸入/輸出。

LB01:放在Apache Web伺服器前面的nginx Web伺服器和反向代理伺服器。 從網際網路進入到其中一臺Web伺服器的所有連線均通過nginx代理伺服器來傳送,該代理伺服器可以本身處理請求,也可以將請求全部或部分傳送到主Web伺服器。LB01提供了簡單的負載均衡機制。

第26個設定項:其他工具

來自PHPIDS專案網頁(https://phpids.org/):

PHPIDS(PHP入侵檢測系統)是面向基於PHP的web應用程式的安全層,具有使用簡單、結構良好、執行快捷、技術先進等優點。IDS無法清除、淨化或過濾任何惡意輸入內容,僅僅識別攻擊者何時企圖闖入你的網站,安全按照你希望它採取的措施來採取相應措施。

你可以使用PHPIDS來檢測惡意使用者,並記錄檢測出來的任何攻擊,方便以後分析。請注意:我個人沒有用過這款工具。

來自PhpSecInfo專案網頁(http://phpsec.org/projects/phpsecinfo/index.html):

PhpSecInfo提供了與phpinfo()函式相對應的機制,可報告關於PHP環境的安全資訊,並提供改進的建議。它無法取代安全開發技巧,也不進行任何一種程式碼或應用程式審查,卻是多層次安全方案中的一個實用工具。

圖2:關於PHP應用程式的安全資訊

參閱Linux安全加固要點(http://www.cyberciti.biz/tips/linux-security.html),減少系統面臨的攻擊途徑數量。

關於PHP後門的補充

你可能碰到過PHP指令碼或所謂的常見後門,比如c99、c99madshell和r57等。後門php指令碼其實就是一段隱藏的指令碼,用於繞開所有的驗證機制,根據需要訪問你的伺服器。攻擊者安裝它的目的是,訪問你的伺服器,同時又企圖不被發現。誤用的PHP指令碼(或其他任何CGI指令碼)通常允許新增鑽Web瀏覽器中安全漏洞空子的程式碼。攻擊者可以使用這種被鑽空子的安全漏洞,上傳後門外殼程式,從而讓攻擊者能夠獲得許多功能,比如:

下載檔案

上傳檔案

安裝rootkit

設定垃圾郵件伺服器/中繼伺服器

設定代理伺服器,隱匿行蹤

控制伺服器

控制資料庫伺服器

竊取所有資訊

刪除所有資訊和資料庫

開啟TCP/UDP埠及更多埠

要點:該如何找出PHP後門?

可以使用Unix/Linux grep命令,搜尋c99或r57外殼:

# grep -iR 'c99' /var/www/html/
# grep -iR 'r57' /var/www/html/
# find /var/www/html/ -name \*.php -type f -print0 | xargs -0 grep c99
# grep -RPn "(passthru|shell_exec|system|base64_decode|fopen|fclose|eval)" /var/www/html/