如何查看nginx 安装了哪些模块,及其nginx安全模块安装使用:Nginx与Apache安全配置实现防黑客sql注入与上传木马攻击,Apache需要安装mod_security模块,Nginx终于有了类似modsecurity的模块
如何查看nginx 安装了哪些模块,及其nginx安全模块安装使用。
nginx的安全模块ngx_http_secure_link_module,想查看下,发现这个无非是当时编译时的那些参数,但也给我们提供了升级重新编译的线索喔,还是安一个吧,免得会有人注入,拿Webserver权限。
注意:要使用到这个模块,需要在configure的时候,加入--with-http_secure_link_module选项.
看下示例:
自己加入安全模块的编译选项:
编译:
配置nginx.conf:
ngx_http_secure_link_module.
下面是一个简单的配置示例:
location /p/ {
secure_link_secret some_secret_word;
if ($secure_link = "") {
return 403;
}
}
注意:要使用到这个模块,需要在configure的时候,加入--with-http_secure_link_module选项.
下面是说明:
syntax: secure_link_secret (后跟字词)
default: 不包含在默认的编译选项中
context: location
使用规定的加密字串来验证连结.完整的URL加密参考:
/prefix/hash/一个hash示例:
md5(路径(或连接), 参数(或选项));
注:前缀可以有任意行,但不包括斜线.
看了下俄文翻译的结果,晕忽忽,不太懂......
也许是因为才加入的新特性的缘故(0.7.18+),使用方法写得不是很详细,需要自己去摸索. !
希望这个模块能够对那些安全高手有作用!
思路来自下面:
最后配置并测试:
测试后缀是PHP的文件:
'http://c.jackxiang.com/login/login.php?un=union 出现:
403 Forbidden
nginx/1.1.1
对error_page的知识补充:
Nginx做404在网上有两种方式:
1:
error_page 404 http://www.252300.net/?page-error.html;
这样写发现不能正常转跳,看来Nginx不能自动转义,加上转义后还是不能转
就来个直接点的 在下面再加个rewrite,让rewrite来做这事
error_page 404 http://www.252300.net/page-error;
location /page-error {
rewrite ^(.*) http://www.252300.net/?page-error.html permanent;
}
一步是用rewrite来完成的,下面来说第二种
2:需如下几步:
创建自己的404.html页面
更改nginx.conf在http定义区域加入: fastcgi_intercept_errors on;
更改nginx.conf(或单独网站配置文件,例如在nginx -> sites-enabled下的站点配置文件 )
中在server 区域加入: error_page 404 = /404.html 或者 error_page 404 = http://www.252300.net/404.html
4.更改后重启nginx,,测试nginx.conf正确性: /opt/nginx/sbin/nginx –t
#502 等错误可以用同样的方法来配置。
error_page 500 502 503 504 = /50x.html;
注意:
必须要添加:fastcgi_intercept_errors on; 如果这个选项没有设置,即使创建了404.html和配置了error_page也没有效果。
fastcgi_intercept_errors 语法: fastcgi_intercept_errors on|off 默认: fastcgi_intercept_errors off 添加位置: http, server, location 默认情况下,nginx不支持自定义404错误页面,只有这个指令被设置为on,nginx才支持将404错误重定向。这里需要注意的是,并不是说设置了 fastcgi_intercept_errors on,nginx就会将404错误重定向。在nginx中404错误重定向生效的前提是设置了fastcgi_intercept_errors on,并且正确的设置了error_page这个选项(包括语法和对应的404页面)
自定义的404页面必须大于512字节,否则可能会出现IE默认的404页面。例如,假设自定义了404.html,大小只有11个字节(内容为:404错误)
error_page 519 /519.html;
if ($request_uri ~* "(cost\()|(concat\()") {
return 519;
}
if ($request_uri ~* "[+|(%20)]union[+|(%20)]") {
return 519;
}
if ($request_uri ~* "[+|(%20)]and[+|(%20)]") {
return 519;
}
if ($request_uri ~* "[+|(%20)]select[+|(%20)]") {
return 519;
}
基本sql注入原理:
通过union all 联合查询获取其他表的内容(如user表的用户密码)
防御原理:
1. 通过以上配置过滤基本的url中的注入关键字;
2. 当然,数据库中的用户密码得加密存放 ;
3. php程序进行二次过滤,过滤GET和POST变量中的关键字;
4. 生产环境关闭PHP和MySQL的错误信息。
一、Nginx的安全配置:
在Nginx的俄文站点上看到,从0.7.18版开始,Nginx有了自己的安全检查模块:
ngx_http_secure_link_module.
下面是一个简单的配置示例:
location /p/ {
secure_link_secret some_secret_word;
if ($secure_link = "") {
return 403;
}
}
注意:要使用到这个模块,需要在configure的时候,加入--with-http_secure_link_module选项.
下面是说明:
syntax: secure_link_secret (后跟字词)
default: 不包含在默认的编译选项中
context: location
使用规定的加密字串来验证连结.完整的URL加密参考:
/prefix/hash/一个hash示例:
md5(路径(或连接), 参数(或选项));
注:前缀可以有任意行,但不包括斜线.
当然如果不想安装安全检测模块,解决方法是在conf文件加入以下代码:
error_page 444 /block_ip.html;
if ($request_uri ~* "(cost\()|(concat\()") {
return 444;
}
if ($request_uri ~* "[+|(%20)]union[+|(%20)]") {
return 444;
}
if ($request_uri ~* "[+|(%20)]and[+|(%20)]") {
return 444;
}
if ($request_uri ~* "[+|(%20)]select[+|(%20)]") {
return 444;
}
二、apache的的安全配置:
安装apache时根据情况带几个参数,网上也有其他优化参数,但估计性能差不了多少,如下
./configure --prefix=/usr/local/apache2.2.10 --enable-so --enable-deflate --enable-rewrite --enable-expires
我做过测试,apache自带的mod_mem_cache不太好使,最大使用内存不到200M时就会有问题,内存使用量突然下降,所以
图片服务器建议不要用apache,用nginx会更好。
apache简单防DDOS攻击的配置,需要从网上找一个mod_evasive20模块,用/usr/local/apache/bin/apxs -cia mod_evasive20.c安装,一般情况下没有必要配置这玩意。
<IfModule mod_evasive20.c>
DOSHashTableSize 10000
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 10
DOSEmailNotify webmaster@xxx.com
DOSLogDir /var/log/mod_dosevasive.log
</IfModule>
apache防sql注入攻击的配置,需要安装mod_security模块
<IfModule mod_security.c>
SecFilterEngine On
SecFilterCheckURLEncoding On
SecFilterForceByteRange 32 126
SecFilterCheckUnicodeEncoding On
SecServerResponseToken Off
SecAuditEngine RelevantOnly
SecAuditLog logs/audit_log
SecFilterDebugLog logs/modsec_debug_log
SecFilterDebugLevel 0
SecFilterDefaultAction "deny,log,status:406"
SecFilter /etc/*passwd
SecFilter /bin/*sh
SecFilter "\.\./"
SecFilter "<( |\n)*script"
SecFilter "<(.|\n)+>"
SecFilter "delete[[:space:]]+from"
SecFilter "insert[[:space:]]+into"
SecFilter "select.+from"
SecFilter "union[[:space:]]+from"
SecFilter "drop[[:space:]]"
SecFilterSelective "HTTP_USER_AGENT|HTTP_HOST" "^$"
</IfModule>
于5.20日下午6点发布了一个关于nginx的漏洞通告,由于该漏洞的存在,使用nginx+php组建的网站只要允许上传图片就可能被黑客入侵,直到5.21日凌晨,nginx尚未发布修复该漏洞的补丁;已经有一些网站被黑了,管理员速修复!
根据Netcraft的统计,直到2010年4月,全球一共有1300万台服务器运行着nginx程序;非常保守的估计,其中至少有600万台服务器运行着nginx并启用了php支持;继续保守的估计,其中有1/6,也就是100万台服务器允许用户上传图片。有图有真相。
没错,重申一次,由于nginx有漏洞,这100万台服务器可能通过上传图片的方法被黑客轻易的植入木马。植入木马的过程也非常简单,就是把木马改成图片上传就是了,由于危害非常大,就不说细节了。
发一个小道消息,据说黑客已经在行动了;安全人员、系统管理人员、行动起来吧,赶紧修复该漏洞;最好不要有侥幸心理,否则下一个被黑客入侵的可能就是你的网站。根据test安全公告的描述,临时修复方法如下,可3选其一。
1、设置php.ini的cgi.fix_pathinfo为0,重启php。最方便,但修改设置的影响需要自己评估。
2、给nginx的vhost配置添加如下内容,重启nginx。vhost较少的情况下也很方便。
if ( $fastcgi_script_name ~ \..*\/.*php ) {
return 403;
}
3、禁止上传目录解释PHP程序。不需要动webserver,如果vhost和服务器较多,短期内难度急剧上升;建议在vhost和服务器较少的情况下采用。
漏洞介绍:nginx是一款高性能的web服务器,使用非常广泛,其不仅经常被用作反向代理,也可以非常好的支持PHP的运行。test发现其中存在一个较为严重的安全问题,默认情况下可能导致服务器错误的将任何类型的文件以PHP的方式进行解析,这将导致严重的安全问题,使得恶意的攻击者可能攻陷支持php的nginx服务器。
漏洞分析:nginx默认以cgi的方式支持php的运行,譬如在配置文件当中可以以
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi_params;
}
的方式支持对php的解析,location对请求进行选择的时候会使用URI环境变量进行选择,其中传递到后端Fastcgi的关键变量SCRIPT_FILENAME由nginx生成的$fastcgi_script_name决定,而通过分析可以看到$fastcgi_script_name是直接由URI环境变量控制的,这里就是产生问题的点。而为了较好的支持PATH_INFO的提取,在PHP的配置选项里存在cgi.fix_pathinfo选项,其目的是为了从SCRIPT_FILENAME里取出真正的脚本名。
那么假设存在一个http://www.test.com/test.jpg,我们以如下的方式去访问
将会得到一个URI
/test.jpg/test.php
经过location指令,该请求将会交给后端的fastcgi处理,nginx为其设置环境变量SCRIPT_FILENAME,内容为
/scripts/test.jpg/test.php
而在其他的webserver如lighttpd当中,我们发现其中的SCRIPT_FILENAME被正确的设置为
/scripts/test.jpg
所以不存在此问题。
后端的fastcgi在接受到该选项时,会根据fix_pathinfo配置决定是否对SCRIPT_FILENAME进行额外的处理,一般情况下如果不对fix_pathinfo进行设置将影响使用PATH_INFO进行路由选择的应用,所以该选项一般配置开启。Php通过该选项之后将查找其中真正的脚本文件名字,查找的方式也是查看文件是否存在,这个时候将分离出SCRIPT_FILENAME和PATH_INFO分别为
/scripts/test.jpg和test.php
最后,以/scripts/test.jpg作为此次请求需要执行的脚本,攻击者就可以实现让nginx以php来解析任何类型的文件了。
http://www.test.com/test.jpg/test.php
POC: 访问一个nginx来支持php的站点,在一个任何资源的文件如robots.txt后面加上/test.php,这个时候你可以看到如下的区别:
访问http://www.test.com/robots.txt
HTTP/1.1 200 OK
Server: nginx/0.6.32
Date: Thu, 20 May 2010 10:05:30 GMT
Content-Type: text/plain
Content-Length: 18
Last-Modified: Thu, 20 May 2010 06:26:34 GMT
Connection: keep-alive
Keep-Alive: timeout=20
Accept-Ranges: bytes
访问访问http://www.test.com/robots.txt/test.php
HTTP/1.1 200 OK
Server: nginx/0.6.32
Date: Thu, 20 May 2010 10:06:49 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Keep-Alive: timeout=20
X-Powered-By: PHP/5.2.6
其中的Content-Type的变化说明了后端负责解析的变化,该站点就可能存在漏洞。
apache的一些配置和技巧。
安装apache时根据情况带几个参数,网上也有其他优化参数,但估计性能差不了多少,如下
./configure --prefix=/usr/local/apache2.2.10 --enable-so --enable-deflate --enable-rewrite --enable-expires
我做过测试,apache自带的mod_mem_cache不太好使,最大使用内存不到200M时就会有问题,内存使用量突然下降,所以
图片服务器建议不要用apache,用lighttpd或者nginx会更好。lighttpd+memcached的方式我就没配成功过,nginx+memcached能从缓存
里获取,但不能set到缓存,所以我用的是lighttpd+mod_mem_cache(需要把lighttpd打个补丁),稍后作详细介绍。
apache简单防DDOS攻击的配置,需要从网上找一个mod_evasive20模块,用/usr/local/apache/bin/apxs -cia mod_evasive20.c安装,一般情况下没有必要配置这玩意。
<IfModule mod_evasive20.c>
DOSHashTableSize 10000
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 10
DOSEmailNotify webmaster@xxx.com
DOSLogDir /var/log/mod_dosevasive.log
</IfModule>
apache防sql注入攻击的配置,需要安装mod_security模块
<IfModule mod_security.c>
SecFilterEngine On
SecFilterCheckURLEncoding On
SecFilterForceByteRange 32 126
SecFilterCheckUnicodeEncoding On
SecServerResponseToken Off
SecAuditEngine RelevantOnly
SecAuditLog logs/audit_log
SecFilterDebugLog logs/modsec_debug_log
SecFilterDebugLevel 0
SecFilterDefaultAction "deny,log,status:406"
SecFilter /etc/*passwd
SecFilter /bin/*sh
SecFilter "\.\./"
SecFilter "<( |\n)*script"
SecFilter "<(.|\n)+>"
SecFilter "delete[[:space:]]+from"
SecFilter "insert[[:space:]]+into"
SecFilter "select.+from"
SecFilter "union[[:space:]]+from"
SecFilter "drop[[:space:]]"
SecFilterSelective "HTTP_USER_AGENT|HTTP_HOST" "^$"
</IfModule>
加大apache最大连接数的配置,如果选择的是preworker工作方式。preworker和worker的区别就不讲了。apache2.0以上直接设置ServerLimit即可,apache2.0以前还要修改源代码才能使修改
的ServerLimit生效,建议应用服务器用apache2.0吧,性能差不了多少。
<IfModule mpm_prefork_module>
ServerLimit 20000 #ServerLimit据说要放第一行
StartServers 50
MinSpareServers 50
MaxSpareServers 100
MaxClients 10000
MaxRequestsPerChild 10000
</IfModule>
压缩传输的配置,这个做为网站来说非常重要,它是不压缩传输大小的20%左右,也就是说用户访问一个网站速度快了5倍,不配置不行,但是图片不能做压缩了。
<IfModule mod_deflate.c>
SetOutputFilter DEFLATE
DeflateCompressionLevel 3
DeflateFilterNote Input instream
DeflateFilterNote Output outstream
DeflateFilterNote Ratio ratio
LogFormat '"%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" "%r" %{outstream}n/%{instream}n (%{ratio}n%%)' deflate
# Netscape 4.x has some problems...
BrowserMatch ^Mozilla/4 gzip-only-text/html
# Netscape 4.06-4.08 have some more problems
BrowserMatch ^Mozilla/4\.0[678] no-gzip
# MSIE masquerades as Netscape, but it is fine
#BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
# NOTE: Due to a bug in mod_setenvif up to Apache 2.0.48
# the above regex won't work. You can use the following
# workaround to get the desired effect:
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
# Don't compress images, java scripts and style sheets
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|js|css)$ no-gzip dont-vary
# Make sure proxies don't deliver the wrong content
# this needs mod_headers but it's very important
# so I don't add a IfModule around it
#Header append Vary User-Agent env=!dont-vary
#CustomLog logs/deflate_log.log deflate
#CustomLog "|/usr/local/cronolog/sbin/cronolog /usr/local/apache2.0.59_2/logs/www.shedewang.com.access.log.%Y%m%d" deflate env=!IMAG
</IfModule>
apache配置mod_mem_cache,这个模块不太好使,建议不用
<IfModule mod_cache.c>
#CacheForceCompletion 100
CacheDefaultExpire 3600
CacheMaxExpire 86400
CacheLastModifiedFactor 0.1
CacheIgnoreNoLastMod on
<IfModule mod_mem_cache.c>
CacheEnable mem /
MCacheSize 2000000
MCacheMaxObjectCount 10000
MCacheMinObjectSize 1000
MCacheMaxObjectSize 512000
MCacheRemovalAlgorithm LRU
</IfModule>
</IfModule>
CacheEnable: 启动 mod_cache,其后接两个参数。第一个参数指定快取的种类,应设为 mem (记忆体快取) 或 disk (磁碟快取) 之其一;第二个参数指定使用快取的 URI 路径,如果对整个网站 (或虚拟主机) 进行快取,简单指定为根目录(/) 即可。
CacheForceCompletion: 这个值指定当 HTTP request 被取消时,内容的产生动作要完成的百分比;预设是 60(%)。
CacheDefaultExpire: 指定快取的预设过期秒数;预设值是一小时 (3600)。
CacheMaxExpire: 指定快取最大的过期秒数;预设值是一天 (86400)。
CacheLastModifiedFactor: 用来从回应里 Last Modified 资讯算出 expire date。
计算方式是:expire period (过期时距) = 最后更新后至今的时间间距 * CacheLastModifiedFactor
而expire date = 目前时间 + expire period
不过无论如何,过期时间不能超过 CacheMaxExpire 的设定值。
配置mod_expires模块
mod_expires可以减少10%左右的重复请求,让重复的用户对指定的页面请求结果都CACHE在本地,根本不向服务器发出请求,这一点特别实用在图片服务器上。
mod_expires的安装配置:
<IfModule mod_expires.c>
# turn on the module for this directory
ExpiresActive on
# cache common graphics for 3 days
ExpiresByType image/jpg "access plus 365 days"
ExpiresByType image/gif "access plus 365 days"
ExpiresByType image/jpeg "access plus 365 days"
ExpiresByType image/png "access plus 365 days"
</IfModule>
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wanghao72214/archive/2009/01/15/3788891.aspx
nginx的安全模块ngx_http_secure_link_module,想查看下,发现这个无非是当时编译时的那些参数,但也给我们提供了升级重新编译的线索喔,还是安一个吧,免得会有人注入,拿Webserver权限。
注意:要使用到这个模块,需要在configure的时候,加入--with-http_secure_link_module选项.
看下示例:
自己加入安全模块的编译选项:
编译:
配置nginx.conf:
ngx_http_secure_link_module.
下面是一个简单的配置示例:
location /p/ {
secure_link_secret some_secret_word;
if ($secure_link = "") {
return 403;
}
}
注意:要使用到这个模块,需要在configure的时候,加入--with-http_secure_link_module选项.
下面是说明:
syntax: secure_link_secret (后跟字词)
default: 不包含在默认的编译选项中
context: location
使用规定的加密字串来验证连结.完整的URL加密参考:
/prefix/hash/一个hash示例:
md5(路径(或连接), 参数(或选项));
注:前缀可以有任意行,但不包括斜线.
看了下俄文翻译的结果,晕忽忽,不太懂......
也许是因为才加入的新特性的缘故(0.7.18+),使用方法写得不是很详细,需要自己去摸索. !
希望这个模块能够对那些安全高手有作用!
思路来自下面:
最后配置并测试:
测试后缀是PHP的文件:
'http://c.jackxiang.com/login/login.php?un=union 出现:
403 Forbidden
nginx/1.1.1
对error_page的知识补充:
Nginx做404在网上有两种方式:
1:
error_page 404 http://www.252300.net/?page-error.html;
这样写发现不能正常转跳,看来Nginx不能自动转义,加上转义后还是不能转
就来个直接点的 在下面再加个rewrite,让rewrite来做这事
error_page 404 http://www.252300.net/page-error;
location /page-error {
rewrite ^(.*) http://www.252300.net/?page-error.html permanent;
}
一步是用rewrite来完成的,下面来说第二种
2:需如下几步:
创建自己的404.html页面
更改nginx.conf在http定义区域加入: fastcgi_intercept_errors on;
更改nginx.conf(或单独网站配置文件,例如在nginx -> sites-enabled下的站点配置文件 )
中在server 区域加入: error_page 404 = /404.html 或者 error_page 404 = http://www.252300.net/404.html
4.更改后重启nginx,,测试nginx.conf正确性: /opt/nginx/sbin/nginx –t
#502 等错误可以用同样的方法来配置。
error_page 500 502 503 504 = /50x.html;
注意:
必须要添加:fastcgi_intercept_errors on; 如果这个选项没有设置,即使创建了404.html和配置了error_page也没有效果。
fastcgi_intercept_errors 语法: fastcgi_intercept_errors on|off 默认: fastcgi_intercept_errors off 添加位置: http, server, location 默认情况下,nginx不支持自定义404错误页面,只有这个指令被设置为on,nginx才支持将404错误重定向。这里需要注意的是,并不是说设置了 fastcgi_intercept_errors on,nginx就会将404错误重定向。在nginx中404错误重定向生效的前提是设置了fastcgi_intercept_errors on,并且正确的设置了error_page这个选项(包括语法和对应的404页面)
自定义的404页面必须大于512字节,否则可能会出现IE默认的404页面。例如,假设自定义了404.html,大小只有11个字节(内容为:404错误)
error_page 519 /519.html;
if ($request_uri ~* "(cost\()|(concat\()") {
return 519;
}
if ($request_uri ~* "[+|(%20)]union[+|(%20)]") {
return 519;
}
if ($request_uri ~* "[+|(%20)]and[+|(%20)]") {
return 519;
}
if ($request_uri ~* "[+|(%20)]select[+|(%20)]") {
return 519;
}
基本sql注入原理:
通过union all 联合查询获取其他表的内容(如user表的用户密码)
防御原理:
1. 通过以上配置过滤基本的url中的注入关键字;
2. 当然,数据库中的用户密码得加密存放 ;
3. php程序进行二次过滤,过滤GET和POST变量中的关键字;
4. 生产环境关闭PHP和MySQL的错误信息。
一、Nginx的安全配置:
在Nginx的俄文站点上看到,从0.7.18版开始,Nginx有了自己的安全检查模块:
ngx_http_secure_link_module.
下面是一个简单的配置示例:
location /p/ {
secure_link_secret some_secret_word;
if ($secure_link = "") {
return 403;
}
}
注意:要使用到这个模块,需要在configure的时候,加入--with-http_secure_link_module选项.
下面是说明:
syntax: secure_link_secret (后跟字词)
default: 不包含在默认的编译选项中
context: location
使用规定的加密字串来验证连结.完整的URL加密参考:
/prefix/hash/一个hash示例:
md5(路径(或连接), 参数(或选项));
注:前缀可以有任意行,但不包括斜线.
当然如果不想安装安全检测模块,解决方法是在conf文件加入以下代码:
error_page 444 /block_ip.html;
if ($request_uri ~* "(cost\()|(concat\()") {
return 444;
}
if ($request_uri ~* "[+|(%20)]union[+|(%20)]") {
return 444;
}
if ($request_uri ~* "[+|(%20)]and[+|(%20)]") {
return 444;
}
if ($request_uri ~* "[+|(%20)]select[+|(%20)]") {
return 444;
}
二、apache的的安全配置:
安装apache时根据情况带几个参数,网上也有其他优化参数,但估计性能差不了多少,如下
./configure --prefix=/usr/local/apache2.2.10 --enable-so --enable-deflate --enable-rewrite --enable-expires
我做过测试,apache自带的mod_mem_cache不太好使,最大使用内存不到200M时就会有问题,内存使用量突然下降,所以
图片服务器建议不要用apache,用nginx会更好。
apache简单防DDOS攻击的配置,需要从网上找一个mod_evasive20模块,用/usr/local/apache/bin/apxs -cia mod_evasive20.c安装,一般情况下没有必要配置这玩意。
<IfModule mod_evasive20.c>
DOSHashTableSize 10000
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 10
DOSEmailNotify webmaster@xxx.com
DOSLogDir /var/log/mod_dosevasive.log
</IfModule>
apache防sql注入攻击的配置,需要安装mod_security模块
<IfModule mod_security.c>
SecFilterEngine On
SecFilterCheckURLEncoding On
SecFilterForceByteRange 32 126
SecFilterCheckUnicodeEncoding On
SecServerResponseToken Off
SecAuditEngine RelevantOnly
SecAuditLog logs/audit_log
SecFilterDebugLog logs/modsec_debug_log
SecFilterDebugLevel 0
SecFilterDefaultAction "deny,log,status:406"
SecFilter /etc/*passwd
SecFilter /bin/*sh
SecFilter "\.\./"
SecFilter "<( |\n)*script"
SecFilter "<(.|\n)+>"
SecFilter "delete[[:space:]]+from"
SecFilter "insert[[:space:]]+into"
SecFilter "select.+from"
SecFilter "union[[:space:]]+from"
SecFilter "drop[[:space:]]"
SecFilterSelective "HTTP_USER_AGENT|HTTP_HOST" "^$"
</IfModule>
于5.20日下午6点发布了一个关于nginx的漏洞通告,由于该漏洞的存在,使用nginx+php组建的网站只要允许上传图片就可能被黑客入侵,直到5.21日凌晨,nginx尚未发布修复该漏洞的补丁;已经有一些网站被黑了,管理员速修复!
根据Netcraft的统计,直到2010年4月,全球一共有1300万台服务器运行着nginx程序;非常保守的估计,其中至少有600万台服务器运行着nginx并启用了php支持;继续保守的估计,其中有1/6,也就是100万台服务器允许用户上传图片。有图有真相。
没错,重申一次,由于nginx有漏洞,这100万台服务器可能通过上传图片的方法被黑客轻易的植入木马。植入木马的过程也非常简单,就是把木马改成图片上传就是了,由于危害非常大,就不说细节了。
发一个小道消息,据说黑客已经在行动了;安全人员、系统管理人员、行动起来吧,赶紧修复该漏洞;最好不要有侥幸心理,否则下一个被黑客入侵的可能就是你的网站。根据test安全公告的描述,临时修复方法如下,可3选其一。
1、设置php.ini的cgi.fix_pathinfo为0,重启php。最方便,但修改设置的影响需要自己评估。
2、给nginx的vhost配置添加如下内容,重启nginx。vhost较少的情况下也很方便。
if ( $fastcgi_script_name ~ \..*\/.*php ) {
return 403;
}
3、禁止上传目录解释PHP程序。不需要动webserver,如果vhost和服务器较多,短期内难度急剧上升;建议在vhost和服务器较少的情况下采用。
漏洞介绍:nginx是一款高性能的web服务器,使用非常广泛,其不仅经常被用作反向代理,也可以非常好的支持PHP的运行。test发现其中存在一个较为严重的安全问题,默认情况下可能导致服务器错误的将任何类型的文件以PHP的方式进行解析,这将导致严重的安全问题,使得恶意的攻击者可能攻陷支持php的nginx服务器。
漏洞分析:nginx默认以cgi的方式支持php的运行,譬如在配置文件当中可以以
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi_params;
}
的方式支持对php的解析,location对请求进行选择的时候会使用URI环境变量进行选择,其中传递到后端Fastcgi的关键变量SCRIPT_FILENAME由nginx生成的$fastcgi_script_name决定,而通过分析可以看到$fastcgi_script_name是直接由URI环境变量控制的,这里就是产生问题的点。而为了较好的支持PATH_INFO的提取,在PHP的配置选项里存在cgi.fix_pathinfo选项,其目的是为了从SCRIPT_FILENAME里取出真正的脚本名。
那么假设存在一个http://www.test.com/test.jpg,我们以如下的方式去访问
将会得到一个URI
/test.jpg/test.php
经过location指令,该请求将会交给后端的fastcgi处理,nginx为其设置环境变量SCRIPT_FILENAME,内容为
/scripts/test.jpg/test.php
而在其他的webserver如lighttpd当中,我们发现其中的SCRIPT_FILENAME被正确的设置为
/scripts/test.jpg
所以不存在此问题。
后端的fastcgi在接受到该选项时,会根据fix_pathinfo配置决定是否对SCRIPT_FILENAME进行额外的处理,一般情况下如果不对fix_pathinfo进行设置将影响使用PATH_INFO进行路由选择的应用,所以该选项一般配置开启。Php通过该选项之后将查找其中真正的脚本文件名字,查找的方式也是查看文件是否存在,这个时候将分离出SCRIPT_FILENAME和PATH_INFO分别为
/scripts/test.jpg和test.php
最后,以/scripts/test.jpg作为此次请求需要执行的脚本,攻击者就可以实现让nginx以php来解析任何类型的文件了。
http://www.test.com/test.jpg/test.php
POC: 访问一个nginx来支持php的站点,在一个任何资源的文件如robots.txt后面加上/test.php,这个时候你可以看到如下的区别:
访问http://www.test.com/robots.txt
HTTP/1.1 200 OK
Server: nginx/0.6.32
Date: Thu, 20 May 2010 10:05:30 GMT
Content-Type: text/plain
Content-Length: 18
Last-Modified: Thu, 20 May 2010 06:26:34 GMT
Connection: keep-alive
Keep-Alive: timeout=20
Accept-Ranges: bytes
访问访问http://www.test.com/robots.txt/test.php
HTTP/1.1 200 OK
Server: nginx/0.6.32
Date: Thu, 20 May 2010 10:06:49 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Keep-Alive: timeout=20
X-Powered-By: PHP/5.2.6
其中的Content-Type的变化说明了后端负责解析的变化,该站点就可能存在漏洞。
apache的一些配置和技巧。
安装apache时根据情况带几个参数,网上也有其他优化参数,但估计性能差不了多少,如下
./configure --prefix=/usr/local/apache2.2.10 --enable-so --enable-deflate --enable-rewrite --enable-expires
我做过测试,apache自带的mod_mem_cache不太好使,最大使用内存不到200M时就会有问题,内存使用量突然下降,所以
图片服务器建议不要用apache,用lighttpd或者nginx会更好。lighttpd+memcached的方式我就没配成功过,nginx+memcached能从缓存
里获取,但不能set到缓存,所以我用的是lighttpd+mod_mem_cache(需要把lighttpd打个补丁),稍后作详细介绍。
apache简单防DDOS攻击的配置,需要从网上找一个mod_evasive20模块,用/usr/local/apache/bin/apxs -cia mod_evasive20.c安装,一般情况下没有必要配置这玩意。
<IfModule mod_evasive20.c>
DOSHashTableSize 10000
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 10
DOSEmailNotify webmaster@xxx.com
DOSLogDir /var/log/mod_dosevasive.log
</IfModule>
apache防sql注入攻击的配置,需要安装mod_security模块
<IfModule mod_security.c>
SecFilterEngine On
SecFilterCheckURLEncoding On
SecFilterForceByteRange 32 126
SecFilterCheckUnicodeEncoding On
SecServerResponseToken Off
SecAuditEngine RelevantOnly
SecAuditLog logs/audit_log
SecFilterDebugLog logs/modsec_debug_log
SecFilterDebugLevel 0
SecFilterDefaultAction "deny,log,status:406"
SecFilter /etc/*passwd
SecFilter /bin/*sh
SecFilter "\.\./"
SecFilter "<( |\n)*script"
SecFilter "<(.|\n)+>"
SecFilter "delete[[:space:]]+from"
SecFilter "insert[[:space:]]+into"
SecFilter "select.+from"
SecFilter "union[[:space:]]+from"
SecFilter "drop[[:space:]]"
SecFilterSelective "HTTP_USER_AGENT|HTTP_HOST" "^$"
</IfModule>
加大apache最大连接数的配置,如果选择的是preworker工作方式。preworker和worker的区别就不讲了。apache2.0以上直接设置ServerLimit即可,apache2.0以前还要修改源代码才能使修改
的ServerLimit生效,建议应用服务器用apache2.0吧,性能差不了多少。
<IfModule mpm_prefork_module>
ServerLimit 20000 #ServerLimit据说要放第一行
StartServers 50
MinSpareServers 50
MaxSpareServers 100
MaxClients 10000
MaxRequestsPerChild 10000
</IfModule>
压缩传输的配置,这个做为网站来说非常重要,它是不压缩传输大小的20%左右,也就是说用户访问一个网站速度快了5倍,不配置不行,但是图片不能做压缩了。
<IfModule mod_deflate.c>
SetOutputFilter DEFLATE
DeflateCompressionLevel 3
DeflateFilterNote Input instream
DeflateFilterNote Output outstream
DeflateFilterNote Ratio ratio
LogFormat '"%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" "%r" %{outstream}n/%{instream}n (%{ratio}n%%)' deflate
# Netscape 4.x has some problems...
BrowserMatch ^Mozilla/4 gzip-only-text/html
# Netscape 4.06-4.08 have some more problems
BrowserMatch ^Mozilla/4\.0[678] no-gzip
# MSIE masquerades as Netscape, but it is fine
#BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
# NOTE: Due to a bug in mod_setenvif up to Apache 2.0.48
# the above regex won't work. You can use the following
# workaround to get the desired effect:
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
# Don't compress images, java scripts and style sheets
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|js|css)$ no-gzip dont-vary
# Make sure proxies don't deliver the wrong content
# this needs mod_headers but it's very important
# so I don't add a IfModule around it
#Header append Vary User-Agent env=!dont-vary
#CustomLog logs/deflate_log.log deflate
#CustomLog "|/usr/local/cronolog/sbin/cronolog /usr/local/apache2.0.59_2/logs/www.shedewang.com.access.log.%Y%m%d" deflate env=!IMAG
</IfModule>
apache配置mod_mem_cache,这个模块不太好使,建议不用
<IfModule mod_cache.c>
#CacheForceCompletion 100
CacheDefaultExpire 3600
CacheMaxExpire 86400
CacheLastModifiedFactor 0.1
CacheIgnoreNoLastMod on
<IfModule mod_mem_cache.c>
CacheEnable mem /
MCacheSize 2000000
MCacheMaxObjectCount 10000
MCacheMinObjectSize 1000
MCacheMaxObjectSize 512000
MCacheRemovalAlgorithm LRU
</IfModule>
</IfModule>
CacheEnable: 启动 mod_cache,其后接两个参数。第一个参数指定快取的种类,应设为 mem (记忆体快取) 或 disk (磁碟快取) 之其一;第二个参数指定使用快取的 URI 路径,如果对整个网站 (或虚拟主机) 进行快取,简单指定为根目录(/) 即可。
CacheForceCompletion: 这个值指定当 HTTP request 被取消时,内容的产生动作要完成的百分比;预设是 60(%)。
CacheDefaultExpire: 指定快取的预设过期秒数;预设值是一小时 (3600)。
CacheMaxExpire: 指定快取最大的过期秒数;预设值是一天 (86400)。
CacheLastModifiedFactor: 用来从回应里 Last Modified 资讯算出 expire date。
计算方式是:expire period (过期时距) = 最后更新后至今的时间间距 * CacheLastModifiedFactor
而expire date = 目前时间 + expire period
不过无论如何,过期时间不能超过 CacheMaxExpire 的设定值。
配置mod_expires模块
mod_expires可以减少10%左右的重复请求,让重复的用户对指定的页面请求结果都CACHE在本地,根本不向服务器发出请求,这一点特别实用在图片服务器上。
mod_expires的安装配置:
<IfModule mod_expires.c>
# turn on the module for this directory
ExpiresActive on
# cache common graphics for 3 days
ExpiresByType image/jpg "access plus 365 days"
ExpiresByType image/gif "access plus 365 days"
ExpiresByType image/jpeg "access plus 365 days"
ExpiresByType image/png "access plus 365 days"
</IfModule>
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wanghao72214/archive/2009/01/15/3788891.aspx
作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/2934/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!
最后编辑: jackxiang 编辑于2011-8-31 18:38
评论列表