|
|
modsecurity原本是Apache上的一款开源waf,可以有效的增强web安全性,目前已经支持nginx和IIS,配合nginx的灵活和高效,可以打造成生产级的WAF,是保护和审核web安全的利器。
, B4 Y0 W6 X" {3 R/ ]5 U
) _4 x$ i% c% \- m) l一.准备工作* O3 `" N7 s1 W2 D$ x9 R
5 h( z2 j- t& ^5 Q/ B8 p3 U H4 {系统:centos 6.5 64位、 tengine 2.1.0, modsecurity 2.8.0
# G0 h5 T5 } D9 c
$ J% O" [. n1 atengine : http://tengine.taobao.org/download/tengine-2.1.0.tar.gz9 j; t" C! |0 {8 U
3 J3 P, S9 F8 E" v$ T
modsecurity for Nginx: https://www.modsecurity.org/tarball/2.8.0/modsecurity-2.8.0.tar.gz
! N: @% C* k& ~* v* ]# s
: w- z: ~3 f! g" D- GOWASP规则集: https://github.com/SpiderLabs/owasp-modsecurity-crs% j2 ^" t8 ]1 @# T+ l0 o
" P# P1 H3 o+ x2 R( P; R2 |依赖关系:
7 Y4 W; Y) G, {( b- S6 K1 T% Xtengine(nginx)依赖: pcre 、zlib、 openssl, 这三个包centos 6.5 系统源里都有:0 X+ _# f; ~( G! Q# m
! e5 a6 y# c1 | q1 ^& W6 A; O; n
yum install zlib zlib-devel openssl openssl-devel pcre pcre-devel
! ^0 @% a: m4 }modsecurty依赖的包:pcre httpd-devel libxml2 apr5 Q$ o5 }' h* {
: e. y$ p$ s: R" fyum install httpd-devel apr apr-util-devel apr-devel pcre pcre-devel libxml2 libxml2-devel+ \, r9 ?1 g& T1 n4 C) q& Q
二.启用standalone模块并编译
0 G3 l. P7 x6 W
& ?! N( y/ {! F. z1 ~( A下载modsecurity for nginx 解压,进入解压后目录执行:
1 l6 k$ D, {6 [) D% p0 _% j6 K1 d
./autogen.sh' n& v2 L B/ _9 B
./configure --enable-standalone-module --disable-mlogc
( n( |+ ^# v8 m) A+ H/ B0 x0 Gmake 3 ], {4 S5 M3 o2 h. Q9 j
三.nginx添加modsecurity模块1 j- d& e6 F8 R# I$ G
0 E9 c, e& W% P' {在编译standalone后,nginx编译时可以通过"--add-module"添加modsecurity模块:5 w/ l) |5 N% E- E
+ l3 v- V# C% b9 G" ^; [) A./configure --add-module=/root/modsecurity-2.8.0/nginx/modsecurity/ --prefix=/opt/tengine# K# |$ `& O3 `9 D$ x
make && make install
: \" L- s; v/ k7 X9 l四.添加规则. A% x$ K% {" O; a R
& E2 e N. \3 z8 \% r
modsecurity倾向于过滤和阻止web危险,之所以强大就在于规则,OWASP提供的规则是于社区志愿者维护的,被称为核心规则CRS(corerules),规则可靠强大,当然也可以自定义规则来满足各种需求。 ?3 f3 M9 R$ H; L% J) H, _
" x2 `+ A8 ^5 r7 B% f- d- r: `) ?- j
1.下载OWASP规则:
8 P5 u7 V ?7 o* G5 Q2 q9 ~
7 c- k) P g B p$ [0 V3 ~3 Sgit clone https://github.com/SpiderLabs/owasp-modsecurity-crs
1 D0 u) q9 v4 P, r4 ~
8 \! Z5 U& C$ V( D2 z: J4 [4 a$ Y+ nmv owasp-modsecurity-crs /opt/tengine/conf/
. I: Z" L* F' C8 G: m7 c( B+ S# Q; K t1 C! d/ M
cd /opt/tengine/conf/owasp-modsecurity-crs && mv modsecurity_crs_10_setup.conf.example modsecurity_crs_10_setup.conf5 z$ t/ [6 B- t% D" \# i9 D& g
2.启用OWASP规则:. V' A$ p& `; u( `
- b# n% d! n/ ?+ n4 x
复制modsecurity源码目录下的modsecurity.conf-recommended和unicode.mapping到nginx的conf目录下,并将modsecurity.conf-recommended重新命名为modsecurity.conf。
V" z' O& j% T* |$ r* W; u! {1 }: B
编辑modsecurity.conf 文件,将SecRuleEngine设置为 on D3 M, _' N5 [ Q& b" e
. T' J' c3 [* L3 U. z- p" Z
owasp-modsecurity-crs下有很多存放规则的文件夹,例如base_rules、experimental_rules、optional_rules、slr_rules,里面的规则按需要启用,需要启用的规则使用Include进来即可。
$ F3 c4 f( B4 A* Z, n! T
9 u3 m1 a" c+ S! o3 X% b% }# z2 j' o% oInclude owasp-modsecurity-crs/modsecurity_crs_10_setup.conf
" }. ]% @% \ H# }! [$ |Include owasp-modsecurity-crs/base_rules/modsecurity_crs_41_sql_injection_attacks.conf, ]' \: S3 e) s# R8 D2 T
Include owasp-modsecurity-crs/base_rules/modsecurity_crs_41_xss_attacks.conf) ~7 y$ h; U8 m0 X6 G- ]0 @
Include owasp-modsecurity-crs/base_rules/modsecurity_crs_40_generic_attacks.conf
! P2 o( c: d9 hInclude owasp-modsecurity-crs/experimental_rules/modsecurity_crs_11_dos_protection.conf
& f; g4 }, M0 h Z0 S7 jInclude owasp-modsecurity-crs/experimental_rules/modsecurity_crs_11_brute_force.conf
4 U7 b+ J1 N4 w+ M$ C( ^6 FInclude owasp-modsecurity-crs/optional_rules/modsecurity_crs_16_session_hijacking.conf0 s5 |9 v; O6 a! C; o
五.配置nginx5 x) @) z. t4 A3 G& W; O
9 n) F+ b, Z/ j! x& b5 H( I在需要启用modsecurity的主机的location下面加入下面两行即可:
T3 B9 v e4 C5 Q, k: s; }" @0 v' l7 r5 A* I. \) U+ X
ModSecurityEnabled on; , `) w4 [7 D7 }
ModSecurityConfig modsecurity.conf;
& d4 I$ [, P- A3 |# E" y: y下面是两个示例配置,php虚拟主机:
) u# @- D4 y+ L) n
# M: a+ k' N1 f5 O2 k; u: Eserver {
3 R! i. _5 E! i+ I7 ], i: x* L7 _ listen 80;
0 u Z: d2 W# m; y @2 u server_name 52os.net www.52os.net;
( U h: i# a7 J. r6 ?5 B: [ \2 x 3 X+ U3 m! w# T+ g1 P2 {. g
location ~ \.php$ {8 u! p7 h& N" _
ModSecurityEnabled on;
* B) K0 r2 P- h5 O. m4 [7 p% z% b ModSecurityConfig modsecurity.conf;
( M8 l9 ^* O3 U
+ ~6 N6 ^; j+ j; @+ D. C root /web/wordpress;
0 P; l/ W- I9 B, f index index.php index.html index.htm;9 ?5 q# p( ]3 P8 `0 F! O
8 H D) \, ^# \! J$ R
fastcgi_pass 127.0.0.1:9000;
6 g* M0 u5 z- k( g fastcgi_index index.php;
$ N3 i$ f( t3 z fastcgi_param SCRIPT_FILENAME $Document_root$fastcgi_script_name;2 R6 Y* D6 D4 V( f2 l+ R
include fastcgi_params;+ s2 @6 [/ k8 K* z' w4 U6 Q1 v
}7 K1 e& p( t; n* N9 r7 _3 U6 v
}
+ T% I' @# I$ F3 }upstream负载均衡:
4 L( z8 E2 S: f g! d6 f$ ^9 y' n+ _6 X: f
upstream 52os.net {
! c' X7 ^2 z2 `# D* G1 ]" s server 192.168.1.100:8080;
: s5 H; r4 v6 j J, I7 p server 192.168.1.101:8080 backup;
# n% X6 v! x1 j$ J8 m1 K}
6 y# }1 s- f8 j' E* {- O2 ?+ a/ n3 e2 S- a3 b
server {& M( }( W& a- s6 e/ F: b
listen 80;
5 Y; A$ W4 k3 m" |0 y: x# s* bserver_name 52os.net www.52os.net;
1 S O3 t% f5 l& a" V
) X: l* M0 |7 U! alocation / {
: p: J W- M2 B8 {; x( c* h2 B ModSecurityEnabled on;
( [6 d# f6 [1 \2 F4 Q; @ ModSecurityConfig modsecurity.conf;
0 J# O1 u6 B3 `5 |* h, {( {9 l/ S4 b
proxy_pass http://online;
# k2 w; h& j( N; ]+ z4 f proxy_redirect off;: c# L) q- B6 M# b$ z
proxy_set_header Host $host;. Z; A( c# T0 m6 E, V0 c2 F$ H" K
proxy_set_header X-Real-IP $remote_addr;
. w, B! s" J, u( g/ x proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# F2 L. A1 h+ k9 k
}1 c0 ^2 z0 [. A/ \5 j/ G
}- J- G9 j) s& ~4 |1 U9 A J9 p. }0 o
六.测试
" I# N; E$ z" q8 k! {2 @* \; \5 w3 C$ A4 z1 f4 N# A! ~
我们启用了xss和sql注入的过滤,不正常的请求会直接返回403。以php环境为例,新建一个phpinfo.php内容为:
2 j6 Q6 Q( x F, M$ r: Y% T( o+ m2 G. I
<?php
, Z' O4 Q" u5 i; A+ Q phpinfo(); ! a m0 T7 }8 e* V/ B: Y% ?
?>
2 ^/ _& m& ]" V2 L3 F* c在浏览器中访问:
0 X8 P1 {# c4 T6 a8 y
7 F; R! ^5 W$ a( Z! ^% U) {, |9 ihttp://www.52os.net/phpinfo.php?id=1 正常显示。, A# g4 X& m5 T/ C0 e
http://www.52os.net/phpinfo.php?id=1 and 1=1 返回403。
9 n. K9 \" t4 l7 uhttp://www.52os.net/phpinfo.php?search=<scritp>alert('xss');</script> 返回403。0 }. U" y& q1 G0 C# V
说明sql注入和xss已经被过滤了
' o) r+ ]* U' Z' g! y
1 Z6 l" }5 }1 p! z5 F, J$ u, ]七、安装过程中排错4 Q z% [+ O( V3 _, }" C; A( A
7 B7 I/ f! G l# }( ^1 M9 I
1.缺少APXS会报错
1 p9 D/ N: S! c3 J7 h" a U% F* X# V1 q
configure: looking for Apache module support via DSO through APXS4 `) A0 I' E. X+ `# M4 |; A( @
configure: error: couldn't find APXS- Z) W3 Z. T$ _! R. b- y: X
apxs是一个为Apache HTTP服务器编译和安装扩展模块的工具,用于编译一个或多个源程序或目标代码文件为动态共享对象。
& z3 q% i% W2 {* h3 b% x* }; ^解决方法:& w5 b/ r' u4 y3 w( j+ ?* Q `
4 p' s$ Q! F4 L% z2 F6 a' z
yum install httpd-devel/ E9 Z6 K+ ]6 a( r
2.没有pcre3 o% N$ u6 m1 N+ H% ~8 {
( R# r: n- m4 j pconfigure: *** pcre library not found.7 F! ?% I e" H; E
configure: error: pcre library is required# Z' d6 F! i9 p+ r y/ ~
解决方法:, `$ [6 Z' G7 L
( v# d2 g% e' C# x
yum install pcre pcre-devel
" l& l- H( {0 P" F6 N- u ]3.没有libxml2
% H e: @( [! U. }* t1 b
. S' {! C- H& r' i5 y' T, ~+ S& T# y4 X+ t: ^
configure: *** xml library not found.
. h! _7 I- J$ m, o9 v- o7 F# Rconfigure: error: libxml2 is required
6 j. }+ b0 g7 Q0 s& a3 p! j) d8 F解决方法:$ P& H7 S3 k5 x* P5 R8 s4 `
/ m W, y3 ^, Myum install libxml2 libxml2-devel
( a; m. z) i& t& H4.执行 /opt/tengine/sbin/nginx -m 时有警告
& ?! Z$ W& L! u+ C e. W8 N; d* i# A% v. l8 B: J
Tengine version: Tengine/2.1.0 (nginx/1.6.2)2 X( I7 w4 b7 ?
nginx: [warn] ModSecurity: Loaded APR do not match with compiled!
" V& j8 [4 \ ]7 `! b) G原因:modsecurity编译时和加载时的apr版本不一致造成的,并且会有以下error.log1 ~# K# I2 _; `9 ]1 `! L
: C! F# M1 g0 h" Q8 w9 ]9 x! n
2015/01/26 02:04:18 [notice] 29036#0: ModSecurity for nginx (STABLE)/2.8.0 () configured.
% C# ]/ Q; T0 j5 }% ?9 N2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: APR compiled version="1.5.0"; loaded version="1.3.9"
! X2 _' h( Z2 X& `# D" C! m% u2015/01/26 02:04:18 [warn] 29036#0: ModSecurity: Loaded APR do not match with compiled!
$ q( u" c% Y) E4 |2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: PCRE compiled version="7.8 "; loaded version="7.8 2008-09-05"
* d7 t$ c+ t$ F# _: J2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: LIBXML compiled version="2.7.6"
2 v0 r9 r$ r0 [9 |6 D5 p2015/01/26 02:04:18 [notice] 29036#0: Status engine is currently disabled, enable it by set SecStatusEngine to On.
) h: A7 {5 q: }6 M+ ^解决方法,移除低版本的APR (1.3.9)
, A0 \6 P4 D% T9 C
- X$ c6 x4 s3 ]. ]yum remove apr$ ~$ F" S' ^ X/ u ]
5.Error.log中有: Audit log: Failed to lock global mutex( x. ^! E* j- G, M# h7 O3 I4 G
# i8 h8 C0 X3 Q
2015/01/26 04:15:42 [error] 61610#0: [client 10.11.15.161] ModSecurity: Audit log: Failed to lock + q: U e, O2 Q
global mutex: Permission denied [hostname ""] [uri "/i.php"] [unique_id "AcAcAcAcAcAcAcA4DcA7AcAc"]* I) i/ S7 t1 t0 u3 |
解决方法:
( h! |6 F# [) r' }" X编辑modsecurity.conf,注释掉默认的SecAuditLogType和SecAuditLog,添加以下内容:
5 |, ?. H' w- h' C! \! ]2 P" |/ x; C O# o! i" K
SecAuditLogDirMode 0777
+ B) Z. d1 Y5 w5 W8 k% FSecAuditLogFileMode 0550
" ~6 Q y% l7 K; f# GSecAuditLogStorageDir /var/log/modsecurity3 h# Z: h1 ~. j* i% y% q) Z
SecAuditLogType Concurrent( ?0 F% {& ]1 D
参考文章:
; B. W3 r# ]4 B; phttps://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#Installation_for_NGINX
% i9 C- l8 a+ k8 Nhttp://drops.wooyun.org/tips/2614 |
|