|
|
modsecurity原本是Apache上的一款开源waf,可以有效的增强web安全性,目前已经支持nginx和IIS,配合nginx的灵活和高效,可以打造成生产级的WAF,是保护和审核web安全的利器。
9 z* f! x, C3 \/ r6 J* V! p; z& P% e3 A+ _0 z
一.准备工作- R; ~- J. f2 i; Z; p7 s# g/ d
1 }# C2 K0 w" D: H, g, q; a系统:centos 6.5 64位、 tengine 2.1.0, modsecurity 2.8.0
1 [. i; S+ r" E4 `- t4 V. b. L' t* q6 i6 u( b. z
tengine : http://tengine.taobao.org/download/tengine-2.1.0.tar.gz
# ~! s" x7 \& ^) R: b" ~+ I
_! m& T) u( J0 H& Dmodsecurity for Nginx: https://www.modsecurity.org/tarball/2.8.0/modsecurity-2.8.0.tar.gz
/ f) m( R: g( @ Q4 z, ]; _+ S8 d
( O2 g4 _' V% C. `; l5 dOWASP规则集: https://github.com/SpiderLabs/owasp-modsecurity-crs
6 f% S7 P5 |+ B8 L
* n1 h+ x0 K8 z" n, N依赖关系:/ e3 S+ X- a. N) e x0 q
tengine(nginx)依赖: pcre 、zlib、 openssl, 这三个包centos 6.5 系统源里都有:
1 f+ K; s- {" I& ?5 I) |2 Y+ `, s, i' Z+ @4 @) `% ~
yum install zlib zlib-devel openssl openssl-devel pcre pcre-devel% k0 a* j, }! A; ?; Y: M
modsecurty依赖的包:pcre httpd-devel libxml2 apr: L7 c2 f- f% @7 D# H! I- z
. c# p I) G2 f& S$ f) |
yum install httpd-devel apr apr-util-devel apr-devel pcre pcre-devel libxml2 libxml2-devel$ D% h6 H! Y4 l5 I% p
二.启用standalone模块并编译
. c3 k% v3 U2 F2 s1 }9 ^* U/ m; H; r0 m- Z! o& B
下载modsecurity for nginx 解压,进入解压后目录执行:
) I/ L1 W3 L P; Q1 F4 m( N. b0 X' P" @4 |6 G
./autogen.sh+ W. M, }1 R& D
./configure --enable-standalone-module --disable-mlogc+ f% \6 g0 I, V2 o8 v
make
* M6 Q# T7 j4 ?+ G _三.nginx添加modsecurity模块6 Q/ L @6 w- }6 C& `& r. D
0 E* e+ i( S l( `- o在编译standalone后,nginx编译时可以通过"--add-module"添加modsecurity模块:
/ r' J* K6 D4 w) a1 k! M
- L; _* p1 N; E4 F4 ~./configure --add-module=/root/modsecurity-2.8.0/nginx/modsecurity/ --prefix=/opt/tengine$ k7 g, e# v/ j* q, ~% o( r W
make && make install
" E! B: W, q1 b* ?2 g" c四.添加规则
1 e0 i* S, }/ g5 c9 Q: x% L% z! |% ]5 T7 a! c/ G% m% w* Z
modsecurity倾向于过滤和阻止web危险,之所以强大就在于规则,OWASP提供的规则是于社区志愿者维护的,被称为核心规则CRS(corerules),规则可靠强大,当然也可以自定义规则来满足各种需求。
1 J" A! a' d; q! W- {, M/ _+ n ~) W, g: _+ h( d7 d$ }4 _
1.下载OWASP规则:/ R! x8 u. P* Z# t
3 E' Y0 Y! A/ bgit clone https://github.com/SpiderLabs/owasp-modsecurity-crs
2 K, D2 P6 j- q+ T
. J ~9 L8 V3 d0 h+ }2 L5 R3 y% f5 Zmv owasp-modsecurity-crs /opt/tengine/conf/
0 t5 f1 _8 J" t& g
2 U+ G( U+ H; Y( Scd /opt/tengine/conf/owasp-modsecurity-crs && mv modsecurity_crs_10_setup.conf.example modsecurity_crs_10_setup.conf. q9 R5 k$ z7 S2 ]7 h3 m: h
2.启用OWASP规则:
# b& E) F; |6 H, l$ x( l8 h- ^
$ n, _5 t/ e4 e1 n复制modsecurity源码目录下的modsecurity.conf-recommended和unicode.mapping到nginx的conf目录下,并将modsecurity.conf-recommended重新命名为modsecurity.conf。. t* X" b$ ?1 Y* r' U O0 n
. K" Y' I) k1 U9 n% h. g编辑modsecurity.conf 文件,将SecRuleEngine设置为 on* A# J2 i0 r1 w H% R- P3 ]
' p ]$ H& I* |- `7 F7 D; s( ?3 bowasp-modsecurity-crs下有很多存放规则的文件夹,例如base_rules、experimental_rules、optional_rules、slr_rules,里面的规则按需要启用,需要启用的规则使用Include进来即可。& [1 A7 N0 g& t$ P5 s, \3 P* } ?" X
' B4 y% }5 B& @
Include owasp-modsecurity-crs/modsecurity_crs_10_setup.conf9 z* V, P' g) v$ t! B; e! K
Include owasp-modsecurity-crs/base_rules/modsecurity_crs_41_sql_injection_attacks.conf# Q& A( K, T+ ?7 K: a- h" Q! P2 U0 u) H
Include owasp-modsecurity-crs/base_rules/modsecurity_crs_41_xss_attacks.conf
; l9 v( Y5 w/ q+ q% s, {Include owasp-modsecurity-crs/base_rules/modsecurity_crs_40_generic_attacks.conf" R F+ Y/ F+ w! K
Include owasp-modsecurity-crs/experimental_rules/modsecurity_crs_11_dos_protection.conf
9 S/ f i7 ?' X1 D. d$ v! r/ gInclude owasp-modsecurity-crs/experimental_rules/modsecurity_crs_11_brute_force.conf
0 @- E8 Y9 \! f* `& \) i- |Include owasp-modsecurity-crs/optional_rules/modsecurity_crs_16_session_hijacking.conf$ P+ Q; D8 X6 C; N
五.配置nginx
( X" j& u$ n- A$ `
; R( o3 _/ }1 z' k5 v' Z在需要启用modsecurity的主机的location下面加入下面两行即可:
* j2 Z+ ~8 `7 m" B! J0 P* C5 C# z8 E$ i) H
ModSecurityEnabled on;
# g" }. h6 d+ M/ @1 RModSecurityConfig modsecurity.conf;
* H, j" a8 f3 K下面是两个示例配置,php虚拟主机:2 e1 t6 B5 R$ B% Y% g
}6 k; x1 c3 w
server {1 Z! A! ?# ~0 O; K& X6 O
listen 80;" v" N, g/ E* }) w
server_name 52os.net www.52os.net;4 E0 P6 i: p; Y/ q- @6 f
- F% z! n7 n# c0 y( k" [
location ~ \.php$ {: S. Q1 y: ?; B: S4 ?, P5 M
ModSecurityEnabled on;
. D1 g3 {: h* L% S ModSecurityConfig modsecurity.conf;7 A |- c4 ]+ p( n$ k4 H: y
2 A$ A+ ^5 A/ k6 [) I
root /web/wordpress;
7 }. O" j8 B( A; T1 l9 ~7 O* {' \0 k index index.php index.html index.htm;6 C* D! I! _, s
- M& M. X# Q/ f8 G& W1 m8 v2 L fastcgi_pass 127.0.0.1:9000;0 j# J: w' d* ~
fastcgi_index index.php;
* W# b/ F; r2 r& ^4 T+ ` fastcgi_param SCRIPT_FILENAME $Document_root$fastcgi_script_name;
* g/ X8 T e7 b. X include fastcgi_params;# e& M8 ~ s. H% `
}7 C0 ~: k2 s$ c: ], @- K
}) ?$ d$ [+ H6 b( h0 K% U( B
upstream负载均衡:
/ t4 W. c+ X4 {* Z
! C% t5 M: U3 `- Jupstream 52os.net { o: q y* M* B+ F9 x
server 192.168.1.100:8080;
' P; \( R0 v# l server 192.168.1.101:8080 backup;
' f0 [) d A2 e3 s# p/ {; t$ [}
" M( p/ U9 X7 ^9 c. I J4 o- K5 N( x
server {
( L/ j. l0 ]# ulisten 80;, _4 I1 X4 h1 X* ?6 X0 D
server_name 52os.net www.52os.net;
( t) }5 E( j0 f
& U1 s) l L1 T6 s8 Flocation / {
3 @1 }# l" p: e' Z% I ModSecurityEnabled on;
3 u* \, W: Y( p8 r ModSecurityConfig modsecurity.conf; % e7 \: h$ p4 \2 B: R
5 k" K# U: ^6 n) Y proxy_pass http://online;( B v K9 X$ R) Q: ?
proxy_redirect off;
! _/ T& x$ I) d; D0 j: z proxy_set_header Host $host;) I1 p+ R8 m! n7 Q. t* _
proxy_set_header X-Real-IP $remote_addr;# V! N) n- B8 R. J/ P
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;. ^) f# t- o* o6 u0 c2 H
}
4 r$ y. |4 i- |; Q" E1 y}
- j! u) R/ f; X* p2 h! Y3 D六.测试" @' B5 C5 h" M. K* t- M" _' T
( `( W* w6 F2 S' @+ G8 T我们启用了xss和sql注入的过滤,不正常的请求会直接返回403。以php环境为例,新建一个phpinfo.php内容为:
8 r# v" V3 f5 `; @+ ]$ T/ w+ @2 [) m2 k+ j. B5 }8 g
<?php. B( g1 |' a! j' R G
phpinfo(); ; k) q: k$ L( G- |9 G
?>
h4 G! D6 @7 P9 U9 D* [/ b在浏览器中访问:, i2 p; O: U* u( x8 H
% R$ _9 W. |' k
http://www.52os.net/phpinfo.php?id=1 正常显示。
7 J: u6 L% Z% t: y8 vhttp://www.52os.net/phpinfo.php?id=1 and 1=1 返回403。4 p" F9 w8 M% d0 G1 j
http://www.52os.net/phpinfo.php?search=<scritp>alert('xss');</script> 返回403。
& Q1 _+ [6 Y, \说明sql注入和xss已经被过滤了
8 H( P# L: g; N
' g6 e+ |4 Z8 s( a# B- U) w2 p七、安装过程中排错
! }8 c0 P' ~0 i3 F$ ~
* W+ _+ Y" _$ I; P+ D# m/ I2 Q" s1.缺少APXS会报错5 h! N" j I2 G1 b) U0 T
1 I; T& u0 T4 C. _
configure: looking for Apache module support via DSO through APXS% R) r' j" J" E. Q
configure: error: couldn't find APXS
* ?( x, m i; |0 U) z5 Iapxs是一个为Apache HTTP服务器编译和安装扩展模块的工具,用于编译一个或多个源程序或目标代码文件为动态共享对象。& z- F3 P9 ]4 H1 L9 V# B
解决方法:% @: t1 k( z6 P' l" d- O
8 b9 b# [% Y4 c3 _$ T
yum install httpd-devel! B( K# ]3 N' v7 D& ?: q5 g( d d" s) \
2.没有pcre* d2 {5 h R, I& f, V+ ~
% U: }8 j' ^% R1 v$ l5 c- v, Z* {
configure: *** pcre library not found.
+ c* U+ t6 | Y% \& Wconfigure: error: pcre library is required8 @+ I8 G; c! @9 L. e7 ^
解决方法:* S; M2 b+ T5 [5 O2 \1 }9 p T
+ P) o+ ^- c1 }4 k! p( ?: n
yum install pcre pcre-devel/ b7 H, ^; x$ n; g* n
3.没有libxml2
: B- m0 m3 i) C8 y# e9 ?" B$ `, Q7 w }- g6 \( J
/ {4 i2 l( G+ \# T9 p
configure: *** xml library not found.0 U2 z# X0 n1 @+ L7 e
configure: error: libxml2 is required" y* U/ n* N6 |
解决方法:3 ~2 q" P: X$ ]- X
9 c# J3 A& I9 v: F U& ?4 K8 i
yum install libxml2 libxml2-devel
O+ D9 g/ Y) G; ?% c4.执行 /opt/tengine/sbin/nginx -m 时有警告
r$ |7 V3 F2 h m; ]' X- T. [! w- X* w6 Q% m; j
Tengine version: Tengine/2.1.0 (nginx/1.6.2)" X6 f9 b, z; t, o6 M5 Q
nginx: [warn] ModSecurity: Loaded APR do not match with compiled!
, | g$ ?' V: y9 a! X- K$ {/ e原因:modsecurity编译时和加载时的apr版本不一致造成的,并且会有以下error.log
. T2 x/ n( C5 b# g; }, w( B
! p. p" |0 \, @% @/ A2015/01/26 02:04:18 [notice] 29036#0: ModSecurity for nginx (STABLE)/2.8.0 () configured.1 p+ D, a' N! a Y/ u. f k2 l! Y8 a
2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: APR compiled version="1.5.0"; loaded version="1.3.9"
& w4 W( w0 u! u8 m! h# G" S2015/01/26 02:04:18 [warn] 29036#0: ModSecurity: Loaded APR do not match with compiled!% ?# z. C/ g+ w9 m; O+ x3 `
2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: PCRE compiled version="7.8 "; loaded version="7.8 2008-09-05"
$ }5 U) I, A" o. @0 g5 Q2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: LIBXML compiled version="2.7.6", F |9 a; z2 @4 B$ t0 J( w
2015/01/26 02:04:18 [notice] 29036#0: Status engine is currently disabled, enable it by set SecStatusEngine to On.
3 j( N5 b" }" z. l解决方法,移除低版本的APR (1.3.9)$ p0 D4 D6 o( n, r, }
$ ?- g+ q0 @: |' }! }yum remove apr/ G* I' f; v& ?+ c( v9 r
5.Error.log中有: Audit log: Failed to lock global mutex
* E/ o" G3 \5 L7 F/ {( _( W* I- v: T
2015/01/26 04:15:42 [error] 61610#0: [client 10.11.15.161] ModSecurity: Audit log: Failed to lock
* O& P4 f/ ]7 \- \4 hglobal mutex: Permission denied [hostname ""] [uri "/i.php"] [unique_id "AcAcAcAcAcAcAcA4DcA7AcAc"]0 [3 i- y8 ~- \; U" N0 b2 u
解决方法:
8 f# W+ W _3 }! T$ P* A( `编辑modsecurity.conf,注释掉默认的SecAuditLogType和SecAuditLog,添加以下内容:
% l' \* Y2 y9 u( h, g `# {5 n
6 w+ A2 }8 j5 X& q {# Z% oSecAuditLogDirMode 0777
7 s1 ?* B/ |; L, Q. V6 nSecAuditLogFileMode 0550
; z% T9 M; t9 x: OSecAuditLogStorageDir /var/log/modsecurity& a! b3 g2 L, o9 k; r# |
SecAuditLogType Concurrent
# h; O; N2 n1 z7 H$ y0 J3 d参考文章:
2 O( d5 S/ o2 U2 i4 mhttps://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#Installation_for_NGINX
& u# l& m4 v* Chttp://drops.wooyun.org/tips/2614 |
|