Naxsi模块的集成,是基于Nginx已经部署了或已经存在系统中。

第一步:下载naxsi

1
[qiang@localhost home]$ wget  http: //naxsi .googlecode.com /files/naxsi-core-0 .51-1.tgz

注:如果不能上网可以事先下载,再上传到服务器中。

第二步:解压naxsi

1
[qiang@localhost home]$  tar  -zxvf naxsi-core-0.51-1.tgz

第三步:切换到naxsi-core-0.51-1目录,并复制其配置文件到nginx.conf同目录下

1
[qiang@localhost naxsi_config]$  cp  naxsi_core.rules  /etc/nginx/naxsi_core .rules

修改naxsi_core.rules的配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
##################################
## INTERNAL RULES IDS:1-999     ##
##################################
#@MainRule "msg:weird request, unable to parse" id:1;
#@MainRule "msg:request too big, stored on disk and not parsed" id:2;
#@MainRule "msg:invalid hex encoding, null bytes" id:10;
#@MainRule "msg:unknown content-type" id:11;
#@MainRule "msg:invalid formatted url" id:12;
#@MainRule "msg:invalid POST format" id:13;
#@MainRule "msg:invalid POST boundary" id:14;
##################################
## SQL Injections IDs:1000-1099 ##
##################################
MainRule  "rx:select|union|update|delete|insert|table|from|ascii|hex|unhex|drop"  "msg:sql keywords"  "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie"  "s:$SQL:8"  id :1000;
MainRule  "str:\""  "msg:double quote"  "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie"  "s:$SQL:8,$XSS:8"  id :1001;
MainRule  "str:0x"  "msg:0x, possible hex encoding"  "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie"  "s:$SQL:2"  id :1002;
## Hardcore rules
MainRule  "str:/*"  "msg:mysql comment (/*)"  "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie"  "s:$SQL:8"  id :1003;
MainRule  "str:*/"  "msg:mysql comment (*/)"  "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie"  "s:$SQL:8"  id :1004;
MainRule  "str:|"  "msg:mysql keyword (|)"   "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie"  "s:$SQL:8"  id :1005;
##MainRule "str:&&" "msg:mysql keyword (&&)" "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie" "s:$SQL:8" id:1006;
## end of hardcore rules
MainRule  "str:--"  "msg:mysql comment (--)"  "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie"  "s:$SQL:4"  id :1007;
MainRule  "str:;"  "msg:; in stuff"  "mz:BODY|URL|ARGS"  "s:$SQL:4,$XSS:8"  id :1008;
MainRule  "str:="  "msg:equal in var, probable sql/xss"  "mz:ARGS|BODY"  "s:$SQL:2"  id :1009;
##MainRule "str:(" "msg:parenthesis, probable sql/xss" "mz:ARGS|URL|BODY|$HEADERS_VAR:Cookie" "s:$SQL:4,$XSS:8" id:1010;
##MainRule "str:)" "msg:parenthesis, probable sql/xss" "mz:ARGS|URL|BODY|$HEADERS_VAR:Cookie" "s:$SQL:4,$XSS:8" id:1011;
MainRule  "str:'"  "msg:simple quote"  "mz:ARGS|BODY|URL|$HEADERS_VAR:Cookie"  "s:$SQL:4,$XSS:8"  id :1013;
MainRule  "str:,"  "msg:, in stuff"  "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie"  "s:$SQL:4"  id :1015;
MainRule  "str:#"  "msg:mysql comment (#)"  "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie"  "s:$SQL:4"  id :1016;
###############################
## OBVIOUS RFI IDs:1100-1199 ##
###############################
MainRule  "str:http://"  "msg:http:// scheme"  "mz:ARGS|BODY|$HEADERS_VAR:Cookie"  "s:$RFI:8"  id :1100;
MainRule  "str:https://"  "msg:https:// scheme"  "mz:ARGS|BODY|$HEADERS_VAR:Cookie"  "s:$RFI:8"  id :1101;
MainRule  "str:ftp://"  "msg:ftp:// scheme"  "mz:ARGS|BODY|$HEADERS_VAR:Cookie"  "s:$RFI:8"  id :1102;
MainRule  "str:php://"  "msg:php:// scheme"  "mz:ARGS|BODY|$HEADERS_VAR:Cookie"  "s:$RFI:8"  id :1103;
MainRule  "str:sftp://"  "msg:sftp:// scheme"  "mz:ARGS|BODY|$HEADERS_VAR:Cookie"  "s:$RFI:8"  id :1104;
MainRule  "str:zlib://"  "msg:zlib:// scheme"  "mz:ARGS|BODY|$HEADERS_VAR:Cookie"  "s:$RFI:8"  id :1105;
MainRule  "str:data://"  "msg:data:// scheme"  "mz:ARGS|BODY|$HEADERS_VAR:Cookie"  "s:$RFI:8"  id :1106;
MainRule  "str:glob://"  "msg:glob:// scheme"  "mz:ARGS|BODY|$HEADERS_VAR:Cookie"  "s:$RFI:8"  id :1107;
MainRule  "str:phar://"  "msg:phar:// scheme"  "mz:ARGS|BODY|$HEADERS_VAR:Cookie"  "s:$RFI:8"  id :1108;
MainRule  "str:file://"  "msg:file:// scheme"  "mz:ARGS|BODY|$HEADERS_VAR:Cookie"  "s:$RFI:8"  id :1109;
#######################################
## Directory traversal IDs:1200-1299 ##
#######################################                                       
MainRule  "str:.."  "msg:double dot"  "mz:ARGS|URL|BODY|$HEADERS_VAR:Cookie"  "s:$TRAVERSAL:4"  id :1200;
MainRule  "str:/etc/passwd"  "msg:obvious probe"  "mz:ARGS|URL|BODY|$HEADERS_VAR:Cookie"  "s:$TRAVERSAL:4"  id :1202;
MainRule  "str:c:\\"  "msg:obvious windows path"  "mz:ARGS|URL|BODY|$HEADERS_VAR:Cookie"  "s:$TRAVERSAL:4"  id :1203;
MainRule  "str:cmd.exe"  "msg:obvious probe"  "mz:ARGS|URL|BODY|$HEADERS_VAR:Cookie"  "s:$TRAVERSAL:4"  id :1204;
MainRule  "str:\\"  "msg:backslash"  "mz:ARGS|URL|BODY|$HEADERS_VAR:Cookie"  "s:$TRAVERSAL:4"  id :1205;
MainRule  "str:/"  "msg:slash in args"  "mz:ARGS|BODY|$HEADERS_VAR:Cookie"  "s:$TRAVERSAL:2"  id :1206;
########################################
## Cross Site Scripting IDs:1300-1399 ##
########################################
MainRule  "str:<"  "msg:html open tag"  "mz:ARGS|URL|BODY|$HEADERS_VAR:Cookie"  "s:$XSS:8"  id :1302;
MainRule  "str:>"  "msg:html close tag"  "mz:ARGS|URL|BODY|$HEADERS_VAR:Cookie"  "s:$XSS:8"  id :1303;
MainRule  "str:["  "msg:[, possible js"  "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie"  "s:$XSS:4"  id :1310;
MainRule  "str:]"  "msg:], possible js"  "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie"  "s:$XSS:4"  id :1311;
MainRule  "str:~"  "msg:~ character"  "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie"  "s:$XSS:4"  id :1312;
MainRule  "str:`"   "msg:grave accent !"  "mz:ARGS|URL|BODY|$HEADERS_VAR:Cookie"  "s:$XSS:8"  id :1314;
MainRule  "rx:%[2|3]."   "msg:double encoding !"  "mz:ARGS|URL|BODY|$HEADERS_VAR:Cookie"  "s:$XSS:8"  id :1315;
MainRule  "rx:%3[c|e]."   "msg:double encoding !"  "mz:ARGS|URL|BODY|$HEADERS_VAR:Cookie"  "s:$XSS:8"  id :1316;
MainRule  "rx:\\\u003[c|e]"   "msg:tag encoding !"  "mz:ARGS|URL|BODY|$HEADERS_VAR:Cookie"  "s:$XSS:8"  id :1317;
MainRule  "str:&#"  "msg: utf7/8 encoding"  "mz:ARGS|URL|BODY|$HEADERS_VAR:Cookie"  "s:$EVADE:4"  id :1318;
####################################
## Evading tricks IDs: 1400-1500 ##
####################################
MainRule  "str:&#"  "msg: utf7/8 encoding"  "mz:ARGS|BODY|URL|$HEADERS_VAR:Cookie"  "s:$EVADE:4"  id :1400;
MainRule  "str:%U"  "msg: M$ encoding"  "mz:ARGS|BODY|URL|$HEADERS_VAR:Cookie"  "s:$EVADE:4"  id :1401;
MainRule negative  "rx:multipart/form-data|application/x-www-form-urlencoded"  "msg:Content is neither mulipart/x-www-form.."  "mz:$HEADERS_VAR:Content-type"  "s:$EVADE:4"  id :1402;
#############################
## File uploads: 1500-1600 ##
#############################
MainRule  "rx:.ph|.asp|.ht"  "msg:asp/php file upload!"  "mz:FILE_EXT"  "s:$UPLOAD:8"  id :1500;
MainRule  "rx:.jsp"  "msg:asp/php file upload!"  "mz:FILE_EXT"  "s:$UPLOAD:8"  id :1501;
MainRule  "rx:.html"  "msg:asp/php file upload!"  "mz:FILE_EXT"  "s:$UPLOAD:8"  id :1502;
MainRule  "rx:.php"  "msg:asp/php file upload!"  "mz:FILE_EXT"  "s:$UPLOAD:8"  id :1503;

