|
|
modsecurity原本是Apache上的一款开源waf,可以有效的增强web安全性,目前已经支持nginx和IIS,配合nginx的灵活和高效,可以打造成生产级的WAF,是保护和审核web安全的利器。0 v8 z# U* P' J1 M; D
* I. J% S/ k1 l4 g* r8 g1 {" N一.准备工作. |- y" Y% r7 S# l$ N, t" B! h
6 V5 g5 N) Z2 V7 A; o" ?
系统:centos 6.5 64位、 tengine 2.1.0, modsecurity 2.8.0
7 F) j# a* o- f+ E2 v! A1 c
) ]. h- C% n' ` Z& Htengine : http://tengine.taobao.org/download/tengine-2.1.0.tar.gz- C. ?' w* I, F$ R9 y! B
C9 X7 [. D4 L% Cmodsecurity for Nginx: https://www.modsecurity.org/tarball/2.8.0/modsecurity-2.8.0.tar.gz$ l: B# L* ]+ l% X! i& K F
2 k* R3 y/ E5 p2 G+ ^# Y* \
OWASP规则集: https://github.com/SpiderLabs/owasp-modsecurity-crs
0 b( F( P) z% g3 s
+ |5 j) \/ ?" q4 s6 S, ]3 I依赖关系:
" q3 ?. N5 o6 U3 [7 A- \: Ztengine(nginx)依赖: pcre 、zlib、 openssl, 这三个包centos 6.5 系统源里都有:7 c% t; n' r- E+ V0 @( ]
; R$ D& w, v' h8 vyum install zlib zlib-devel openssl openssl-devel pcre pcre-devel
9 Y* b" K+ }, M/ [modsecurty依赖的包:pcre httpd-devel libxml2 apr
6 m# R D% Q! M7 @& G6 n; T
2 G$ Y% `8 M* e' vyum install httpd-devel apr apr-util-devel apr-devel pcre pcre-devel libxml2 libxml2-devel" i( e# l. @' s9 {/ n) l3 }
二.启用standalone模块并编译
4 w q+ S* m* T7 \
$ ~0 x/ v$ \& h' }下载modsecurity for nginx 解压,进入解压后目录执行:& V5 L4 L C S/ O, w! k. v
2 h- Q- w/ |: n; F./autogen.sh
9 T, g! f, X% c./configure --enable-standalone-module --disable-mlogc
/ e4 _; ]( l8 o& x: R% N lmake
2 ]9 l9 L3 `5 W- q0 b三.nginx添加modsecurity模块2 T- p. s, T: S- B/ b" S
, M* W W( p( l/ x+ c在编译standalone后,nginx编译时可以通过"--add-module"添加modsecurity模块:" v0 M' D. E- E& n8 F
+ T4 m; d9 ^! x$ a
./configure --add-module=/root/modsecurity-2.8.0/nginx/modsecurity/ --prefix=/opt/tengine9 Z# ]7 F: n/ _0 C3 ?% \: h8 [; S
make && make install0 g7 ?5 o! D9 P" w
四.添加规则
# g/ [, y3 p2 s$ n3 P3 Z% |. \0 m; q, T* {1 p
modsecurity倾向于过滤和阻止web危险,之所以强大就在于规则,OWASP提供的规则是于社区志愿者维护的,被称为核心规则CRS(corerules),规则可靠强大,当然也可以自定义规则来满足各种需求。
8 J2 w V6 l E8 |. |- E, l% v. I/ N* k/ i4 z+ o
1.下载OWASP规则:1 B9 F# P# V5 H' M% N
( W7 f4 d0 U! l" k \, c
git clone https://github.com/SpiderLabs/owasp-modsecurity-crs
( v i! ?' M- w3 j i* ]! S- k, K1 K
mv owasp-modsecurity-crs /opt/tengine/conf/
( R6 G% i4 H* S1 s' d% u
8 w' _9 W$ r. ~- ?cd /opt/tengine/conf/owasp-modsecurity-crs && mv modsecurity_crs_10_setup.conf.example modsecurity_crs_10_setup.conf
6 I; {$ T/ k# }/ c# ?0 m. R; F2.启用OWASP规则: i% `0 Y5 \. {) j- g( g& w) e7 @
/ X9 a* v$ n: l, d9 W/ H* v
复制modsecurity源码目录下的modsecurity.conf-recommended和unicode.mapping到nginx的conf目录下,并将modsecurity.conf-recommended重新命名为modsecurity.conf。% k5 d! g5 `- v/ Z: l. C& N
( P O3 |8 b* _1 O/ H# X4 I6 ?编辑modsecurity.conf 文件,将SecRuleEngine设置为 on9 f9 d' T, u( p& \& N
, G3 O( h( f! a4 D6 w$ N8 _, O" cowasp-modsecurity-crs下有很多存放规则的文件夹,例如base_rules、experimental_rules、optional_rules、slr_rules,里面的规则按需要启用,需要启用的规则使用Include进来即可。
9 A$ w8 q0 t/ s$ I2 j9 ^" V) Y% o7 J! E
Include owasp-modsecurity-crs/modsecurity_crs_10_setup.conf! R2 x; ?0 C7 D8 ^
Include owasp-modsecurity-crs/base_rules/modsecurity_crs_41_sql_injection_attacks.conf. ~ i4 w* g7 U6 C
Include owasp-modsecurity-crs/base_rules/modsecurity_crs_41_xss_attacks.conf8 [, X2 d8 S3 ~$ M: I: |( S
Include owasp-modsecurity-crs/base_rules/modsecurity_crs_40_generic_attacks.conf
, a' f2 H; @' i" Q d' x1 nInclude owasp-modsecurity-crs/experimental_rules/modsecurity_crs_11_dos_protection.conf; _& x5 p. c' A- z; r
Include owasp-modsecurity-crs/experimental_rules/modsecurity_crs_11_brute_force.conf
e0 D) e) Q" X1 |% p- d- SInclude owasp-modsecurity-crs/optional_rules/modsecurity_crs_16_session_hijacking.conf
# J/ g# D6 v2 V2 M$ _五.配置nginx% h7 O0 s6 `5 L: f- X& @
3 o7 v# J; `0 U在需要启用modsecurity的主机的location下面加入下面两行即可:( C6 Q# r* l, \ ~; t3 u4 u
; W& j3 c6 X: J5 ~* Y
ModSecurityEnabled on; ( v+ j" u0 t& E- m( q! p; H
ModSecurityConfig modsecurity.conf;) |" ^; a4 d1 a! _1 W- Q) K- N
下面是两个示例配置,php虚拟主机:+ j( Y. c' }# r& P2 O+ A
; l0 G$ f4 L/ d0 H; Wserver {
6 k0 S F; S& p& } listen 80;
0 I2 J$ c0 |3 l" A server_name 52os.net www.52os.net;- n* z" ?# N4 N/ Y9 w0 z" _+ Z% b
- _) |# U- e) z2 r6 S
location ~ \.php$ {
: a; ?% G$ e- X* v ModSecurityEnabled on; 4 ~7 V; y2 E, |" e% D6 D- a7 O {* I
ModSecurityConfig modsecurity.conf;6 ]* }- V# Q% r9 T
% {" H5 E5 U- y" j# D
root /web/wordpress;
0 j$ }. V: \8 n9 ^1 B: W index index.php index.html index.htm;6 L# f$ H* M% `& Q+ w
& Q. S, a% @; Z" M, T- |
fastcgi_pass 127.0.0.1:9000;
; b4 g- x2 c% h5 t, ~, n fastcgi_index index.php;
, e! Z# W8 L$ d, E2 j- u fastcgi_param SCRIPT_FILENAME $Document_root$fastcgi_script_name;" |! Y7 r2 r3 J6 I* `& i8 |
include fastcgi_params;
9 U; M- f6 k+ h9 g }
$ d, f3 y* G) m* Y. C. N0 E/ m }
+ i/ `: P3 ^1 O z7 s& s1 hupstream负载均衡:( b/ S* A* J" N/ s0 y: J
B; f6 P# F) j" m& D6 M# M: @" aupstream 52os.net {
5 ]! R" u! |. m server 192.168.1.100:8080;
0 ]( P" n- d$ A* o$ b server 192.168.1.101:8080 backup;+ A1 m% T) |& J; f0 x$ `; Q8 u) d# O
}
( U3 T! H4 p+ z4 w9 x. l* k5 x/ s' }; b+ f' j
server {
7 O' ]/ `1 W6 i$ w8 H& O6 G8 p1 xlisten 80;
; |* A, O& x- O9 \. j0 Hserver_name 52os.net www.52os.net;
- }# G. g6 D6 F) \1 |: J9 w+ ^. T8 |/ I, w3 c/ L
location / {) x X+ N1 w) k V6 G
ModSecurityEnabled on;
% u3 D, g7 a8 K& ^5 c ModSecurityConfig modsecurity.conf;
, y' j, e& O1 S% q5 F0 r' S) X1 F% r( U2 n# E$ W
proxy_pass http://online;
; M \0 h% v5 v4 Z! E proxy_redirect off;! P+ y* Q9 A( t$ g& c; i3 b5 e* c
proxy_set_header Host $host;
% z, O- Z1 p' y9 \3 h! _( i proxy_set_header X-Real-IP $remote_addr;
; O* u4 s$ O1 l5 j! W9 O/ U proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; J! j0 d6 X) s% K' q6 C/ }' \
}
" T7 D( o" B! E( O}
" n$ |: X. o2 i- x/ w# k六.测试
2 Q- x: |' ?' u- X" J2 Q% q
% V& b+ [ C: [# T- O6 X7 V我们启用了xss和sql注入的过滤,不正常的请求会直接返回403。以php环境为例,新建一个phpinfo.php内容为:- D/ d6 q% M. v: n
8 v/ x, o" o! ^" D' K) w
<?php: o2 x: N2 W% Q Y6 P+ v
phpinfo(); * A: ?$ @( t" J0 U6 X/ e" N
?>
- }( D+ N2 _; l% n: c$ m |在浏览器中访问:* C7 ?# W6 q* b8 U9 R1 D& j
! h$ L8 S% V1 zhttp://www.52os.net/phpinfo.php?id=1 正常显示。4 {4 A, }' N* L9 U
http://www.52os.net/phpinfo.php?id=1 and 1=1 返回403。
5 R) a9 F- Y+ I& D7 v+ N! Yhttp://www.52os.net/phpinfo.php?search=<scritp>alert('xss');</script> 返回403。: x. I7 } Z6 Z( z5 ]
说明sql注入和xss已经被过滤了
e3 Z) ~ @6 R$ _# L, ]9 c) q/ w
: b. p1 y# D9 w4 \. }1 A/ L七、安装过程中排错
9 j" C9 o, X% j8 i5 G$ o6 T& k1 ~3 } }9 D
1.缺少APXS会报错
6 k2 y! c0 ~) z/ v
1 v2 m3 @$ K. xconfigure: looking for Apache module support via DSO through APXS8 e$ w- }! D, z$ b8 ~2 [) L/ }& y
configure: error: couldn't find APXS: Z& r" s/ d$ V) L
apxs是一个为Apache HTTP服务器编译和安装扩展模块的工具,用于编译一个或多个源程序或目标代码文件为动态共享对象。
* {+ V" A. x3 d6 \7 y- ~解决方法:. s" b L7 G, ~" m5 s
$ e N! Z& n$ R' a! d
yum install httpd-devel
% [) ?: j% ^! [4 V2.没有pcre
3 j" D" R8 T u4 s
* V/ u7 V1 X, P6 Yconfigure: *** pcre library not found.
3 X8 |0 B! {3 fconfigure: error: pcre library is required% [! s$ P* r5 w3 j0 z+ H! h/ A7 e2 x" b
解决方法:/ I9 J: |; [. P& f; k& v/ w! Z! w
$ B/ I9 G( ]+ Y' I/ j
yum install pcre pcre-devel
9 C7 x% ]$ t6 k, }; d3.没有libxml2, I0 l1 D/ r$ @/ e3 L& B$ Z
$ `1 z$ }9 e5 A1 F7 @* A" z* q' `
/ Y% d% v9 M, ?0 @
configure: *** xml library not found.8 K1 n H, g$ q( L0 {) f9 U' _) r1 B$ z
configure: error: libxml2 is required, d6 W& x! e. O% ~/ d P$ J
解决方法:
% i5 I2 |, ^5 e x+ }) W
. [- R% c5 f& r# ?6 i% hyum install libxml2 libxml2-devel
4 w7 r7 ]( h4 I5 Z( I! {, L4.执行 /opt/tengine/sbin/nginx -m 时有警告
' L+ c* {; s4 l9 g- y/ w$ \5 W8 q2 G& b: ~2 e( r
Tengine version: Tengine/2.1.0 (nginx/1.6.2): I, j$ g1 H$ d. `4 C
nginx: [warn] ModSecurity: Loaded APR do not match with compiled!4 Q' x, V/ i: n, S* q* i4 r$ n
原因:modsecurity编译时和加载时的apr版本不一致造成的,并且会有以下error.log
) O$ H( M2 X: I$ e8 F/ Z' L
1 M( B& U) ]/ K2015/01/26 02:04:18 [notice] 29036#0: ModSecurity for nginx (STABLE)/2.8.0 () configured.
! U4 ]* x5 Q" X) D2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: APR compiled version="1.5.0"; loaded version="1.3.9"
6 S) B) S9 K# a% M1 e- ]2015/01/26 02:04:18 [warn] 29036#0: ModSecurity: Loaded APR do not match with compiled!
& D6 ^2 _0 D' e. q- s( m2 ^- Y8 g2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: PCRE compiled version="7.8 "; loaded version="7.8 2008-09-05"
$ g- O8 O: ]2 C! g2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: LIBXML compiled version="2.7.6"1 V1 |. V9 ~- y* |& O3 s: b
2015/01/26 02:04:18 [notice] 29036#0: Status engine is currently disabled, enable it by set SecStatusEngine to On.
1 U/ q" W: D, J4 O8 l解决方法,移除低版本的APR (1.3.9)6 r$ M# {2 @3 G/ |0 b
3 f; G8 l" B2 w J
yum remove apr
! |$ X+ Z( s6 F5.Error.log中有: Audit log: Failed to lock global mutex* V: [5 E# a' y& z$ ^4 o
4 i) X m2 ^) G1 D8 D8 q2015/01/26 04:15:42 [error] 61610#0: [client 10.11.15.161] ModSecurity: Audit log: Failed to lock - s1 U- O! T6 M) n
global mutex: Permission denied [hostname ""] [uri "/i.php"] [unique_id "AcAcAcAcAcAcAcA4DcA7AcAc"]
3 R7 W/ @. d% N5 q解决方法:7 A7 o& x! `! [/ x) W- L) N
编辑modsecurity.conf,注释掉默认的SecAuditLogType和SecAuditLog,添加以下内容:* f! h1 N% V; N7 u
6 p& U) V3 s3 h( nSecAuditLogDirMode 07778 |) ]) N7 Q0 e5 v8 v
SecAuditLogFileMode 0550
! g; g6 y3 Z ?: i+ oSecAuditLogStorageDir /var/log/modsecurity4 c* {6 T* }# q' }' V$ s
SecAuditLogType Concurrent
9 M4 k- Z8 O9 `9 z参考文章:
, C4 H! N, y0 B l3 ~7 S. G4 {https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#Installation_for_NGINX, m% i2 B6 e( f7 Q- N! N
http://drops.wooyun.org/tips/2614 |
|