系統管理員務必知道的PHP安全實踐
最後更新:2016-06-13
來源:互聯網
上載者:User
系統管理員必須知道的PHP安全實踐
PHP是一種開原始伺服器端指令碼語言,應用很廣泛。Apache web伺服器提供了這種便利:通過HTTP或HTTPS協議,訪問檔案和內容。配置不當的伺服器端指令碼語言會帶來各種各樣的問題。所以,使用PHP時要小心。以下是25個PHP安全方面的最佳實務,可供系統管理員們安全地配置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/Fedora Linux(相關指令應該與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 Hat Enterprise Linux Server release 6.1 (Santiago)
第1個最佳實務:瞭解你的對手
基於PHP的應用程式面臨不同類型的攻擊。我注意到了幾種不同類型的攻擊:
1. XSS:跨站指令碼是Web PHP應用程式中的一種安全性漏洞,攻擊者可以利用該漏洞來竊取使用者的資訊。你可以配置Apache,編寫更安全的PHP指令碼(驗證所有的使用者輸入),以避免XSS攻擊。
2. SQL注入攻擊:這是PHP應用程式的資料庫層中的安全性漏洞。使用者輸入不正確地過濾時,應用程式就能執行任何SQL語句。你可以配置Apache,編寫安全的程式碼(驗證和轉換所有的使用者輸入),以避免SQL注入攻擊。PHP中的一個常見做法是,在發送SQL查詢之前,使用名為mysql_real_escape_string()的函數,轉換參數。
3. 檔案上傳:它讓訪客可以將檔案放在(將檔案上傳到)你的伺服器上。這會帶來眾多安全問題,比如刪除你的檔案、刪除資料庫、擷取使用者詳細資料,不一而足。你可以使用php來禁用檔案上傳,或編寫安全的程式碼(比如驗證使用者輸入,只允許PNG或GIF等影像檔類型)。
4. 添加本地和遠程檔案:攻擊者可以從遠程伺服器開啟檔案,執行任何PHP代碼。這讓他們得以上傳檔案、刪除檔案和安裝後門。可以配置php以禁用遠程檔案執行功能。
5. eval() :將字串作為PHP代碼來進行評估。攻擊者常常利用該函數來隱藏其在伺服器本身上面的代碼和工具。你可以配置PHP,禁用eval()。
6. sea-surf攻擊(跨站請求偽造,CSRF):這種攻擊迫使終端使用者針對目前已驗證其身份的Web應用程式執行有害的操作。如果是平常的使用者,得逞的CSRF攻擊會危及終端使用者的資料和操作。但如果被盯上的終端使用者使用系統管理員帳戶,這會危及整個Web應用程式。
第2個最佳實務:尋找內建的PHP模組
想查看一組編譯進去的PHP模組,請輸入以下命令:
# php -m
樣本輸出:
[PHP模組]
apc
bcmath
bz2
calendar
Core
ctype
curl
date
dom
ereg
exif
fileinfo
filter
ftp
gd
gettext
gmp
hash
iconv
imap
json
libxml
mbstring
memcache
mysql
mysqli
openssl
pcntl
pcre
PDO
pdo_mysql
pdo_sqlite
Phar
readline
Reflection
session
shmop
SimpleXML
sockets
SPL
sqlite3
standard
suhosin
tokenizer
wddx
xml
xmlreader
xmlrpc
xmlwriter
xsl
zip
zlib
[Zend模組]
Suhosin
我建議你使用模組數量減少的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/service httpd 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=1K1K設定了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使用者的身份來運行:
# ps aux | grep php-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.1 IP地址處連接埠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 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個最佳實務:會話路徑
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安全更新版本,並儘快打上:
# yum update或
# apt-get update && 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個最佳實務:儘可能在chroot jail環境中運行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
#########################
## Add more rules here ##
#########################
# No editing below
# Drop everything for apache outgoing connection
/sbin/iptables --append apache_user -j REJECT第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和電子郵件服務等)。但是在上述例子中,按以下方式提供不同內容:
1. static.lan.cyberciti.biz:使用lighttpd或nginx伺服器,用於提供js/css/images等靜態資產。
2. phpcgi1.lan.cyberciti.biz和phpcgi2.lan.cyberciti.biz:Apache web伺服器,php用於產生動態內容。
3. mysql1.lan.cyberciti.biz:MySQL資料庫伺服器。
4. mcache1.lan.cyberciti.biz:Memcached伺服器是用於MySQL的速度非常快的緩衝系統。它使用libevent或epoll(Linux運行時環境),可以擴充至任何數量的開啟的串連,並使用非阻塞的網路輸入/輸出。
5. LB01:放在Apache Web伺服器前面的nginx Web伺服器和反向 Proxy伺服器。 從互連網進入到其中一台Web伺服器的所有串連均通過nginxProxy 伺服器來傳送,該Proxy 伺服器可以本身處理請求,也可以將請求全部或部分傳送到主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
?設定垃圾郵件伺服器/轉送伺服器
?設定Proxy 伺服器,隱匿行蹤
?控制伺服器
?控制資料庫伺服器
?竊取所有資訊
?刪除所有資訊和資料庫
?開啟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/結束語
你基於PHP的伺服器現在經過了適當的加固,可以準備顯示動態網頁了。不過,安全性漏洞主要是因沒有遵守堪稱最佳實務的編程規則而引起的。為了滿足在web應用程式安全方面的要求,你應該查閱更多資源,特別是PHP編程知識,儘管這超出了系統管理員的工作範疇。
原文地址:http://www.cyberciti.biz/tips/php-security-best-practices-tutorial.html