自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

系統(tǒng)管理員必須知道的PHP安全實(shí)踐

譯文
系統(tǒng) 新聞
PHP是一種開源服務(wù)器端腳本語言,很多開發(fā)者都在使用PHP進(jìn)行開發(fā)。PHP在使用的時(shí)候會(huì)通過HTTP或HTTPS協(xié)議,訪問文件和內(nèi)容。所以,使用PHP時(shí)要小心。以下是25個(gè)PHP安全方面的最佳實(shí)踐,可供系統(tǒng)管理員們安全地配置PHP。

【51CTO 2011年11月30日外電頭條】PHP是一種開源服務(wù)器端腳本語言,應(yīng)用很廣泛。Apache web服務(wù)器提供了這種便利:通過HTTP或HTTPS協(xié)議,訪問文件和內(nèi)容。配置不當(dāng)?shù)姆?wù)器端腳本語言會(huì)帶來各種各樣的問題。所以,使用PHP時(shí)要小心。以下是25個(gè)PHP安全方面的最佳實(shí)踐,可供系統(tǒng)管理員們安全地配置PHP。

為PHP安全提示而提供的示例環(huán)境

文件根目錄(DocumentRoot):/var/www/html
默認(rèn)的Web服務(wù)器:Apache(可以使用Lighttpd或Nginx來取代Apache)
默認(rèn)的PHP配置文件:/etc/php.ini
默認(rèn)的PHP加載模塊配置目錄:/etc/php.d/
我們的示例php安全配置文件:/etc/php.d/security.ini(需要使用文本編輯器來創(chuàng)建該文件)
操作系統(tǒng):RHEL/CentOS/Fedora Linux(相關(guān)指令應(yīng)該與Debian/Ubuntu等其他任何Linux發(fā)行版或者OpenBSD/FreeBSD/HP-UX等其他類似Unix的操作系統(tǒng)兼容)。
默認(rèn)的php服務(wù)器TCP/UDP端口:無

為本文所列的大多數(shù)操作編寫代碼時(shí),假定它們將由運(yùn)行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

出于演示的用途,我會(huì)使用以下操作系統(tǒng):

$ cat /etc/redhat-release

示例輸出:

Red Hat Enterprise Linux Server release 6.1 (Santiago)

第1個(gè)最佳實(shí)踐:了解你的對(duì)手

基于PHP的應(yīng)用程序面臨不同類型的攻擊。我注意到了幾種不同類型的攻擊:

1. XSS:跨站腳本是Web PHP應(yīng)用程序中的一種安全漏洞,攻擊者可以利用該漏洞來竊取用戶的信息。你可以配置Apache,編寫更安全的PHP腳本(驗(yàn)證所有的用戶輸入),以避免XSS攻擊。

2. SQL注入攻擊:這是PHP應(yīng)用程序的數(shù)據(jù)庫層中的安全漏洞。用戶輸入不正確地過濾時(shí),應(yīng)用程序就能執(zhí)行任何SQL語句。你可以配置Apache,編寫安全代碼(驗(yàn)證和轉(zhuǎn)換所有的用戶輸入),以避免SQL注入攻擊。PHP中的一個(gè)常見做法是,在發(fā)送SQL查詢之前,使用名為mysql_real_escape_string()的函數(shù),轉(zhuǎn)換參數(shù)。

3. 文件上傳:它讓訪客可以將文件放在(將文件上傳到)你的服務(wù)器上。這會(huì)帶來眾多安全問題,比如刪除你的文件、刪除數(shù)據(jù)庫、獲取用戶詳細(xì)資料,不一而足。你可以使用php來禁用文件上傳,或編寫安全代碼(比如驗(yàn)證用戶輸入,只允許PNG或GIF等圖像文件類型)。

4. 添加本地和遠(yuǎn)程文件:攻擊者可以從遠(yuǎn)程服務(wù)器打開文件,執(zhí)行任何PHP代碼。這讓他們得以上傳文件、刪除文件和安裝后門??梢耘渲胮hp以禁用遠(yuǎn)程文件執(zhí)行功能。

5. eval() :將字符串作為PHP代碼來進(jìn)行評(píng)估。攻擊者常常利用該函數(shù)來隱藏其在服務(wù)器本身上面的代碼和工具。你可以配置PHP,禁用eval()。

6. sea-surf攻擊(跨站請(qǐng)求偽造,CSRF):這種攻擊迫使最終用戶針對(duì)目前已驗(yàn)證其身份的Web應(yīng)用程序執(zhí)行有害的操作。如果是平常的用戶,得逞的CSRF攻擊會(huì)危及最終用戶的數(shù)據(jù)和操作。但如果被盯上的最終用戶使用管理員帳戶,這會(huì)危及整個(gè)Web應(yīng)用程序。#p#

