Linux Apache PHP环境下,如何设置26项关键安全措施确保网站安全?

2026-04-01 08:341阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计3132个文字,预计阅读时间需要13分钟。

Linux Apache PHP环境下,如何设置26项关键安全措施确保网站安全?

PHP是一种开源的服务器端脚本语言,应用广泛。Apache web服务器提供了通过HTTP或HTTPS协议访问文件和内容的能力。不恰当的服务器端脚本语言配置可能会引起各种问题。因此,使用时需谨慎。

PHP是一种开源服务器端脚本语言,应用很广泛。Apache web服务器提供了这种便利:通过HTTP或HTTPS协议,访问文件和内容。配置不当的服务器端脚本语言会带来各种各样的问题。所以,使用php时要小心。以下是Linux下PHP+Apache的26个PHP程序员必知的安全方面的设置

为PHP安全提示而提供的示例环境

文件根目录(DocumentRoot):/var/www/html

默认的Web服务器:Apache(可以使用Ligwww.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,见示例www.php.net/?=PHPE9568F34-D428-11d2-A769-00AA001ACF42)也显示出来,因而将它们添加到支持PHP的网站的URL后面,就会显示相应标识。expose_php启用后,你可以使用以下命令,查看PHP版本:

$curl-I //www.jb51.net

示例输出:

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 ...

我还建议,你应在www.cyberciti.biz/faq/rhel-centos-hide-www.cyberciti.biz/tips/php-howto-turn-on-error-log-file.html):

log_errors=On

error_log=/var/log/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(php.net/manual/en/security.magicquotes.php),因为它的过滤并不有效、不是很可靠。mysql_escape_string()和自定义过滤函数能起到更好的作用(向Eric Hansen致谢,www.facebook.com/EricHansen.SFU):

magic_quotes_gpc=Off

第9个设置项:控制POST请求的大小

作为请求的一部分,客户机(浏览器或用户)需要将数据发送到Apache Web服务器时,比如上传文件或提交填好的表单时,就要用到HTTP POST请求方法。攻击者可能会企图发送过大的POST请求,大量消耗你的系统资源。你可以限制PHP将处理的POST请求的最大大小。编辑/etc/php.d/security.ini,执行以下命令:

Linux Apache PHP环境下,如何设置26项关键安全措施确保网站安全?

post_max_size=1K

1K设置了php应用程序允许的POST请求数据的最大大小。该设置还影响文件上传。要上传大容量文件,这个值必须大于upload_max_filesize。我还建议你限制使用Apache Web服务器的可用方法。编辑www.hardened-php.net/suhosin/):

Suhosin是一款高级的保护系统,面向安装的PHP。它旨在保护服务器和用户,远离PHP应用程序和PHP核心中的已知缺陷和未知缺陷。Suhosin分两个独立部分,可以单独使用,也可以组合使用。第一个部分是针对PHP核心的小补丁,实施了几个低级防护措施,以防范缓冲器溢出或格式字符串安全漏洞;第二个部分是功能强大的PHP加载模块,实施了其他所有的保护措施。

看看如何在Linux操作系统下安装和配置suhosin(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可以防止任何人使用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、Ligphp.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用户的身份来运行。这可以在你的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/www.cyberciti.biz/tips/top-linux-monitoring-tools.html),用于监测你的Web服务器。

第25个设置项:按照系统或虚拟机实例来运行服务

对于安装的大型系统来说,建议你借助不同的服务器运行数据库、静态内容和动态内容。

图1:在不同的服务器上运行服务

在不同的服务器或虚拟机实例上运行不同的网络服务。这限制了可能受到危及的其他服务的数量。比如说,如果攻击者成功地利用了Apache flow等软件的漏洞,就能访问整个服务器,包括在同一台服务器上运行的其他服务(比如MySQL和电子邮件服务等)。但是在上述例子中,按以下方式提供不同内容:

static.lan.cyberciti.biz:使用ligphpids.org/):

PHPIDS(PHP入侵检测系统)是面向基于PHP的web应用程序的安全层,具有使用简单、结构良好、运行快捷、技术先进等优点。IDS无法清除、净化或过滤任何恶意输入内容,仅仅识别攻击者何时企图闯入你的网站,安全按照你希望它采取的措施来采取相应措施。

你可以使用PHPIDS来检测恶意用户,并记录检测出来的任何攻击,方便以后分析。请注意:我个人没有用过这款工具。

来自PhpSecInfo项目网页(phpsec.org/projects/phpsecinfo/index.html):

PhpSecInfo提供了与phpinfo()函数相对应的机制,可报告关于PHP环境的安全信息,并提供改进的建议。它无法取代安全开发技巧,也不进行任何一种代码或应用程序审查,却是多层次安全方案中的一个实用工具。

图2:关于PHP应用程序的安全信息

参阅Linux安全加固要点(www.cyberciti.biz/tips/linux-security.html),减少系统面临的攻击途径数量。

关于PHP后门的补充