注:(1)nginx.conf所有的目录是在nginx编译安装时,默认的配置是<prefix>/conf/nginx.conf。

(2)鉴于原有的naxsi_core.rules文件中规则不足,最好是采用本文档中的配置规则。

第四步:编译安装Nginx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[qiang@localhost nginx-1.5.7] #./configure --prefix=/usr
--sbin-path= /usr/sbin/nginx
--conf-path= /etc/nginx/nginx .conf
--add-module= /home/naxsi-core-0 .51-1 /naxsi_src
--error-log-path= /var/log/nginx/error .log
--pid-path= /var/run/nginx/nginx .pid
--user=root
--group=root
--with-http_ssl_module
--with-http_flv_module
--with-http_gzip_static_module
--http-log-path= /var/log/nginx/access .log
--http-client-body-temp-path= /var/tmp/nginx/client
--http-proxy-temp-path= /var/tmp/nginx/proxy
--http-fastcgi-temp-path= /var/tmp/nginx/fcgi
--with-http_stub_status_module
[root@localhost nginx-1.5.7] # make && make install

注:上述的参数可以根据实际情况选择,但是标红的需要有。


第五步:验证nginx是否安装成功

1
2
3
4
5
6
7
8
9
[qiang@localhost nginx-1.5.7] # nginx
nginx: [warn] low address bits of 192.168.1.65 /26  are meaningless  in  /etc/nginx/nginx .conf:78
[qiang@localhost nginx-1.5.7] # ps -ef |grep nginx
root      3086     1  0 10:53 ?        00:00:00 nginx: master process nginx
root      3087  3086  1 10:53 ?        00:00:00 nginx: worker process
root      3088  3086  1 10:53 ?        00:00:00 nginx: worker process
root      3089  3086  1 10:53 ?        00:00:00 nginx: worker process
root      3090  3086  1 10:53 ?        00:00:00 nginx: worker process
root      3093  3073  4 10:53 pts /1     00:00:00  grep  nginx

