架構師必須知道的26項PHP安全實踐

架構師必須知道的26項PHP安全實踐 php

PHP是一種開源服務器端腳本語言,應用很普遍。Apache web服務器提供了這種便利:經過HTTP或HTTPS協議,訪問文件和內容。配置不當的服務器端腳本語言會帶來各類各樣的問題。因此,使用php時要當心。如下是25個PHP安全方面的最佳實踐。css

爲PHP安全提示而提供的示例環境html

文件根目錄(DocumentRoot):/var/www/htmlmysql

默認的Web服務器:Apache(可使用Lighttpd或Nginx來取代Apache)linux

默認的PHP配置文件:/etc/php.ininginx

默認的PHP加載模塊配置目錄:/etc/php.d/web

咱們的示例php安全配置文件:/etc/php.d/security.ini(須要使用文本編輯器來建立該文件)sql

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

默認的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 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

...

我還建議,你應在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腳本或所謂的常見後門,好比c9九、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/

相關文章
相關標籤/搜索