第2個(gè)最佳實(shí)踐:查找內(nèi)置的PHP模塊

想查看一組編譯進(jìn)去的PHP模塊,請(qǐng)輸入以下命令:

# 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

我建議你使用模塊數(shù)量減少的PHP,以增強(qiáng)性能和安全。比如說,你可以通過刪除(移除)配置文件或者更名(或移動(dòng))一個(gè)名為/etc/php.d/sqlite3.ini的文件來禁用sqlite3模塊,操作如下:

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

或者

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

其他編譯進(jìn)去的模塊只能通過重新安裝精簡配置的PHP來移除??梢詮膒hp.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),以了解更多信息。#p#

第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,見示例http://www.php.net/?=PHPE9568F34-D428-11d2-A769-00AA001ACF42)也顯示出來,因而將它們添加到支持PHP的網(wǎng)站的URL后面,就會(huì)顯示相應(yīng)標(biāo)識(shí)。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個(gè)最佳實(shí)踐:盡量減少可裝入的PHP模塊(動(dòng)態(tài)加載模塊)

PHP支持“動(dòng)態(tài)加載模塊”(Dynamic Extensions)。默認(rèn)情況下,RHEL裝入/etc/php.d/目錄里面的所有加載模塊。要啟用或禁用某一個(gè)模塊,只要在/etc/php.d/目錄中找到配置文件、為模塊名稱添加注釋。你還可以更名或刪除模塊配置文件。想獲得最佳的PHP性能和安全,你應(yīng)該只啟用Web應(yīng)用程序需要的加載模塊。比如說,要禁用gd加載模塊,輸入以下命令:

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

要啟用名為gd的php模塊,請(qǐng)輸入:

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

#p#

第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=On
error_log=/var/log/httpd/php_scripts_error.log

第6個(gè)最佳實(shí)踐:不允許上傳文件

出于安全原因,編輯/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個(gè)最佳實(shí)踐:關(guān)閉遠(yuǎn)程代碼執(zhí)行

如果啟用,allow_url_fopen允許PHP的文件函數(shù)——如file_get_contents()、include語句和require語句——可以從遠(yuǎn)程地方(如FTP或網(wǎng)站)獲取數(shù)據(jù)。

allow_url_fopen選項(xiàng)允許PHP的文件函數(shù)——如file_get_contents()、include語句和require語句——可以使用FTP或HTTP協(xié)議,從遠(yuǎn)程地方獲取數(shù)據(jù)。編程員們常常忘了這一點(diǎn),將用戶提供的數(shù)據(jù)傳送給這些函數(shù)時(shí),沒有進(jìn)行適當(dāng)?shù)妮斎脒^濾,因而給代碼注入安全漏洞留下了隱患?;赑HP的Web應(yīng)用程序中存在的眾多代碼注入安全漏洞是由啟用allow_url_fopen和糟糕的輸入過濾共同引起的。編輯/etc/php.d/security.ini,執(zhí)行以下指令:

allow_url_fopen=Off

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

allow_url_include=Off

#p#

第8個(gè)最佳實(shí)踐:啟用SQL安全模式

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

sql.safe_mode=On