第六步:配置过滤条件

切换目录到与nginx.conf同目录下,新建nbs.rules文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
[qiang@localhost nginx] # vim nbs.rules
##LearningMode;
#Enables learning mode--stop
SecRulesEnabled;
##Disables learning
##SecRulesDisabled;
DeniedUrl  "/RequestDenied" ;
## check rules
CheckRule  "$SQL >= 8"  BLOCK;
CheckRule  "$RFI >= 8"  BLOCK;
CheckRule  "$TRAVERSAL >= 8"  BLOCK;
CheckRule  "$EVADE >= 8"  BLOCK;
CheckRule  "$XSS >= 8"  BLOCK;
############################################################
##      STOP   ALL   RULES(如果不需要可以关闭全部过滤规则)  ##
############################################################
#BasicRule wl:0;
##################################
## INTERNAL RULES IDS:1-999     ##
##################################
BasicRule wl:1,2,10,11,12,13,14;
##################################
## SQL Injections IDs:1000-1099 ##
##################################
BasicRule wl:1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016;
###############################
## OBVIOUS RFI IDs:1100-1199 ##
###############################
BasicRule wl:1100,1101,1102,1103,1104,1105,1106,1107,1108,1109;
#######################################
## Directory traversal IDs:1200-1299 ##
#######################################
BasicRule wl:1200,1202,1203,1204,1205,1206;
########################################
## Cross Site Scripting IDs:1300-1399 ##
########################################
BasicRule wl:1310,1311,1312,1313,1314,1315,1318;
####################################
## Evading tricks IDs: 1400-1500 ##
####################################
BasicRule wl:1400,1401,1402;
#############################
## File uploads: 1500-1600 ##
#############################
BasicRule wl:1500,1501,1502,1503;

注:该nbs.rules文件的规则需要根据不同的业务应用制定。


第七步:配置nginx.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
http {
     include       naxsi_core.rules;
     include       mime.types;
     default_type  application /octet-stream ;
     .......
     server {
         listen       80;
         server_name  localhost centoshost.com;
         charset utf-8;
         .......
         location  /wavsep/  {
             .......
             include nbs.rules;
             .......
         }
         location  /RequestDenied  {
             error_page  404   /404 .html;
         }

第九步:重启nginx

1
2
3
4
5
6
[qiang@localhost nginx] # nginx -t -c /etc/nginx/nginx.conf
nginx: [warn] low address bits of 192.168.1.65 /26  are meaningless  in  /etc/nginx/nginx .conf:78
nginx: the configuration  file  /etc/nginx/nginx .conf syntax is ok
nginx: configuration  file  /etc/nginx/nginx .conf  test  is successful
[qiang@localhost nginx] # nginx -s reload
nginx: [warn] low address bits of 192.168.1.65 /26  are meaningless  in  /etc/nginx/nginx .conf:78

第十步:测试拦截规则是否启用

上述的规则仅过滤“<”、“>”和SQL的一些关键字(select|union|update|delete|insert|table|from|ascii|hex|unhex|drop|waitfor)。