你可能碰到过PHP脚本或所谓的常见后门,比如c99、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/

本文共计3132个文字,预计阅读时间需要13分钟。

Linux Apache PHP环境下,如何设置26项关键安全措施确保网站安全?

PHP是一种开源的服务器端脚本语言,应用广泛。Apache web服务器提供了通过HTTP或HTTPS协议访问文件和内容的能力。不恰当的服务器端脚本语言配置可能会引起各种问题。因此,使用时需谨慎。

PHP是一种开源服务器端脚本语言,应用很广泛。Apache web服务器提供了这种便利:通过HTTP或HTTPS协议,访问文件和内容。配置不当的服务器端脚本语言会带来各种各样的问题。所以,使用php时要小心。以下是Linux下PHP+Apache的26个PHP程序员必知的安全方面的设置

为PHP安全提示而提供的示例环境

文件根目录(DocumentRoot):/var/www/html

默认的Web服务器:Apache(可以使用Ligwww.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,见示例www.php.net/?=PHPE9568F34-D428-11d2-A769-00AA001ACF42)也显示出来,因而将它们添加到支持PHP的网站的URL后面,就会显示相应标识。expose_php启用后,你可以使用以下命令,查看PHP版本:

$curl-I //www.jb51.net

示例输出:

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 ...

我还建议,你应在www.cyberciti.biz/faq/rhel-centos-hide-www.cyberciti.biz/tips/php-howto-turn-on-error-log-file.html):

log_errors=On

error_log=/var/log/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(php.net/manual/en/security.magicquotes.php),因为它的过滤并不有效、不是很可靠。mysql_escape_string()和自定义过滤函数能起到更好的作用(向Eric Hansen致谢,www.facebook.com/EricHansen.SFU):

magic_quotes_gpc=Off

第9个设置项:控制POST请求的大小

作为请求的一部分,客户机(浏览器或用户)需要将数据发送到Apache Web服务器时,比如上传文件或提交填好的表单时,就要用到HTTP POST请求方法。攻击者可能会企图发送过大的POST请求,大量消耗你的系统资源。你可以限制PHP将处理的POST请求的最大大小。编辑/etc/php.d/security.ini,执行以下命令:

Linux Apache PHP环境下,如何设置26项关键安全措施确保网站安全?

post_max_size=1K

1K设置了php应用程序允许的POST请求数据的最大大小。该设置还影响文件上传。要上传大容量文件,这个值必须大于upload_max_filesize。我还建议你限制使用Apache Web服务器的可用方法。编辑www.hardened-php.net/suhosin/):

Suhosin是一款高级的保护系统,面向安装的PHP。它旨在保护服务器和用户,远离PHP应用程序和PHP核心中的已知缺陷和未知缺陷。Suhosin分两个独立部分,可以单独使用,也可以组合使用。第一个部分是针对PHP核心的小补丁,实施了几个低级防护措施,以防范缓冲器溢出或格式字符串安全漏洞;第二个部分是功能强大的PHP加载模块,实施了其他所有的保护措施。

看看如何在Linux操作系统下安装和配置suhosin(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可以防止任何人使用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、Ligphp.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用户的身份来运行。这可以在你的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/www.cyberciti.biz/tips/top-linux-monitoring-tools.html),用于监测你的Web服务器。

第25个设置项:按照系统或虚拟机实例来运行服务

对于安装的大型系统来说,建议你借助不同的服务器运行数据库、静态内容和动态内容。

图1:在不同的服务器上运行服务

在不同的服务器或虚拟机实例上运行不同的网络服务。这限制了可能受到危及的其他服务的数量。比如说,如果攻击者成功地利用了Apache flow等软件的漏洞,就能访问整个服务器,包括在同一台服务器上运行的其他服务(比如MySQL和电子邮件服务等)。但是在上述例子中,按以下方式提供不同内容:

static.lan.cyberciti.biz:使用ligphpids.org/):

PHPIDS(PHP入侵检测系统)是面向基于PHP的web应用程序的安全层,具有使用简单、结构良好、运行快捷、技术先进等优点。IDS无法清除、净化或过滤任何恶意输入内容,仅仅识别攻击者何时企图闯入你的网站,安全按照你希望它采取的措施来采取相应措施。

你可以使用PHPIDS来检测恶意用户,并记录检测出来的任何攻击,方便以后分析。请注意:我个人没有用过这款工具。

来自PhpSecInfo项目网页(phpsec.org/projects/phpsecinfo/index.html):

PhpSecInfo提供了与phpinfo()函数相对应的机制,可报告关于PHP环境的安全信息,并提供改进的建议。它无法取代安全开发技巧,也不进行任何一种代码或应用程序审查,却是多层次安全方案中的一个实用工具。

图2:关于PHP应用程序的安全信息

参阅Linux安全加固要点(www.cyberciti.biz/tips/linux-security.html),减少系统面临的攻击途径数量。

关于PHP后门的补充

你可能碰到过PHP脚本或所谓的常见后门,比如c99、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/