系统管理员必须知道的PHP安全实践
系統(tǒng)管理員必須知道的PHP安全實(shí)踐
PHP是一種開(kāi)源服務(wù)器端腳本語(yǔ)言,應(yīng)用很廣泛。Apache web服務(wù)器提供了這種便利:通過(guò)HTTP或HTTPS協(xié)議,
訪問(wèn)文件和內(nèi)容。配置不當(dāng)?shù)姆?wù)器端腳本語(yǔ)言會(huì)帶來(lái)各種各樣的問(wèn)題。所以,使用PHP時(shí)要小心。以下是25個(gè)
PHP安全方面的最佳實(shí)踐,可供系統(tǒng)管理員們安全地配置PHP。
為PHP安全提示而提供的示例環(huán)境
?文件根目錄(DocumentRoot):/var/www/html
?默認(rèn)的Web服務(wù)器:Apache(可以使用Lighttpd或Nginx來(lái)取代Apache)
?默認(rèn)的PHP配置文件:/etc/php.ini
?默認(rèn)的PHP加載模塊配置目錄:/etc/php.d/
?我們的示例php安全配置文件:/etc/php.d/security.ini(需要使用文本編輯器來(lái)創(chuàng)建該文件)
?操作系統(tǒng):RHEL/CentOS/Fedora Linux(相關(guān)指令應(yīng)該與Debian/Ubuntu等其他任何Linux發(fā)行版或者
OpenBSD/FreeBSD/HP-UX等其他類(lèi)似Unix的操作系統(tǒng)兼容)。
?默認(rèn)的php服務(wù)器TCP/UDP端口:無(wú)
為本文所列的大多數(shù)操作編寫(xiě)代碼時(shí),假定它們將由運(yùn)行bash外殼程序或其他任何現(xiàn)代外殼程序的根用戶(hù)來(lái)執(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
出于演示的用途,我會(huì)使用以下操作系統(tǒng):
$ cat /etc/redhat-release示例輸出:
Red Hat Enterprise Linux Server release 6.1 (Santiago)
第1個(gè)最佳實(shí)踐:了解你的對(duì)手
基于PHP的應(yīng)用程序面臨不同類(lèi)型的攻擊。我注意到了幾種不同類(lèi)型的攻擊:
1. XSS:跨站腳本是Web PHP應(yīng)用程序中的一種安全漏洞,攻擊者可以利用該漏洞來(lái)竊取用戶(hù)的信息。
你可以配置Apache,編寫(xiě)更安全的PHP腳本(驗(yàn)證所有的用戶(hù)輸入),以避免XSS攻擊。
2. SQL注入攻擊:這是PHP應(yīng)用程序的數(shù)據(jù)庫(kù)層中的安全漏洞。用戶(hù)輸入不正確地過(guò)濾時(shí),應(yīng)用程序就
能執(zhí)行任何SQL語(yǔ)句。你可以配置Apache,編寫(xiě)安全代碼(驗(yàn)證和轉(zhuǎn)換所有的用戶(hù)輸入),以避免
SQL注入攻擊。PHP中的一個(gè)常見(jiàn)做法是,在發(fā)送SQL查詢(xún)之前,使用名為mysql_real_escape_string()
的函數(shù),轉(zhuǎn)換參數(shù)。
3. 文件上傳:它讓訪客可以將文件放在(將文件上傳到)你的服務(wù)器上。這會(huì)帶來(lái)眾多安全問(wèn)題,比如
刪除你的文件、刪除數(shù)據(jù)庫(kù)、獲取用戶(hù)詳細(xì)資料,不一而足。你可以使用php來(lái)禁用文件上傳,或編寫(xiě)安
全代碼(比如驗(yàn)證用戶(hù)輸入,只允許PNG或GIF等圖像文件類(lèi)型)。
4. 添加本地和遠(yuǎn)程文件:攻擊者可以從遠(yuǎn)程服務(wù)器打開(kāi)文件,執(zhí)行任何PHP代碼。這讓他們得以上傳
文件、刪除文件和安裝后門(mén)。可以配置php以禁用遠(yuǎn)程文件執(zhí)行功能。
5. eval() :將字符串作為PHP代碼來(lái)進(jìn)行評(píng)估。攻擊者常常利用該函數(shù)來(lái)隱藏其在服務(wù)器本身上面的
代碼和工具。你可以配置PHP,禁用eval()。
6. sea-surf攻擊(跨站請(qǐng)求偽造,CSRF):這種攻擊迫使最終用戶(hù)針對(duì)目前已驗(yàn)證其身份的Web應(yīng)
用程序執(zhí)行有害的操作。如果是平常的用戶(hù),得逞的CSRF攻擊會(huì)危及最終用戶(hù)的數(shù)據(jù)和操作。但如
果被盯上的最終用戶(hù)使用管理員帳戶(hù),這會(huì)危及整個(gè)Web應(yīng)用程序。
第2個(gè)最佳實(shí)踐:查找內(nèi)置的PHP模塊
想查看一組編譯進(jìn)去的PHP模塊,請(qǐng)輸入以下命令:
# php -m示例輸出:
[PHP模塊]
apcbcmathbz2calendarCorectypecurldatedomeregexiffileinfofilterftpgdgettextgmphashiconvimapjsonlibxmlmbstringmemcachemysqlmysqliopensslpcntlpcrePDOpdo_mysqlpdo_sqlitePharreadlineReflectionsessionshmopSimpleXMLsocketsSPLsqlite3standardsuhosintokenizerwddxxmlxmlreaderxmlrpcxmlwriterxslzipzlib[Zend模塊]
Suhosin我建議你使用模塊數(shù)量減少的PHP,以增強(qiáng)性能和安全。比如說(shuō),你可以通過(guò)刪除(移除)配
置文件或者更名(或移動(dòng))一個(gè)名為/etc/php.d/sqlite3.ini的文件來(lái)禁用sqlite3模塊,操作如下:
或者
# mv /etc/php.d/sqlite3.ini /etc/php.d/sqlite3.disable其他編譯進(jìn)去的模塊只能通過(guò)重新安裝精簡(jiǎn)配置的PHP來(lái)移除。可以從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,并重新安裝到類(lèi)似Unix的操作系統(tǒng)上(http://www.php.net/manual/en/install.unix.php)
,以了解更多信息。
第3個(gè)最佳實(shí)踐:限制PHP信息泄露
要限制PHP信息泄露,就要禁用expose_php。編輯/etc/php.d/secutity.ini,執(zhí)行以下指令:
expose_php=Off啟用后,expose_php向外界報(bào)告PHP安裝在服務(wù)器上,這包括HTTP頭里面的PHP版本
(如X-Powered-By: PHP/5.3.3)。PHP標(biāo)識(shí)的全局唯一標(biāo)識(shí)符(GUID,見(jiàn)示例
http://www.php.net/?=PHPE9568F34-D428-11d2-A769-00AA001ACF42)也顯示出來(lái),
因而將它們添加到支持PHP的網(wǎng)站的URL后面,就會(huì)顯示相應(yīng)標(biāo)識(shí)。expose_php啟用后,
你可以使用以下命令,查看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個(gè)最佳實(shí)踐:盡量減少可裝入的PHP模塊(動(dòng)態(tài)加載模塊)
PHP支持“動(dòng)態(tài)加載模塊”(Dynamic Extensions)。默認(rèn)情況下,RHEL裝入/etc/php.d/
目錄里面的所有加載模塊。要啟用或禁用某一個(gè)模塊,只要在/etc/php.d/目錄中找到配置文件
、為模塊名稱(chēng)添加注釋。你還可以更名或刪除模塊配置文件。想獲得最佳的PHP性能和安全,
你應(yīng)該只啟用Web應(yīng)用程序需要的加載模塊。比如說(shuō),要禁用gd加載模塊,輸入以下命令:
要啟用名為gd的php模塊,請(qǐng)輸入:
# mv gd.{disable,ini}# /sbin/service httpd restart第5個(gè)最佳實(shí)踐:將所有PHP錯(cuò)誤記入日志
別讓PHP錯(cuò)誤信息暴露在網(wǎng)站的所有訪客面前。編輯/etc/php.d/security.ini,執(zhí)行以下指令:
display_errors=Off確保你將所有PHP錯(cuò)誤記入到日志文件中(http://www.cyberciti.biz/tips/php-howto-turn-on-error-log-file.html):
log_errors=Onerror_log=/var/log/httpd/php_scripts_error.log第6個(gè)最佳實(shí)踐:不允許上傳文件
出于安全原因,編輯/etc/php.d/security.ini,執(zhí)行以下命令:
file_uploads=Off如 果使用你應(yīng)用程序的用戶(hù)需要上傳文件,只要設(shè)置upload_max_filesize(http://www.cyberciti.biz/faq /linux-unix-apache-increase-php-upload-limit/),即可啟用該功能,該設(shè)置限制了PHP允許通過(guò)上傳的文 件的最大值:
file_uploads=On# 用戶(hù)通過(guò)PHP上傳的文件最大1MB
upload_max_filesize=1M第7個(gè)最佳實(shí)踐:關(guān)閉遠(yuǎn)程代碼執(zhí)行
如果啟用,allow_url_fopen允許PHP的文件函數(shù)——如file_get_contents()、include語(yǔ)句和require語(yǔ)句——可以從遠(yuǎn)程地方(如FTP或網(wǎng)站)獲取數(shù)據(jù)。
allow_url_fopen 選項(xiàng)允許PHP的文件函數(shù)——如file_get_contents()、include語(yǔ)句和require語(yǔ)句——可以使用FTP或HTTP協(xié)議,從 遠(yuǎn)程地方獲取數(shù)據(jù)。編程員們常常忘了這一點(diǎn),將用戶(hù)提供的數(shù)據(jù)傳送給這些函數(shù)時(shí),沒(méi)有進(jìn)行適當(dāng)?shù)妮斎脒^(guò)濾,因而給代碼注入安全漏洞留下了隱患。基于PHP 的Web應(yīng)用程序中存在的眾多代碼注入安全漏洞是由啟用allow_url_fopen和糟糕的輸入過(guò)濾共同引起的。編輯/etc/php.d /security.ini,執(zhí)行以下指令:
allow_url_fopen=Off出于安全原因,我還建議禁用allow_url_include:
allow_url_include=Off第8個(gè)最佳實(shí)踐:啟用SQL安全模式
編輯/etc/php.d/security.ini,執(zhí)行以下指令:
sql.safe_mode=On如 果啟用,mysql_connect()和mysql_pconnect()就忽視傳送給它們的任何變量。請(qǐng)注意:你可能得對(duì)自己的代碼作一些更改。 sql.safe_mode啟用后,第三方開(kāi)源應(yīng)用程序(如WorkdPress)及其他應(yīng)用程序可能根本運(yùn)行不了。我還建議你針對(duì)所有安裝的php 5.3.x關(guān)閉magic_quotes_gpc(http://php.net/manual/en /security.magicquotes.php),因?yàn)樗倪^(guò)濾并不有效、不是很可靠。mysql_escape_string()和自定義過(guò)濾函 數(shù)能起到更好的作用(向Eric Hansen致謝,https://www.facebook.com/EricHansen.SFU):
magic_quotes_gpc=Off第9個(gè)最佳實(shí)踐:控制POST請(qǐng)求的大小
作 為請(qǐng)求的一部分,客戶(hù)機(jī)(瀏覽器或用戶(hù))需要將數(shù)據(jù)發(fā)送到Apache Web服務(wù)器時(shí),比如上傳文件或提交填好的表單時(shí),就要用到HTTP POST請(qǐng)求方法。攻擊者可能會(huì)企圖發(fā)送過(guò)大的POST請(qǐng)求,大量消耗你的系統(tǒng)資源。你可以限制PHP將處理的POST請(qǐng)求的最大大小。編輯/etc /php.d/security.ini,執(zhí)行以下命令:
; 在此設(shè)置實(shí)際可行的值
post_max_size=1K1K 設(shè)置了php應(yīng)用程序允許的POST請(qǐng)求數(shù)據(jù)的最大大小。該設(shè)置還影響文件上傳。要上傳大容量文件,這個(gè)值必須大于 upload_max_filesize。我還建議你限制使用Apache Web服務(wù)器的可用方法。編輯httpd.conf,執(zhí)行針對(duì)文件根目錄/var/www/html的以下指令:
<Directory /var/www/html> <LimitExcept GET POST> Order allow,deny </LimitExcept>## 可在此添加配置的其余部分... ##
</Directory>第10個(gè)最佳實(shí)踐:資源控制(拒絕服務(wù)控制)
你可以設(shè)置每個(gè)php腳本的最長(zhǎng)執(zhí)行時(shí)間,以秒為單位。另一個(gè)建議的選項(xiàng)是設(shè)置每個(gè)腳本可能用于解析請(qǐng)求數(shù)據(jù)的最長(zhǎng)時(shí)間,以及腳本可能耗用的最大內(nèi)存數(shù)量。編輯/etc/php.d/security.ini,執(zhí)行以下命令:
# 設(shè)置,以秒為單位
max_execution_time = 30max_input_time = 30memory_limit = 40M第11個(gè)最佳實(shí)踐:為PHP安裝Suhosin高級(jí)保護(hù)系統(tǒng)
來(lái)自Suhosin項(xiàng)目網(wǎng)頁(yè)(http://www.hardened-php.net/suhosin/):
Suhosin 是一款高級(jí)的保護(hù)系統(tǒng),面向安裝的PHP。它旨在保護(hù)服務(wù)器和用戶(hù),遠(yuǎn)離PHP應(yīng)用程序和PHP核心中的已知缺陷和未知缺陷。Suhosin分兩個(gè)獨(dú)立部 分,可以單獨(dú)使用,也可以組合使用。第一個(gè)部分是針對(duì)PHP核心的小補(bǔ)丁,實(shí)施了幾個(gè)低級(jí)防護(hù)措施,以防范緩沖器溢出或格式字符串安全漏洞;第二個(gè)部分是 功能強(qiáng)大的PHP加載模塊,實(shí)施了其他所有的保護(hù)措施。
看看如何在Linux操作系統(tǒng)下安裝和配置suhosin(http://www.cyberciti.biz/faq/rhel-linux-install-suhosin-php-protection/)。
第12個(gè)最佳實(shí)踐:禁用危險(xiǎn)的PHP函數(shù)
PHP有許多函數(shù),如果使用不當(dāng),它們可以用來(lái)闖入你的服務(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個(gè)最佳實(shí)踐:PHP Fastcgi/CGI - cgi.force_redirect命令
PHP 可與FastCGI協(xié)同工作。 Fascgi減少了Web服務(wù)器占用的內(nèi)存資源,但是仍為你提供了整個(gè)PHP語(yǔ)言具有的速度和功能。你可以配置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個(gè)最佳實(shí)踐:PHP用戶(hù)和用戶(hù)組ID
mod_fastcgi 是面向Apache Web服務(wù)器的cgi模塊。它可以連接至外部的FASTCGI服務(wù)器。你要確保PHP以非根目錄用戶(hù)的身份來(lái)運(yùn)行。如果PHP以根目錄或100以下UID 的身份來(lái)運(yùn)行,它可以訪問(wèn)及/或處理系統(tǒng)文件。你必須使用Apache的suEXEC或mod_suPHP,以非特權(quán)用戶(hù)的身份來(lái)執(zhí)行PHP CGI。suEXEC功能讓Apache用戶(hù)們能夠以有別于調(diào)用Web服務(wù)器的用戶(hù)ID的用戶(hù)ID來(lái)運(yùn)行CGI程序。在該示例中,我的php-cgi以 phpcgi用戶(hù)的身份來(lái)運(yùn)行,Apache以apache用戶(hù)的身份來(lái)運(yùn)行:
# ps aux | grep php-cgi示例輸出:
phpcgi 6012 0.0 0.4 225036 60140 ? S Nov22 0:12 /usr/bin/php-cgiphpcgi 6054 0.0 0.5 229928 62820 ? S Nov22 0:11 /usr/bin/php-cgiphpcgi 6055 0.1 0.4 224944 53260 ? S Nov22 0:18 /usr/bin/php-cgiphpcgi 6085 0.0 0.4 224680 56948 ? S Nov22 0:11 /usr/bin/php-cgiphpcgi 6103 0.0 0.4 224564 57956 ? S Nov22 0:11 /usr/bin/php-cgiphpcgi 6815 0.4 0.5 228556 61220 ? S 00:52 0:19 /usr/bin/php-cgiphpcgi 6821 0.3 0.5 228008 61252 ? S 00:55 0:12 /usr/bin/php-cgiphpcgi 6823 0.3 0.4 225536 58536 ? S 00:57 0:13 /usr/bin/php-cgi你可以使用spawn-fcgi等工具,以phpcgi用戶(hù)的身份(先要為系統(tǒng)添加phpcgi用戶(hù))來(lái)創(chuàng)建遠(yuǎn)程和本地FastCGI進(jìn)程:
# 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.1 IP地址處端口9000上運(yùn)行的php FastCGI。
第15個(gè)最佳實(shí)踐:限制PHP對(duì)文件系統(tǒng)的訪問(wèn)
open_basedir 命令設(shè)置了允許PHP使用fopen()和其他函數(shù)來(lái)訪問(wèn)哪些目錄的文件。如果文件在open_basdir定義的路徑外面,PHP就拒絕打開(kāi)該文件。你 無(wú)法使用符號(hào)鏈接作為變通辦法。比如說(shuō),只允許訪問(wèn)/var/www/html目錄、不允許訪問(wèn)/var/www、/tmp或/etc目錄:
限制PHP進(jìn)程訪問(wèn)/var/www/html/等專(zhuān)門(mén)指定的目錄外面的文件
; Limits the PHP process from accessing files outside; of specifically designated directories such as /var/www/html/open_basedir="/var/www/html/"; ------------------------------------; Multiple dirs example; open_basedir="/home/httpd/vhost/cyberciti.biz/html/:/home/httpd/vhost/nixcraft.com/html/:/home/httpd/vhost/theos.in/html/"; ------------------------------------第16個(gè)最佳實(shí)踐:會(huì)話路徑
PHP 中的會(huì)話支持包括在隨后的訪問(wèn)中保留某些數(shù)據(jù)的一種方法。這讓你能夠開(kāi)發(fā)更加定制的應(yīng)用程序,并加大網(wǎng)站的吸引力。該路徑在/etc/php.ini文件 中定義,與某一個(gè)會(huì)話有關(guān)的所有數(shù)據(jù)都將存放在session.save_path選項(xiàng)指定的目錄下的文件中。在RHEL/CentOS/Fedora Linux下,默認(rèn)路徑如下:
session.save_path="/var/lib/php/session";設(shè)置用于上傳文件時(shí)存儲(chǔ)文件的臨時(shí)目錄
upload_tmp_dir="/var/lib/php/session"確保路徑是outside /var/www/html,而且無(wú)法被其他任何系統(tǒng)用戶(hù)讀取或?qū)懭?/strong>:
# ls -Z /var/lib/php/示例輸出:
drwxrwx---. root apache system_u:object_r:httpd_var_run_t:s0 session注意:ls命令的-Z選項(xiàng)顯示了SELinux 安全上下文,比如文件模塊、用戶(hù)、用戶(hù)組、安全上下文和文件名稱(chēng)。
第17個(gè)最佳實(shí)踐:保持PHP、軟件和操作系統(tǒng)版本最新
打安全補(bǔ)丁是維護(hù)Linux、Apache、PHP和MySQL服務(wù)器的一個(gè)重要環(huán)節(jié)。應(yīng)該使用以下其中任何一個(gè)工具(如果你通過(guò)軟件包管理器來(lái)安裝PHP),盡快檢查所有的PHP安全更新版本,并盡快打上:
# yum update或
# apt-get update && apt-get upgrade你可以配置紅帽/CentOS/Fedora Linux,以便通過(guò)電子郵件發(fā)送yum軟件包更新通知。另一個(gè)選項(xiàng)是通過(guò)cron job(計(jì)劃任務(wù))打上所有的安全更新版。在Debian/Ubuntu Linux下,可以使用apticron來(lái)發(fā)送安全通知。
注意:經(jīng)常訪問(wèn)php.net(http://php.net/),尋找源代碼安裝的最新版本。
第18個(gè)最佳實(shí)踐:限制文件和目錄訪問(wèn)
確保你以Apache或www等非根用戶(hù)的身份來(lái)運(yùn)行Apache。所有文件和目錄都應(yīng)該歸非根用戶(hù)(或apache用戶(hù))所有,放在/var/www/html下:
# chown -R apache:apache /var/www/html//var/www/html/是個(gè)子目錄,這是其他用戶(hù)可以修改的文件根目錄,因?yàn)楦夸洀膩?lái)不在那里執(zhí)行任何文件,也不會(huì)在那里創(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)限的補(bǔ)充
chown 和chmod命令確保:不管在什么情況下,文件根目錄或文件根目錄里面的文件都可以被Web服務(wù)器用戶(hù)apache寫(xiě)入。請(qǐng)注意:你需要設(shè)置對(duì)你網(wǎng)站的開(kāi) 發(fā)模型最合理的權(quán)限,所以可以根據(jù)自身需要,隨意調(diào)整chown和chmod命令。在這個(gè)示例中,Apache服務(wù)器以apache用戶(hù)的身份來(lái)運(yùn)行。這 可以在你的httpd.conf文件中用User和Group命令來(lái)配置。apache用戶(hù)需要對(duì)文件根目錄下的所有內(nèi)容享有讀取訪問(wèn)權(quán),但是不應(yīng)該享有 寫(xiě)入訪問(wèn)權(quán)。
確保httpd.conf有以下命令,實(shí)現(xiàn)限制性配置:
<Directory / > Options None AllowOverride None Order allow,deny</Directory>你只要在需要時(shí)才應(yīng)該授予寫(xiě)入訪問(wèn)權(quán)。WordPress等一些Web應(yīng)用程序及其他應(yīng)用程序可能需要緩存目錄。你可以使用以下命令,授予寫(xiě)入到緩沖目錄的訪問(wèn)權(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個(gè)最佳實(shí)踐:寫(xiě)保護(hù)Apache、PHP和MySQL配置文件
使用chattr命令來(lái)寫(xiě)保護(hù)配置文件:
# 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命令還可以寫(xiě)保護(hù)/var/www/html目錄中的一個(gè)php文件或多個(gè)文件:
# chattr +i /var/www/html/file1.php# chattr +i /var/www/html/第20個(gè)最佳實(shí)踐:使用Linux安全加載模塊(如SELinux)
Linux 自帶各種安全補(bǔ)丁,可以用來(lái)防護(hù)配置不當(dāng)或受到危及的服務(wù)器程序。可能的話,使用SELinux及其他Linux安全加載模塊,對(duì)網(wǎng)絡(luò)及其他程序?qū)嵭邢?制。比如說(shuō),SELinux為L(zhǎng)inux內(nèi)核和Apache Web服務(wù)器提供了眾多安全策略。要列出所有的Apache SELinux保護(hù)變量,請(qǐng)輸入:
# getsebool -a | grep httpd示例輸出:
allow_httpd_anon_write --> offallow_httpd_mod_auth_ntlm_winbind --> offallow_httpd_mod_auth_pam --> offallow_httpd_sys_script_anon_write --> offhttpd_builtin_scripting --> onhttpd_can_check_spam --> offhttpd_can_network_connect --> offhttpd_can_network_connect_cobbler --> offhttpd_can_network_connect_db --> offhttpd_can_network_memcache --> offhttpd_can_network_relay --> offhttpd_can_sendmail --> offhttpd_dbus_avahi --> onhttpd_enable_cgi --> onhttpd_enable_ftp_server --> offhttpd_enable_homedirs --> offhttpd_execmem --> offhttpd_read_user_content --> offhttpd_setrlimit --> offhttpd_ssi_exec --> offhttpd_tmp_exec --> offhttpd_tty_comm --> onhttpd_unified --> onhttpd_use_cifs --> offhttpd_use_gpg --> offhttpd_use_nfs --> off要禁用Apache cgi支持,請(qǐng)輸入:
# 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個(gè)最佳實(shí)踐:安裝Mod_security
ModSecurity是一個(gè)保護(hù)Web應(yīng)用程序的開(kāi)源入侵檢測(cè)和預(yù)防引擎。你在Linux下很容易安裝mod_security,安裝后就能保護(hù)基于Apache和PHP的應(yīng)用程序,遠(yuǎn)離XSS及其他各種攻擊:
##幾個(gè)實(shí)例##
#不允許打開(kāi)/etc/中的文件
#阻止SQL注入攻擊
SecFilter "delete[[:space:]]+from"SecFilter "select.+from"第22個(gè)最佳實(shí)踐:盡可能在chroot jail環(huán)境中運(yùn)行Apache / PHP
將 PHP及/或Apache放在chroot jail環(huán)境中可以盡量減小潛在的入侵事件造成的破壞,因?yàn)樗鼘eb服務(wù)器隔離到文件系統(tǒng)的一小部分。你可以使用Apache自帶的那種傳統(tǒng)的 chroot jail環(huán)境。不過(guò)建議使用FreeBSD jail、運(yùn)用容器概念的XEN虛擬化、KVM虛擬化或OpenVZ虛擬化。
?
第23個(gè)最佳實(shí)踐:使用防火墻限制出站連接
攻 擊者會(huì)使用wget之類(lèi)的工具,將文件本地下載到你的Web服務(wù)器上。你可以使用iptables阻止apache用戶(hù)的出站連接。ipt_owner模 塊會(huì)試圖比對(duì)本地創(chuàng)建的數(shù)據(jù)包與數(shù)據(jù)包創(chuàng)建者的各個(gè)特點(diǎn)。它只有在OUTPUT鏈中才有效。在這個(gè)示例中,允許vivek用戶(hù)使用端口80連接外界(這適 用于RHN或centos repo訪問(wèn))。
/sbin/iptables -A OUTPUT -o eth0 -m owner --uid-owner vivek -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT下面是另一個(gè)示例,阻止apache用戶(hù)的所有出站連接(通向我們自己的smtp服務(wù)器的出站連接除外),以及垃圾郵件驗(yàn)證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########################### Add more rules here ############################ No editing below# Drop everything for apache outgoing connection/sbin/iptables --append apache_user -j REJECT第24個(gè)最佳實(shí)踐:關(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日志文件讓你對(duì)于服務(wù)器遭到什么攻擊有所了解,并讓你可以檢查必要的安全級(jí)別有沒(méi)有落實(shí)到位。
提供了用于系統(tǒng)審查的auditd服務(wù)。啟用該服務(wù),就可以審查SELinux事件、驗(yàn)證事件、文件修改和
帳戶(hù)修改等。我還建議使用標(biāo)準(zhǔn)的Linux系統(tǒng)監(jiān)測(cè)工具
(http://www.cyberciti.biz/tips/top-linux-monitoring-tools.html),用于監(jiān)測(cè)你的Web服務(wù)器。
第25個(gè)最佳實(shí)踐:按照系統(tǒng)或虛擬機(jī)實(shí)例來(lái)運(yùn)行服務(wù)
對(duì)于安裝的大型系統(tǒng)來(lái)說(shuō),建議你借助不同的服務(wù)器運(yùn)行數(shù)據(jù)庫(kù)、靜態(tài)內(nèi)容和動(dòng)態(tài)內(nèi)容。
(圖1:在不同的服務(wù)器上運(yùn)行服務(wù))
在不同的服務(wù)器或虛擬機(jī)實(shí)例上運(yùn)行不同的網(wǎng)絡(luò)服務(wù)。這限制了可能受到危及的其他服務(wù)的數(shù)量。
比如說(shuō),如果攻擊者成功地利用了Apache flow等軟件的漏洞,就能訪問(wèn)整個(gè)服務(wù)器,包括在同一
臺(tái)服務(wù)器上運(yùn)行的其他服務(wù)(比如MySQL和電子郵件服務(wù)等)。但是在上述例子中,按以下方式提供不同內(nèi)容:
1. static.lan.cyberciti.biz:使用lighttpd或nginx服務(wù)器,用于提供js/css/images等靜態(tài)資產(chǎn)。
2. phpcgi1.lan.cyberciti.biz和phpcgi2.lan.cyberciti.biz:Apache web服務(wù)器,php用于生成動(dòng)態(tài)內(nèi)容。
3. mysql1.lan.cyberciti.biz:MySQL數(shù)據(jù)庫(kù)服務(wù)器。
4. mcache1.lan.cyberciti.biz:Memcached服務(wù)器是用于MySQL的速度非常快的緩存系統(tǒng)。它使用
libevent或epoll(Linux運(yùn)行時(shí)環(huán)境),可以擴(kuò)展至任何數(shù)量的打開(kāi)的連接,并使用非阻塞的網(wǎng)絡(luò)輸入/輸出。
5. LB01:放在Apache Web服務(wù)器前面的nginx Web服務(wù)器和反向代理服務(wù)器。 從互聯(lián)網(wǎng)進(jìn)入到其中
一臺(tái)Web服務(wù)器的所有連接均通過(guò)nginx代理服務(wù)器來(lái)傳送,該代理服務(wù)器可以本身處理請(qǐng)求,也可以將
請(qǐng)求全部或部分傳送到主Web服務(wù)器。LB01提供了簡(jiǎn)單的負(fù)載均衡機(jī)制。
第26個(gè)最佳實(shí)踐:其他工具
來(lái)自PHPIDS項(xiàng)目網(wǎng)頁(yè)(https://phpids.org/):
PHPIDS(PHP入侵檢測(cè)系統(tǒng))是面向基于PHP的web應(yīng)用程序的安全層,具有使用簡(jiǎn)單、結(jié)構(gòu)
良好、運(yùn)行快捷、技術(shù)先進(jìn)等優(yōu)點(diǎn)。IDS無(wú)法清除、凈化或過(guò)濾任何惡意輸入內(nèi)容,僅僅識(shí)別攻
擊者何時(shí)企圖闖入你的網(wǎng)站,安全按照你希望它采取的措施來(lái)采取相應(yīng)措施。
你可以使用PHPIDS來(lái)檢測(cè)惡意用戶(hù),并記錄檢測(cè)出來(lái)的任何攻擊,方便以后分析。請(qǐng)注意:我個(gè)
人沒(méi)有用過(guò)這款工具。
來(lái)自PhpSecInfo項(xiàng)目網(wǎng)頁(yè)(http://phpsec.org/projects/phpsecinfo/index.html):
PhpSecInfo提供了與phpinfo()函數(shù)相對(duì)應(yīng)的機(jī)制,可報(bào)告關(guān)于PHP環(huán)境的安全信息,并提供改進(jìn)
的建議。它無(wú)法取代安全開(kāi)發(fā)技巧,也不進(jìn)行任何一種代碼或應(yīng)用程序?qū)彶?#xff0c;卻是多層次安全方案
中的一個(gè)實(shí)用工具。
圖2:關(guān)于PHP應(yīng)用程序的安全信息
參閱Linux安全加固要點(diǎn)(http://www.cyberciti.biz/tips/linux-security.html),減少系統(tǒng)面臨的攻擊途徑數(shù)量。
關(guān)于PHP后門(mén)的補(bǔ)充
你可能碰到過(guò)PHP腳本或所謂的常見(jiàn)后門(mén),比如c99、c99madshell和r57等。后門(mén)php腳本其實(shí)就
是一段隱藏的腳本,用于繞開(kāi)所有的驗(yàn)證機(jī)制,根據(jù)需要訪問(wèn)你的服務(wù)器。攻擊者安裝它的目的
是,訪問(wèn)你的服務(wù)器,同時(shí)又企圖不被發(fā)現(xiàn)。誤用的PHP腳本(或其他任何CGI腳本)通常允許
添加鉆Web瀏覽器中安全漏洞空子的代碼。攻擊者可以使用這種被鉆空子的安全漏洞,上傳后門(mén)
外殼程序,從而讓攻擊者能夠獲得許多功能,比如:
?下載文件
?上傳文件
?安裝rootkit
?設(shè)置垃圾郵件服務(wù)器/中繼服務(wù)器
?設(shè)置代理服務(wù)器,隱匿行蹤
?控制服務(wù)器
?控制數(shù)據(jù)庫(kù)服務(wù)器
?竊取所有信息
?刪除所有信息和數(shù)據(jù)庫(kù)
?打開(kāi)TCP/UDP端口及更多端口
要點(diǎn):該如何找出PHP后門(mén)?
可以使用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/結(jié)束語(yǔ)
你基于PHP的服務(wù)器現(xiàn)在經(jīng)過(guò)了適當(dāng)?shù)募庸?#xff0c;可以準(zhǔn)備顯示動(dòng)態(tài)網(wǎng)頁(yè)了。不過(guò),安全漏洞主要是
因沒(méi)有遵守堪稱(chēng)最佳實(shí)踐的編程規(guī)則而引起的。為了滿(mǎn)足在web應(yīng)用程序安全方面的要求,
你應(yīng)該查閱更多資源,特別是PHP編程知識(shí),盡管這超出了系統(tǒng)管理員的工作范疇。
來(lái)自: http://www.hx95.com/Article/Ddos/201201/50455.html
轉(zhuǎn)載于:https://www.cnblogs.com/tecs27/archive/2012/03/19/2407218.html
總結(jié)
以上是生活随笔為你收集整理的系统管理员必须知道的PHP安全实践的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: echo中使用逗号和句号的区别
- 下一篇: 成为中国最好的Magento开发公司