|
|
modsecurity原本是Apache上的一款开源waf,可以有效的增强web安全性,目前已经支持nginx和IIS,配合nginx的灵活和高效,可以打造成生产级的WAF,是保护和审核web安全的利器。- h$ u( d7 u7 k& I6 F+ W$ d
; V) U, E A( o9 Z' a一.准备工作
! q1 u5 L9 w9 S
3 S7 Y! d% O; i! u. `2 V6 f- a4 t系统:centos 6.5 64位、 tengine 2.1.0, modsecurity 2.8.0
- N" ?+ ^$ K% v, n; M3 |, g6 L% m& j% p! y8 f- p- m& y
tengine : http://tengine.taobao.org/download/tengine-2.1.0.tar.gz
- _/ N c! A$ m& d ?# K. |+ _9 S8 }( w% K8 c: ]1 f" c* J* u8 T- P; M$ [( M% r
modsecurity for Nginx: https://www.modsecurity.org/tarball/2.8.0/modsecurity-2.8.0.tar.gz# w4 z" n* ?- v4 k) J
: p$ F6 @ L4 z# u- F7 S
OWASP规则集: https://github.com/SpiderLabs/owasp-modsecurity-crs
. V& o! S7 {0 ~! N! n. m% ?1 A r; G7 o3 T; @' F
依赖关系:( a- K/ V5 u4 P8 q1 T# Y3 h9 x
tengine(nginx)依赖: pcre 、zlib、 openssl, 这三个包centos 6.5 系统源里都有:' ]6 h. Q! ?+ I2 J- [& g
5 Q1 I5 W6 c- J, P" Q! Myum install zlib zlib-devel openssl openssl-devel pcre pcre-devel
3 u d& U, \! W* W+ b/ M( vmodsecurty依赖的包:pcre httpd-devel libxml2 apr0 H+ H, o9 N& L) L- u3 }
6 Q; b8 ~" {. N9 \0 ^: a
yum install httpd-devel apr apr-util-devel apr-devel pcre pcre-devel libxml2 libxml2-devel
; T) G3 ]! d* D- g5 t二.启用standalone模块并编译1 c: e% |5 Z' B9 q5 m) e3 e [
7 b' R1 |4 y3 _& e! W* g. h0 Q9 k下载modsecurity for nginx 解压,进入解压后目录执行:) L1 X8 q1 P7 m: \) r% M
+ k4 [ V3 o6 ^9 f" {: C& U
./autogen.sh; E$ J& Z+ X4 s4 ^& t+ p
./configure --enable-standalone-module --disable-mlogc
7 h0 y) f# \/ M: Y w& m* Q( [make
+ o; i0 Q) O2 r8 h: z. ~1 R8 D& w三.nginx添加modsecurity模块
5 ?4 Z. _) H% G, F4 x. @/ D0 c& G' w e
在编译standalone后,nginx编译时可以通过"--add-module"添加modsecurity模块:+ o# Y( `: b9 ` @" ~1 v
* D2 g& J; }5 M: v b! h) l: \./configure --add-module=/root/modsecurity-2.8.0/nginx/modsecurity/ --prefix=/opt/tengine7 v5 l6 Z; L0 @6 \
make && make install
* u" m* b3 ^9 c6 u四.添加规则6 h' i g* Q$ g" @
! J# T" D+ D' S. f" T$ b- imodsecurity倾向于过滤和阻止web危险,之所以强大就在于规则,OWASP提供的规则是于社区志愿者维护的,被称为核心规则CRS(corerules),规则可靠强大,当然也可以自定义规则来满足各种需求。
3 H6 `& ?' }$ S8 f9 V. V" J
' `2 T; L- i; I, o# D) U1.下载OWASP规则:
: ?& U" P8 F3 E( @. w8 V" t" @9 O4 w) o* f, U. h# ?0 |7 D
git clone https://github.com/SpiderLabs/owasp-modsecurity-crs
% e8 x/ {% P% `- P2 q7 g# M6 K
* ]3 r4 r, F; r# I7 Nmv owasp-modsecurity-crs /opt/tengine/conf/
9 B# p e- M6 @1 ~3 Z+ v
0 C/ F2 J& c: ~7 l! Ccd /opt/tengine/conf/owasp-modsecurity-crs && mv modsecurity_crs_10_setup.conf.example modsecurity_crs_10_setup.conf; y6 z8 ?$ V0 m- @' \$ l7 g1 F! N
2.启用OWASP规则:6 c6 b# A* O& B0 w- E8 \
" L4 M. ~- E Z' l复制modsecurity源码目录下的modsecurity.conf-recommended和unicode.mapping到nginx的conf目录下,并将modsecurity.conf-recommended重新命名为modsecurity.conf。" i& U: H0 D: z+ k9 D
6 y0 v5 B, w$ o& s: k" a
编辑modsecurity.conf 文件,将SecRuleEngine设置为 on- v7 u3 Z) i: a6 R: C% E9 q# U
6 j) D' |/ [* e) r* H8 j/ Qowasp-modsecurity-crs下有很多存放规则的文件夹,例如base_rules、experimental_rules、optional_rules、slr_rules,里面的规则按需要启用,需要启用的规则使用Include进来即可。6 M" f, a: I' F, \
9 R% k9 f4 I$ f( E
Include owasp-modsecurity-crs/modsecurity_crs_10_setup.conf j% L6 G9 S, r( L
Include owasp-modsecurity-crs/base_rules/modsecurity_crs_41_sql_injection_attacks.conf
- R% t% S3 N$ V( W7 p O# J' [Include owasp-modsecurity-crs/base_rules/modsecurity_crs_41_xss_attacks.conf
5 t7 x- T9 Z8 |/ D/ l. AInclude owasp-modsecurity-crs/base_rules/modsecurity_crs_40_generic_attacks.conf
1 H/ N0 K5 K* s/ ]4 _Include owasp-modsecurity-crs/experimental_rules/modsecurity_crs_11_dos_protection.conf
& F5 c5 H: X# z, `3 oInclude owasp-modsecurity-crs/experimental_rules/modsecurity_crs_11_brute_force.conf
8 F a0 o: n3 d9 @5 F- e& BInclude owasp-modsecurity-crs/optional_rules/modsecurity_crs_16_session_hijacking.conf6 y0 M; W! F0 b' q" E+ A7 P! P
五.配置nginx' `6 i* g! q8 Y' B
$ T3 J; X& i: u1 K在需要启用modsecurity的主机的location下面加入下面两行即可:) P6 z( Z1 H0 \1 h- D
5 b8 c( \- A* l8 ?( x/ _8 b8 T; `
ModSecurityEnabled on;
4 ^# \: ^( _0 N* r6 S6 k( q9 m9 HModSecurityConfig modsecurity.conf;
( m3 Y9 N# o7 X, M+ c9 g. F9 @$ N下面是两个示例配置,php虚拟主机:
& Y( b8 D$ N; \: E- S! L. c5 N- @
$ U T2 [) I0 U) O* Cserver {& q3 Q/ a/ y- \
listen 80;
( W5 v$ Y' w: f7 M server_name 52os.net www.52os.net;
% c8 e7 u, D% ^9 N2 e! }# I3 C
, r' z$ l" b9 X" z3 N2 }/ w% ^9 W location ~ \.php$ {5 w3 m2 R) w) r" t' U" l$ S
ModSecurityEnabled on;
: S* W8 G# r& M2 `; L: g2 l ModSecurityConfig modsecurity.conf;
. N1 K5 e. w3 R* r" J! {- A6 h- {7 D" k3 ~2 ?' x {0 Y& C
root /web/wordpress;% y3 i& r1 \$ U* T" ]) v
index index.php index.html index.htm;) k* t2 K' k" T3 L1 ]! f5 x
7 v; N/ X) w( ?" s( Q
fastcgi_pass 127.0.0.1:9000;$ L" W8 S9 F, n9 ]/ r- d
fastcgi_index index.php;1 D; Y; V# W) a1 A; g
fastcgi_param SCRIPT_FILENAME $Document_root$fastcgi_script_name;" D z$ t8 F& C0 R4 C/ B
include fastcgi_params;
! H6 ~% Y/ T- a5 J. K }, I% \; G+ P1 k3 ^$ m; C( s" v
}
$ Q5 r- l; X- {; o% R+ iupstream负载均衡:. A9 Y; Y- `; h7 ~- _
/ v7 A; _5 D: Nupstream 52os.net {
$ O V- O( _0 m/ l" T! j server 192.168.1.100:8080;6 }; s. e# U9 Z- P8 ]
server 192.168.1.101:8080 backup;% }% I/ z" A8 }, }4 `
}
+ [! [- J( R( U8 }& V
' M+ W+ z2 P8 I2 userver {; d3 H: @( B9 Y- ]( ?
listen 80;$ H- F( o8 O5 S2 T; ~
server_name 52os.net www.52os.net;1 Y; {( T. ]1 j
/ o* y( y/ _( y" p
location / {! ^% L' X3 R( ]4 n: O0 M! a
ModSecurityEnabled on; ) u- [/ |8 A- Q1 F% t$ T
ModSecurityConfig modsecurity.conf; 1 b3 Z6 n5 B9 C. G2 E
, C c; u' {. y( L
proxy_pass http://online;5 }) t( d. W" d1 F
proxy_redirect off;
' }% J" Q& G. w5 ?! E: ^; L proxy_set_header Host $host;# @1 A, @9 L( r& n. n) d, }8 }) [2 y
proxy_set_header X-Real-IP $remote_addr;
7 Z9 R0 A$ g' Q) m0 i proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;) n i) I: p2 N( x' Y, V
}3 ?. J# T* n, V7 E+ G: X1 ~$ c
}
; O& o: ^- _* l0 S- `六.测试' ^- l, }- F7 h# W0 @* ?3 J; U3 X6 q4 ?
, h% E* O: u8 b
我们启用了xss和sql注入的过滤,不正常的请求会直接返回403。以php环境为例,新建一个phpinfo.php内容为:0 J$ P$ o! B0 z$ ~
3 E1 G+ E. f1 O" r* t- H; w
<?php3 r) }9 c3 i+ y+ l& F
phpinfo(); 5 i7 ?( o5 R+ ]0 Z* c8 l
?>; a/ I. D7 p0 Y1 Q
在浏览器中访问:
2 n5 V* O$ J& C8 ~: h9 Q
% N" N( {5 Y4 M3 g: ?http://www.52os.net/phpinfo.php?id=1 正常显示。3 S1 E5 z9 p6 y+ J* t
http://www.52os.net/phpinfo.php?id=1 and 1=1 返回403。6 E- E; d, q% X( y3 p+ S
http://www.52os.net/phpinfo.php?search=<scritp>alert('xss');</script> 返回403。
4 [: C, J) h& H3 q说明sql注入和xss已经被过滤了
5 o6 @5 c+ H) O9 x7 o Z7 N
2 w! D% I9 S) }- x$ M" t七、安装过程中排错1 T& _$ H2 B/ k; {+ Q( r
9 e- F* d1 ^' I! h
1.缺少APXS会报错1 P$ T( G6 m7 m7 g' ] ~4 n
T* L, e* s0 U' W! ^
configure: looking for Apache module support via DSO through APXS
- o2 [# I, O3 E wconfigure: error: couldn't find APXS' B: Y1 J$ T8 V/ t9 D; d" f( ]
apxs是一个为Apache HTTP服务器编译和安装扩展模块的工具,用于编译一个或多个源程序或目标代码文件为动态共享对象。$ w% k2 ^+ p- [2 X8 Z+ C
解决方法:7 D s" k' }% m& j' J9 v n
: A0 k) R" k5 c( ]7 z4 Zyum install httpd-devel
% w% H( ] Y% T3 A8 T9 r* t+ p% c* ^2.没有pcre' d$ H; }' p# D* L+ P7 @
; d6 ^/ [' |* j3 T0 }6 yconfigure: *** pcre library not found.. c: ^( Z. g4 C9 [& q
configure: error: pcre library is required
1 a1 {$ _) g" { O) l( E解决方法:
" K; c2 l$ Z* m M, l( I9 z1 A" u' l Z9 \" U
yum install pcre pcre-devel- D; ?' G: D8 j/ i# V* q* `4 T4 t; a
3.没有libxml2
; B$ l3 Q. o5 X A( { R! y, a- [6 O! H6 j7 B
7 ^" E0 D) M% D. x0 K$ U0 ?
configure: *** xml library not found.
: ]/ U. R( i! q3 ?. Dconfigure: error: libxml2 is required
6 a/ n. a. |* A- o, P: [解决方法:
9 o E* \6 G n/ \. ~7 A9 k P
' ^( x- d7 _- G# f" h6 Nyum install libxml2 libxml2-devel* v( U, Y3 O: P6 _) ?( x: J/ b
4.执行 /opt/tengine/sbin/nginx -m 时有警告
" u2 n Q: H, L3 Y7 O. G7 L; F, V
7 a4 V4 X6 u2 ^5 JTengine version: Tengine/2.1.0 (nginx/1.6.2)5 c$ ^. M0 ?% M$ |: ?: R( T
nginx: [warn] ModSecurity: Loaded APR do not match with compiled!( g$ q3 p% c, e
原因:modsecurity编译时和加载时的apr版本不一致造成的,并且会有以下error.log: J, k. X, s, U. [4 x. F% o
, ?5 i" B- l9 b/ N* a
2015/01/26 02:04:18 [notice] 29036#0: ModSecurity for nginx (STABLE)/2.8.0 () configured." P2 g5 B: W4 b) m _
2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: APR compiled version="1.5.0"; loaded version="1.3.9"
* T+ ~+ L+ ^8 D* h# K% S2015/01/26 02:04:18 [warn] 29036#0: ModSecurity: Loaded APR do not match with compiled!
- m4 R( R2 \! {% ?) ?/ M2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: PCRE compiled version="7.8 "; loaded version="7.8 2008-09-05"/ Q$ @9 D! @: F7 q, ]
2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: LIBXML compiled version="2.7.6"# J6 S s9 |5 B7 |% j" t
2015/01/26 02:04:18 [notice] 29036#0: Status engine is currently disabled, enable it by set SecStatusEngine to On.
8 N2 [2 W4 u1 T H7 }: Q解决方法,移除低版本的APR (1.3.9)
* _# a9 S6 r0 u# v6 H9 m
( _) s5 C7 @/ |$ A7 u1 U" | pyum remove apr0 i. p) u7 r" a7 ?" n5 D) {
5.Error.log中有: Audit log: Failed to lock global mutex
9 o2 h$ r5 H2 Z! {" R. ~) M
, S# W4 q; U! T% h6 M2015/01/26 04:15:42 [error] 61610#0: [client 10.11.15.161] ModSecurity: Audit log: Failed to lock 6 [$ x2 |) ~' z) h& ~9 f5 B
global mutex: Permission denied [hostname ""] [uri "/i.php"] [unique_id "AcAcAcAcAcAcAcA4DcA7AcAc"]/ X: \% k1 z/ t; M/ U2 l
解决方法:
$ P' B5 c- r+ T" V# w& e编辑modsecurity.conf,注释掉默认的SecAuditLogType和SecAuditLog,添加以下内容:8 j# [9 s" r# }9 v5 _( h5 C
4 j2 Z6 v/ N. X9 n9 L
SecAuditLogDirMode 0777
. m2 c! G, p6 f# Y1 nSecAuditLogFileMode 0550
$ X( i, t z4 d/ f$ kSecAuditLogStorageDir /var/log/modsecurity
- D) `" Y- o; NSecAuditLogType Concurrent
( l. h- s) w4 d y; Y. P1 K+ X1 f参考文章:
. J6 w$ Z' x; X( k8 o7 I4 \8 D$ Ihttps://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#Installation_for_NGINX; g5 _! v: U6 X% ?" J
http://drops.wooyun.org/tips/2614 |
|