如果啟用,mysql_connect()和mysql_pconnect()就忽視傳送給它們的任何變量。請(qǐng)注意:你可能得對(duì)自己的代碼作一些更改。sql.safe_mode啟用后,第三方開源應(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)樗倪^濾并不有效、不是很可靠。mysql_escape_string()和自定義過濾函數(shù)能起到更好的作用(向Eric Hansen致謝,https://www.facebook.com/EricHansen.SFU):

magic_quotes_gpc=Off

第9個(gè)最佳實(shí)踐:控制POST請(qǐng)求的大小

作為請(qǐng)求的一部分,客戶機(jī)(瀏覽器或用戶)需要將數(shù)據(jù)發(fā)送到Apache Web服務(wù)器時(shí),比如上傳文件或提交填好的表單時(shí),就要用到HTTP POST請(qǐng)求方法。攻擊者可能會(huì)企圖發(fā)送過大的POST請(qǐng)求,大量消耗你的系統(tǒng)資源。你可以限制PHP將處理的POST請(qǐng)求的最大大小。編輯/etc/php.d/security.ini,執(zhí)行以下命令:

; 在此設(shè)置實(shí)際可行的值

post_max_size=1K

1K設(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í)行時(shí)間,以秒為單位。另一個(gè)建議的選項(xiàng)是設(shè)置每個(gè)腳本可能用于解析請(qǐng)求數(shù)據(jù)的最長時(shí)間,以及腳本可能耗用的最大內(nèi)存數(shù)量。編輯/etc/php.d/security.ini,執(zhí)行以下命令:

# 設(shè)置,以秒為單位

max_execution_time = 30
max_input_time = 30
memory_limit = 40M

第11個(gè)最佳實(shí)踐:為PHP安裝Suhosin高級(jí)保護(hù)系統(tǒng)

來自Suhosin項(xiàng)目網(wǎng)頁(http://www.hardened-php.net/suhosin/):

Suhosin是一款高級(jí)的保護(hù)系統(tǒng),面向安裝的PHP。它旨在保護(hù)服務(wù)器和用戶,遠(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),它們可以用來闖入你的服務(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

#p#

第13個(gè)最佳實(shí)踐:PHP Fastcgi/CGI - cgi.force_redirect命令

PHP可與FastCGI協(xié)同工作。 Fascgi減少了Web服務(wù)器占用的內(nèi)存資源,但是仍為你提供了整個(gè)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個(gè)最佳實(shí)踐:PHP用戶和用戶組ID

mod_fastcgi是面向Apache Web服務(wù)器的cgi模塊。它可以連接至外部的FASTCGI服務(wù)器。你要確保PHP以非根目錄用戶的身份來運(yùn)行。如果PHP以根目錄或100以下UID的身份來運(yùn)行,它可以訪問及/或處理系統(tǒng)文件。你必須使用Apache的suEXEC或mod_suPHP,以非特權(quán)用戶的身份來執(zhí)行PHP CGI。suEXEC功能讓Apache用戶們能夠以有別于調(diào)用Web服務(wù)器的用戶ID的用戶ID來運(yùn)行CGI程序。在該示例中,我的php-cgi以phpcgi用戶的身份來運(yùn)行,Apache以apache用戶的身份來運(yùn)行:

# 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用戶的身份(先要為系統(tǒng)添加phpcgi用戶)來創(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)的訪問

open_basedir命令設(shè)置了允許PHP使用fopen()和其他函數(shù)來訪問哪些目錄的文件。如果文件在open_basdir定義的路徑外面,PHP就拒絕打開該文件。你無法使用符號(hào)鏈接作為變通辦法。比如說,只允許訪問/var/www/html目錄、不允許訪問/var/www、/tmp或/etc目錄:

限制PHP進(jìn)程訪問/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個(gè)最佳實(shí)踐:會(huì)話路徑

PHP中的會(huì)話支持包括在隨后的訪問中保留某些數(shù)據(jù)的一種方法。這讓你能夠開發(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,而且無法被其他任何系統(tǒng)用戶讀取或?qū)懭?/b>:

# ls -Z /var/lib/php/

示例輸出:

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

注意:ls命令的-Z選項(xiàng)顯示了SELinux 安全上下文,比如文件模塊、用戶、用戶組、安全上下文和文件名稱。#p#

第17個(gè)最佳實(shí)踐:保持PHP、軟件和操作系統(tǒng)版本最新

打安全補(bǔ)丁是維護(hù)Linux、Apache、PHP和MySQL服務(wù)器的一個(gè)重要環(huán)節(jié)。應(yīng)該使用以下其中任何一個(gè)工具(如果你通過軟件包管理器來安裝PHP),盡快檢查所有的PHP安全更新版本,并盡快打上:

# yum update

# apt-get update && apt-get upgrade

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

注意:經(jīng)常訪問php.net(http://php.net/),尋找源代碼安裝的最新版本。

第18個(gè)最佳實(shí)踐:限制文件和目錄訪問

確保你以Apache或www等非根用戶的身份來運(yùn)行Apache。所有文件和目錄都應(yīng)該歸非根用戶(或apache用戶)所有,放在/var/www/html下:

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

/var/www/html/是個(gè)子目錄,這是其他用戶可以修改的文件根目錄,因?yàn)楦夸洀膩聿辉谀抢飯?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ù)器用戶apache寫入。請(qǐng)注意:你需要設(shè)置對(duì)你網(wǎng)站的開發(fā)模型最合理的權(quán)限,所以可以根據(jù)自身需要,隨意調(diào)整chown和chmod命令。在這個(gè)示例中,Apache服務(wù)器以apache用戶的身份來運(yùn)行。這可以在你的httpd.conf文件中用User和Group命令來配置。apache用戶需要對(duì)文件根目錄下的所有內(nèi)容享有讀取訪問權(quán),但是不應(yīng)該享有寫入訪問權(quán)。

確保httpd.conf有以下命令,實(shí)現(xiàn)限制性配置:

<Directory / >
    Options None
    AllowOverride None
    Order allow,deny
</Directory>

你只要在需要時(shí)才應(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個(gè)最佳實(shí)踐:寫保護(hù)Apache、PHP和MySQL配置文件

使用chattr命令來寫保護(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命令還可以寫保護(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ǔ)丁,可以用來防護(hù)配置不當(dāng)或受到危及的服務(wù)器程序。可能的話,使用SELinux及其他Linux安全加載模塊,對(duì)網(wǎng)絡(luò)及其他程序?qū)嵭邢拗?。比如說,SELinux為Linux內(nèi)核和Apache Web服務(wù)器提供了眾多安全策略。要列出所有的Apache SELinux保護(hù)變量,請(qǐng)輸入:

# 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支持,請(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)用程序的開源入侵檢測和預(yù)防引擎。你在Linux下很容易安裝mod_security,安裝后就能保護(hù)基于Apache和PHP的應(yīng)用程序,遠(yuǎn)離XSS及其他各種攻擊:

##幾個(gè)實(shí)例##
#不允許打開/etc/中的文件

SecFilter /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)境。不過建議使用FreeBSD jail、運(yùn)用容器概念的XEN虛擬化、KVM虛擬化或OpenVZ虛擬化。#p#

第23個(gè)最佳實(shí)踐:使用防火墻限制出站連接

攻擊者會(huì)使用wget之類的工具,將文件本地下載到你的Web服務(wù)器上。你可以使用iptables阻止apache用戶的出站連接。ipt_owner模塊會(huì)試圖比對(duì)本地創(chuàng)建的數(shù)據(jù)包與數(shù)據(jù)包創(chuàng)建者的各個(gè)特點(diǎn)。它只有在OUTPUT鏈中才有效。在這個(gè)示例中,允許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

下面是另一個(gè)示例,阻止apache用戶的所有出站連接(通向我們自己的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í)別有沒有落實(shí)到位。提供了用于系統(tǒng)審查的auditd服務(wù)。啟用該服務(wù),就可以審查SELinux事件、驗(yàn)證事件、文件修改和帳戶修改等。我還建議使用標(biāo)準(zhǔn)的Linux系統(tǒng)監(jiān)測工具(http://www.cyberciti.biz/tips/top-linux-monitoring-tools.html),用于監(jiān)測你的Web服務(wù)器。

第25個(gè)最佳實(shí)踐:按照系統(tǒng)或虛擬機(jī)實(shí)例來運(yùn)行服務(wù)

對(duì)于安裝的大型系統(tǒng)來說,建議你借助不同的服務(wù)器運(yùn)行數(shù)據(jù)庫、靜態(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ù)量。比如說,如果攻擊者成功地利用了Apache flow等軟件的漏洞,就能訪問整個(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.bizphpcgi2.lan.cyberciti.biz:Apache web服務(wù)器,php用于生成動(dòng)態(tài)內(nèi)容。

3. mysql1.lan.cyberciti.biz:MySQL數(shù)據(jù)庫服務(wù)器。

4. mcache1.lan.cyberciti.biz:Memcached服務(wù)器是用于MySQL的速度非??斓木彺嫦到y(tǒng)。它使用libevent或epoll(Linux運(yùn)行時(shí)環(huán)境),可以擴(kuò)展至任何數(shù)量的打開的連接,并使用非阻塞的網(wǎng)絡(luò)輸入/輸出。

5. LB01:放在Apache Web服務(wù)器前面的nginx Web服務(wù)器和反向代理服務(wù)器。 從互聯(lián)網(wǎng)進(jìn)入到其中一臺(tái)Web服務(wù)器的所有連接均通過nginx代理服務(wù)器來傳送,該代理服務(wù)器可以本身處理請(qǐng)求,也可以將請(qǐng)求全部或部分傳送到主Web服務(wù)器。LB01提供了簡單的負(fù)載均衡機(jī)制。#p#

第26個(gè)最佳實(shí)踐:其他工具

來自PHPIDS項(xiàng)目網(wǎng)頁(https://phpids.org/):

PHPIDS(PHP入侵檢測系統(tǒng))是面向基于PHP的web應(yīng)用程序的安全層,具有使用簡單、結(jié)構(gòu)良好、運(yùn)行快捷、技術(shù)先進(jìn)等優(yōu)點(diǎn)。IDS無法清除、凈化或過濾任何惡意輸入內(nèi)容,僅僅識(shí)別攻擊者何時(shí)企圖闖入你的網(wǎng)站,安全按照你希望它采取的措施來采取相應(yīng)措施。

你可以使用PHPIDS來檢測惡意用戶,并記錄檢測出來的任何攻擊,方便以后分析。請(qǐng)注意:我個(gè)人沒有用過這款工具。

來自PhpSecInfo項(xiàng)目網(wǎng)頁(http://phpsec.org/projects/phpsecinfo/index.html):

PhpSecInfo提供了與phpinfo()函數(shù)相對(duì)應(yīng)的機(jī)制,可報(bào)告關(guān)于PHP環(huán)境的安全信息,并提供改進(jìn)的建議。它無法取代安全開發(fā)技巧,也不進(jìn)行任何一種代碼或應(yīng)用程序?qū)彶?,卻是多層次安全方案中的一個(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后門的補(bǔ)充

你可能碰到過PHP腳本或所謂的常見后門,比如c99、c99madshell和r57等。后門php腳本其實(shí)就是一段隱藏的腳本,用于繞開所有的驗(yàn)證機(jī)制,根據(jù)需要訪問你的服務(wù)器。攻擊者安裝它的目的是,訪問你的服務(wù)器,同時(shí)又企圖不被發(fā)現(xiàn)。誤用的PHP腳本(或其他任何CGI腳本)通常允許添加鉆Web瀏覽器中安全漏洞空子的代碼。攻擊者可以使用這種被鉆空子的安全漏洞,上傳后門外殼程序,從而讓攻擊者能夠獲得許多功能,比如:

下載文件
上傳文件
安裝rootkit
設(shè)置垃圾郵件服務(wù)器/中繼服務(wù)器
設(shè)置代理服務(wù)器,隱匿行蹤
控制服務(wù)器
控制數(shù)據(jù)庫服務(wù)器
竊取所有信息
刪除所有信息和數(shù)據(jù)庫
打開TCP/UDP端口及更多端口

要點(diǎn):該如何找出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/

結(jié)束語

你基于PHP的服務(wù)器現(xiàn)在經(jīng)過了適當(dāng)?shù)募庸蹋梢詼?zhǔn)備顯示動(dòng)態(tài)網(wǎng)頁了。不過,安全漏洞主要是因沒有遵守堪稱最佳實(shí)踐的編程規(guī)則而引起的。為了滿足在web應(yīng)用程序安全方面的要求,你應(yīng)該查閱更多資源,特別是PHP編程知識(shí),盡管這超出了系統(tǒng)管理員的工作范疇。

原文地址:http://www.cyberciti.biz/tips/php-security-best-practices-tutorial.html

 

【編輯推薦】

  1. PHP集成開發(fā)工具PHPStorm 3.0發(fā)布
  2. Nginx使用的php-fpm的兩種進(jìn)程管理方式及優(yōu)化
  3. PHP開發(fā)組首位中國成員及他的Yaf
  4. Ubuntu10.10下PHP上傳配置的方法
  5. 手把手教你在Ubuntu上安裝Apache、MySql和PHP
責(zé)任編輯:張浩 來源: 51CTO.com
相關(guān)推薦

2013-12-26 10:47:58

2009-10-22 16:53:08

2010-06-10 14:23:01

2010-11-23 09:24:11

2013-03-30 21:59:13

系統(tǒng)管理員必備工具iftop

2018-08-01 08:12:34

Linux管理員網(wǎng)絡(luò)管理

2010-04-12 09:33:58

系統(tǒng)管理員

2018-08-15 14:00:18

LinuxBash系統(tǒng)管理員

2013-06-26 09:29:30

系統(tǒng)管理員

2013-09-29 09:50:21

系統(tǒng)管理員Ubuntu JujuJuju

2010-08-10 09:13:52

Unix系統(tǒng)管理員Ubuntu

2010-05-06 18:07:33

Unix命令

2010-08-11 17:11:15

2019-09-09 14:45:29

系統(tǒng)管理員SRE

2010-05-07 16:35:44

2019-08-13 19:34:45

容器鏡像DockerLinux

2011-06-16 09:35:28

系統(tǒng)管理員iPad應(yīng)用

2010-11-25 09:04:38

系統(tǒng)管理員

2010-12-06 13:59:00

FreeBSD系統(tǒng)管理員技巧

2011-10-20 10:29:22

VMwareVMworld虛擬化
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)