PHP是一種開源服務(wù)器端腳本語言匪凡,應(yīng)用很廣泛路媚。Apache web服務(wù)器提供了這種便利:通過HTTP或HTTPS協(xié)議骡和,訪問文件和內(nèi)容。配置不當(dāng)?shù)姆?wù)器端腳本語言會帶來各種各樣的問題崭参。所以呵曹,使用php時要小心。以下是25個PHP安全方面的最佳實踐何暮。
為PHP安全提示而提供的示例環(huán)境
文件根目錄(DocumentRoot):/var/www/html
默認的Web服務(wù)器:Apache(可以使用Lighttpd或Nginx來取代Apache)
默認的PHP配置文件:/etc/php.ini
默認的PHP加載模塊配置目錄:/etc/php.d/
我們的示例php安全配置文件:/etc/php.d/security.ini(需要使用文本編輯器來創(chuàng)建該文件)
操作系統(tǒng):RHEL/CentOS/FedoraLinux(相關(guān)指令應(yīng)該與Debian/Ubuntu等其他任何Linux發(fā)行版或者OpenBSD/FreeBSD/HP-UX等其他類似Unix的操作系統(tǒng)兼容)奄喂。
默認的php服務(wù)器TCP/UDP端口:無
為本文所列的大多數(shù)操作編寫代碼時,假定它們將由運行bash外殼程序或其他任何現(xiàn)代外殼程序的根用戶來執(zhí)行:
$ 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
出于演示的用途海洼,我會使用以下操作系統(tǒng):
$cat/etc/redhat-release
示例輸出:
Red HatEnterprise Linux Server release 6.1 (Santiago)
第1個最佳實踐:了解你的對手
基于PHP的應(yīng)用程序面臨不同類型的攻擊砍聊。我注意到了幾種不同類型的攻擊:
XSS:跨站腳本是Web PHP應(yīng)用程序中的一種安全漏洞,攻擊者可以利用該漏洞來竊取用戶的信息贰军。你可以配置Apache玻蝌,編寫更安全的PHP腳本(驗證所有的用戶輸入),以避免XSS攻擊词疼。
SQL注入攻擊:這是PHP應(yīng)用程序的數(shù)據(jù)庫層中的安全漏洞俯树。用戶輸入不正確地過濾時,應(yīng)用程序就能執(zhí)行任何SQL語句贰盗。你可以配置Apache许饿,編寫安全代碼(驗證和轉(zhuǎn)換所有的用戶輸入),以避免SQL注入攻擊舵盈。PHP中的一個常見做法是陋率,在發(fā)送SQL查詢之前球化,使用名為mysql_real_escape_string()的函數(shù),轉(zhuǎn)換參數(shù)。
文件上傳:它讓訪客可以將文件放在(將文件上傳到)你的服務(wù)器上。這會帶來眾多安全問題给郊,比如刪除你的文件、刪除數(shù)據(jù)庫巢掺、獲取用戶詳細資料,不一而足劲蜻。你可以使用php來禁用文件上傳陆淀,或編寫安全代碼(比如驗證用戶輸入,只允許PNG或GIF等圖像文件類型)先嬉。
添加本地和遠程文件:攻擊者可以從遠程服務(wù)器打開文件轧苫,執(zhí)行任何PHP代碼。這讓他們得以上傳文件疫蔓、刪除文件和安裝后門含懊。可以配置php以禁用遠程文件執(zhí)行功能鳄袍。
eval() :將字符串作為PHP代碼來進行評估绢要。攻擊者常常利用該函數(shù)來隱藏其在服務(wù)器本身上面的代碼和工具吏恭。你可以配置PHP拗小,禁用eval()。
sea-surf攻擊(跨站請求偽造樱哼,CSRF):這種攻擊迫使最終用戶針對目前已驗證其身份的Web應(yīng)用程序執(zhí)行有害的操作哀九。如果是平常的用戶,得逞的CSRF攻擊會危及最終用戶的數(shù)據(jù)和操作搅幅。但如果被盯上的最終用戶使用管理員帳戶阅束,這會危及整個Web應(yīng)用程序。
第2個最佳實踐:查找內(nèi)置的PHP模塊
想查看一組編譯進去的PHP模塊茄唐,請輸入以下命令:
# php -m
我建議你使用模塊數(shù)量減少的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的操作系統(tǒng)上(http://www.php.net/manual/en/install.unix.php)况脆,以了解更多信息。
第3個最佳實踐:限制PHP信息泄露
要限制PHP信息泄露批糟,就要禁用expose_php格了。編輯/etc/php.d/secutity.ini,執(zhí)行以下指令:
expose_php=Off
啟用后跃赚,expose_php向外界報告PHP安裝在服務(wù)器上笆搓,這包括HTTP頭里面的PHP版本(如X-Powered-By: PHP/5.3.3)。PHP標識的全局唯一標識符(GUID纬傲,見示例http://www.php.net/?=PHPE9568F34-D428-11d2-A769-00AA001ACF42)也顯示出來满败,因而將它們添加到支持PHP的網(wǎng)站的URL后面,就會顯示相應(yīng)標識叹括。expose_php啟用后算墨,你可以使用以下命令,查看PHP版本:
$curl-I http://www.cyberciti.biz/index.php
示例輸出:
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
...
我還建議汁雷,你應(yīng)在httpd.conf中執(zhí)行ServerTokens和ServerSignature命令净嘀,隱藏Apache版本及其他信息(http://www.cyberciti.biz/faq/rhel-centos-hide-httpd-version/)。
第4個最佳實踐:盡量減少可裝入的PHP模塊(動態(tài)加載模塊)
PHP支持“動態(tài)加載模塊”(Dynamic Extensions)侠讯。默認情況下挖藏,RHEL裝入/etc/php.d/目錄里面的所有加載模塊。要啟用或禁用某一個模塊厢漩,只要在/etc/php.d/目錄中找到配置文件膜眠、為模塊名稱添加注釋。你還可以更名或刪除模塊配置文件溜嗜。想獲得最佳的PHP性能和安全宵膨,你應(yīng)該只啟用Web應(yīng)用程序需要的加載模塊。比如說炸宵,要禁用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錯誤信息暴露在網(wǎng)站的所有訪客面前土全。編輯/etc/php.d/security.ini捎琐,執(zhí)行以下指令:
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裹匙,執(zhí)行以下命令:
file_uploads=Off
如果使用你應(yīng)用程序的用戶需要上傳文件瑞凑,只要設(shè)置upload_max_filesize(http://www.cyberciti.biz/faq/linux-unix-apache-increase-php-upload-limit/),即可啟用該功能幻件,該設(shè)置限制了PHP允許通過上傳的文件的最大值:
file_uploads=On
用戶通過PHP上傳的文件最大1MB
upload_max_filesize=1M
第7個最佳實踐:關(guān)閉遠程代碼執(zhí)行
如果啟用拨黔,allow_url_fopen允許PHP的文件函數(shù)——如file_get_contents()、include語句和require語句——可以從遠程地方(如ftp或網(wǎng)站)獲取數(shù)據(jù)。
allow_url_fopen選項允許PHP的文件函數(shù)——如file_get_contents()篱蝇、include語句和require語句——可以使用FTP或HTTP協(xié)議贺待,從遠程地方獲取數(shù)據(jù)。
編程員們常常忘了這一點零截,將用戶提供的數(shù)據(jù)傳送給這些函數(shù)時麸塞,沒有進行適當(dāng)?shù)妮斎脒^濾,因而給代碼注入安全漏洞留下了隱患涧衙∧墓ぃ基于PHP的Web應(yīng)用程序中存在的眾多代碼注入安全漏洞是由啟用allow_url_fopen和糟糕的輸入過濾共同引起的。編輯/etc/php.d/security.ini弧哎,執(zhí)行以下指令:
allow_url_fopen=Off
出于安全原因雁比,我還建議禁用allow_url_include:
allow_url_include=Off
第8個最佳實踐:啟用SQL安全模式
編輯/etc/php.d/security.ini,執(zhí)行以下指令:
sql.safe_mode=On
如果啟用撤嫩,mysql_connect()和mysql_pconnect()就忽視傳送給它們的任何變量偎捎。請注意:你可能得對自己的代碼作一些更改。sql.safe_mode啟用后序攘,第三方開源應(yīng)用程序(如WorkdPress)及其他應(yīng)用程序可能根本運行不了茴她。我還建議你針對所有安裝的php 5.3.x關(guān)閉magic_quotes_gpc(http://php.net/manual/en/security.magicquotes.php),因為它的過濾并不有效程奠、不是很可靠丈牢。mysql_escape_string()和自定義過濾函數(shù)能起到更好的作用(向Eric Hansen致謝,https://www.facebook.com/EricHansen.SFU):
magic_quotes_gpc=Off
第9個最佳實踐:控制POST請求的大小
作為請求的一部分瞄沙,客戶機(瀏覽器或用戶)需要將數(shù)據(jù)發(fā)送到Apache Web服務(wù)器時己沛,比如上傳文件或提交填好的表單時,就要用到HTTP POST請求方法帕识。攻擊者可能會企圖發(fā)送過大的POST請求泛粹,大量消耗你的系統(tǒng)資源遂铡。你可以限制PHP將處理的POST請求的最大大小肮疗。編輯/etc/php.d/security.ini,執(zhí)行以下命令:
post_max_size=1K
1K設(shè)置了php應(yīng)用程序允許的POST請求數(shù)據(jù)的最大大小扒接。該設(shè)置還影響文件上傳伪货。要上傳大容量文件,這個值必須大于upload_max_filesize钾怔。我還建議你限制使用Apache Web服務(wù)器的可用方法碱呼。編輯httpd.conf,執(zhí)行針對文件根目錄/var/www/html的以下指令:
Order allow,deny
## 可在此添加配置的其余部分... ##
第10個最佳實踐:資源控制(拒絕服務(wù)控制)
你可以設(shè)置每個php腳本的最長執(zhí)行時間宗侦,以秒為單位愚臀。另一個建議的選項是設(shè)置每個腳本可能用于解析請求數(shù)據(jù)的最長時間,以及腳本可能耗用的最大內(nèi)存數(shù)量矾利。編輯/etc/php.d/security.ini姑裂,執(zhí)行以下命令:
設(shè)置馋袜,以秒為單位
max_execution_time = 30
max_input_time = 30
memory_limit = 40M
第11個最佳實踐:為PHP安裝Suhosin高級保護系統(tǒng)
來自Suhosin項目網(wǎng)頁(http://www.hardened-php.net/suhosin/):
Suhosin是一款高級的保護系統(tǒng),面向安裝的PHP舶斧。它旨在保護服務(wù)器和用戶欣鳖,遠離PHP應(yīng)用程序和PHP核心中的已知缺陷和未知缺陷。Suhosin分兩個獨立部分茴厉,可以單獨使用泽台,也可以組合使用。第一個部分是針對PHP核心的小補丁矾缓,實施了幾個低級防護措施怀酷,以防范緩沖器溢出或格式字符串安全漏洞;第二個部分是功能強大的PHP加載模塊嗜闻,實施了其他所有的保護措施胰坟。
看看如何在Linux操作系統(tǒng)下安裝和配置suhosin(http://www.cyberciti.biz/faq/rhel-linux-install-suhosin-php-protection/)。
第12個最佳實踐:禁用危險的PHP函數(shù)
PHP有許多函數(shù)泞辐,如果使用不當(dāng)笔横,它們可以用來闖入你的服務(wù)器。你可以使用disable_functions命令咐吼,在/etc/php.d/security.ini中禁用一系列函數(shù):
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協(xié)同工作吹缔。 Fascgi減少了Web服務(wù)器占用的內(nèi)存資源,但是仍為你提供了整個PHP語言具有的速度和功能锯茄。你可以配置Apache2+PHP+FastCGI或cgi厢塘,如這里描述的那樣。配置命令cgi.force_redirect可以防止任何人使用http://www.cyberciti.biz/cgi-bin/php/hackerdir/backdoor.php這樣的地址肌幽,直接調(diào)用PHP晚碾。出于安全原因,應(yīng)啟用cgi.force_redirect喂急。編輯/etc/php.d/security.ini格嘁,執(zhí)行以下命令:
出于安全原因,在典型的*Apache+PHP-CGI/FastCGI*環(huán)境中廊移,啟用cgi.force_redirect
cgi.force_redirect=On
第14個最佳實踐:PHP用戶和用戶組ID
mod_fastcgi是面向Apache Web服務(wù)器的cgi模塊糕簿。它可以連接至外部的FASTCGI服務(wù)器。你要確保PHP以非根目錄用戶的身份來運行狡孔。如果PHP以根目錄或100以下UID的身份來運行懂诗,它可以訪問及/或處理系統(tǒng)文件。你必須使用Apache的suEXEC或mod_suPHP苗膝,以非特權(quán)用戶的身份來執(zhí)行PHP CGI殃恒。suEXEC功能讓Apache用戶們能夠以有別于調(diào)用Web服務(wù)器的用戶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用戶的身份(先要為系統(tǒng)添加phpcgi用戶)來創(chuàng)建遠程和本地FastCGI進程:
# spawn-fcgi -a 127.0.0.1 -p 9000 -u phpcgi -g phpcgi -f /usr/bin/php-cgi
現(xiàn)在,你可以配置Apache侯繁、Lighttpd和Nginx web服務(wù)器了胖喳,使用在127.0.0.1ip地址處端口9000上運行的php FastCGI。
第15個最佳實踐:限制PHP對文件系統(tǒng)的訪問
open_basedir命令設(shè)置了允許PHP使用fopen()和其他函數(shù)來訪問哪些目錄的文件贮竟。如果文件在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中的會話支持包括在隨后的訪問中保留某些數(shù)據(jù)的一種方法雌贱。這讓你能夠開發(fā)更加定制的應(yīng)用程序,并加大網(wǎng)站的吸引力偿短。該路徑在/etc/php.ini文件中定義欣孤,與某一個會話有關(guān)的所有數(shù)據(jù)都將存放在session.save_path選項指定的目錄下的文件中。在RHEL/CentOS/Fedora Linux下昔逗,默認路徑如下:
session.save_path="/var/lib/php/session"
設(shè)置用于上傳文件時存儲文件的臨時目錄
upload_tmp_dir="/var/lib/php/session"
確保路徑是outside /var/www/html降传,而且無法被其他任何系統(tǒng)用戶讀取或?qū)懭耄?/p>
#ls-Z /var/lib/php/
示例輸出:
drwxrwx---. root apache system_u:object_r:httpd_var_run_t:s0 session
注意:ls命令的-Z選項顯示了SELinux 安全上下文,比如文件模塊勾怒、用戶婆排、用戶組、安全上下文和文件名稱笔链。
第17個最佳實踐:保持PHP段只、軟件和操作系統(tǒng)版本最新
打安全補丁是維護Linux、Apache鉴扫、PHP和MySQL服務(wù)器的一個重要環(huán)節(jié)赞枕。應(yīng)該使用以下其中任何一個工具(如果你通過軟件包管理器來安裝PHP),盡快檢查所有的PHP安全更新版本幔妨,并盡快打上:
#yumupdate
或
#apt-getupdate && apt-get upgrade
你可以配置紅帽/CentOS/Fedora Linux鹦赎,以便通過電子郵件發(fā)送yum軟件包更新通知谍椅。另一個選項是通過cron job(計劃任務(wù))打上所有的安全更新版误堡。在Debian/Ubuntu Linux下,可以使用apticron來發(fā)送安全通知雏吭。
注意:經(jīng)常訪問php.net(http://php.net/)锁施,尋找源代碼安裝的最新版本。
第18個最佳實踐:限制文件和目錄訪問
確保你以Apache或www等非根用戶的身份來運行Apache。所有文件和目錄都應(yīng)該歸非根用戶(或apache用戶)所有悉抵,放在/var/www/html下:
#chown-R apache:apache /var/www/html/
/var/www/html/是個子目錄肩狂,這是其他用戶可以修改的文件根目錄,因為根目錄從來不在那里執(zhí)行任何文件姥饰,也不會在那里創(chuàng)建文件傻谁。
確保在/var/www/html/下,文件權(quán)限設(shè)成了0444(只讀):
#chmod-R 0444 /var/www/html/
確保在/var/www/html/下列粪,所有目錄權(quán)限設(shè)成了0445:
#find/var/www/html/ -type d -print0 |xargs-0 -I {} chmod 0445 {}
關(guān)于設(shè)置合適文件權(quán)限的補充
chown和chmod命令確保:不管在什么情況下审磁,文件根目錄或文件根目錄里面的文件都可以被Web服務(wù)器用戶apache寫入。請注意:你需要設(shè)置對你網(wǎng)站的開發(fā)模型最合理的權(quán)限岂座,所以可以根據(jù)自身需要态蒂,隨意調(diào)整chown和chmod命令。在這個示例中费什,Apache服務(wù)器以apache用戶的身份來運行钾恢。這可以在你的httpd.conf文件中用User和Group命令來配置。apache用戶需要對文件根目錄下的所有內(nèi)容享有讀取訪問權(quán)鸳址,但是不應(yīng)該享有寫入訪問權(quán)瘩蚪。
確保httpd.conf有以下命令,實現(xiàn)限制性配置:
Options None
AllowOverride None
Order allow,deny
你只要在需要時才應(yīng)該授予寫入訪問權(quán)稿黍。WordPress等一些Web應(yīng)用程序及其他應(yīng)用程序可能需要緩存目錄募舟。你可以使用以下命令,授予寫入到緩沖目錄的訪問權(quán):
# 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自帶各種安全補丁拱礁,可以用來防護配置不當(dāng)或受到危及的服務(wù)器程序≡可能的話呢灶,使用SELinux及其他Linux安全加載模塊,對網(wǎng)絡(luò)及其他程序?qū)嵭邢拗贫む凇1热缯f鸯乃,SELinux為Linux內(nèi)核和Apache Web服務(wù)器提供了眾多安全策略。要列出所有的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應(yīng)用程序的開源入侵檢測和預(yù)防引擎奖年。你在Linux下很容易安裝mod_security,安裝后就能保護基于Apache和PHP的應(yīng)用程序沛贪,遠離XSS及其他各種攻擊:
##幾個實例##
#不允許打開/etc/中的文件
SecFilter /etc/
#阻止SQL注入攻擊
SecFilter "delete[[:space:]]+from"
SecFilter "select.+from"
第22個最佳實踐:盡可能在chrootjail環(huán)境中運行Apache / PHP
將PHP及/或Apache放在chroot jail環(huán)境中可以盡量減小潛在的入侵事件造成的破壞陋守,因為它將Web服務(wù)器隔離到文件系統(tǒng)的一小部分震贵。你可以使用Apache自帶的那種傳統(tǒng)的chroot jail環(huán)境。不過建議使用FreeBSD jail水评、運用容器概念的XEN虛擬化猩系、KVM虛擬化或OpenVZ虛擬化。
第23個最佳實踐:使用防火墻限制出站連接
攻擊者會使用wget之類的工具中燥,將文件本地下載到你的Web服務(wù)器上寇甸。你可以使用iptables阻止apache用戶的出站連接。ipt_owner模塊會試圖比對本地創(chuàng)建的數(shù)據(jù)包與數(shù)據(jù)包創(chuàng)建者的各個特點疗涉。它只有在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服務(wù)器的出站連接除外),以及垃圾郵件驗證API服務(wù):
# ..../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個最佳實踐:關(guān)注日志和審查
檢查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
日志文件讓你對于服務(wù)器遭到什么攻擊有所了解偏窝,并讓你可以檢查必要的安全級別有沒有落實到位收恢。提供了用于系統(tǒng)審查的auditd服務(wù)。啟用該服務(wù)祭往,就可以審查SELinux事件伦意、驗證事件、文件修改和帳戶修改等硼补。我還建議使用標準的Linux系統(tǒng)監(jiān)測工具(http://www.cyberciti.biz/tips/top-linux-monitoring-tools.html)驮肉,用于監(jiān)測你的Web服務(wù)器。
第25個最佳實踐:按照系統(tǒng)或虛擬機實例來運行服務(wù)
對于安裝的大型系統(tǒng)來說已骇,建議你借助不同的服務(wù)器運行數(shù)據(jù)庫离钝、靜態(tài)內(nèi)容和動態(tài)內(nèi)容。
圖1:在不同的服務(wù)器上運行服務(wù)
在不同的服務(wù)器或虛擬機實例上運行不同的網(wǎng)絡(luò)服務(wù)褪储。這限制了可能受到危及的其他服務(wù)的數(shù)量卵渴。比如說,如果攻擊者成功地利用了Apache flow等軟件的漏洞鲤竹,就能訪問整個服務(wù)器浪读,包括在同一臺服務(wù)器上運行的其他服務(wù)(比如MySQL和電子郵件服務(wù)等)。但是在上述例子中辛藻,按以下方式提供不同內(nèi)容:
static.lan.cyberciti.biz:使用lighttpd或nginx服務(wù)器碘橘,用于提供js/css/images等靜態(tài)資產(chǎn)。
phpcgi1.lan.cyberciti.biz和phpcgi2.lan.cyberciti.biz:Apache web服務(wù)器吱肌,php用于生成動態(tài)內(nèi)容痘拆。
mysql1.lan.cyberciti.biz:MySQL數(shù)據(jù)庫服務(wù)器。
mcache1.lan.cyberciti.biz:Memcached服務(wù)器是用于MySQL的速度非逞矣埽快的緩存系統(tǒng)错负。它使用libevent或epoll(Linux運行時環(huán)境)坟瓢,可以擴展至任何數(shù)量的打開的連接勇边,并使用非阻塞的網(wǎng)絡(luò)輸入/輸出犹撒。
LB01:放在Apache Web服務(wù)器前面的nginx Web服務(wù)器和反向代理服務(wù)器。 從互聯(lián)網(wǎng)進入到其中一臺Web服務(wù)器的所有連接均通過nginx代理服務(wù)器來傳送粒褒,該代理服務(wù)器可以本身處理請求识颊,也可以將請求全部或部分傳送到主Web服務(wù)器。LB01提供了簡單的負載均衡機制奕坟。
第26個最佳實踐:其他工具
來自PHPIDS項目網(wǎng)頁(https://phpids.org/):
PHPIDS(PHP入侵檢測系統(tǒng))是面向基于PHP的web應(yīng)用程序的安全層祥款,具有使用簡單、結(jié)構(gòu)良好月杉、運行快捷刃跛、技術(shù)先進等優(yōu)點。IDS無法清除苛萎、凈化或過濾任何惡意輸入內(nèi)容桨昙,僅僅識別攻擊者何時企圖闖入你的網(wǎng)站,安全按照你希望它采取的措施來采取相應(yīng)措施腌歉。
你可以使用PHPIDS來檢測惡意用戶蛙酪,并記錄檢測出來的任何攻擊,方便以后分析翘盖。請注意:我個人沒有用過這款工具桂塞。
來自PhpSecInfo項目網(wǎng)頁(http://phpsec.org/projects/phpsecinfo/index.html):
PhpSecInfo提供了與phpinfo()函數(shù)相對應(yīng)的機制,可報告關(guān)于PHP環(huán)境的安全信息馍驯,并提供改進的建議阁危。它無法取代安全開發(fā)技巧,也不進行任何一種代碼或應(yīng)用程序?qū)彶樘保瑓s是多層次安全方案中的一個實用工具欲芹。
圖2:關(guān)于PHP應(yīng)用程序的安全信息
參閱Linux安全加固要點(http://www.cyberciti.biz/tips/linux-security.html),減少系統(tǒng)面臨的攻擊途徑數(shù)量吟吝。
關(guān)于PHP后門的補充
你可能碰到過PHP腳本或所謂的常見后門菱父,比如c99、c99madshell和r57等剑逃。后門php腳本其實就是一段隱藏的腳本浙宜,用于繞開所有的驗證機制,根據(jù)需要訪問你的服務(wù)器蛹磺。攻擊者安裝它的目的是粟瞬,訪問你的服務(wù)器,同時又企圖不被發(fā)現(xiàn)萤捆。誤用的PHP腳本(或其他任何CGI腳本)通常允許添加鉆Web瀏覽器中安全漏洞空子的代碼裙品。攻擊者可以使用這種被鉆空子的安全漏洞俗批,上傳后門外殼程序,從而讓攻擊者能夠獲得許多功能市怎,比如:
下載文件
上傳文件
安裝rootkit
設(shè)置垃圾郵件服務(wù)器/中繼服務(wù)器
設(shè)置代理服務(wù)器岁忘,隱匿行蹤
控制服務(wù)器
控制數(shù)據(jù)庫服務(wù)器
竊取所有信息
刪除所有信息和數(shù)據(jù)庫
打開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/