|
|
modsecurity原本是Apache上的一款开源waf,可以有效的增强web安全性,目前已经支持nginx和IIS,配合nginx的灵活和高效,可以打造成生产级的WAF,是保护和审核web安全的利器。1 C& R" A, K& V+ ?" s
! a8 _1 Z4 h- f一.准备工作- _' I, w2 r* Y! H; `
6 ^, {8 X% z* u* D系统:centos 6.5 64位、 tengine 2.1.0, modsecurity 2.8.0
& {/ W+ R: T Q
`2 g- M, H. R& N/ ? _tengine : http://tengine.taobao.org/download/tengine-2.1.0.tar.gz! S& Z4 u: |- H# M; y/ Y" z
( P1 K# _) i% r! S8 e$ W2 z5 O. r6 `
modsecurity for Nginx: https://www.modsecurity.org/tarball/2.8.0/modsecurity-2.8.0.tar.gz1 I+ d3 s" v6 T
/ {+ G4 X: i, ~OWASP规则集: https://github.com/SpiderLabs/owasp-modsecurity-crs2 I7 [; ?( M5 \( h
+ z; d( G# h/ e
依赖关系:
7 p1 N/ N8 O% B1 w' p6 otengine(nginx)依赖: pcre 、zlib、 openssl, 这三个包centos 6.5 系统源里都有:
+ M7 _8 g7 W7 ?5 h4 K9 R3 z: O7 I- R4 R2 h. d+ r& v0 G
yum install zlib zlib-devel openssl openssl-devel pcre pcre-devel
) m8 ~1 i. o( P/ J$ Q* emodsecurty依赖的包:pcre httpd-devel libxml2 apr
( j4 j. L" D' l5 P0 W' H, N) S% o7 o! R1 m8 z
yum install httpd-devel apr apr-util-devel apr-devel pcre pcre-devel libxml2 libxml2-devel+ n% D$ w3 G0 T+ m, S ^. k) r
二.启用standalone模块并编译
x& w; S& i1 n" ^( ]: I# q% Y* H' \, Y: W+ S8 l
下载modsecurity for nginx 解压,进入解压后目录执行:: ]) _" ^& _6 h e7 o
$ V6 R7 O5 H; }% Y" I./autogen.sh
2 w+ E* B2 z0 B7 v4 F; c7 N./configure --enable-standalone-module --disable-mlogc+ ]$ D; X% j* F& }% s
make
- z! c1 f9 l1 k/ `三.nginx添加modsecurity模块. [& y) t& L2 ]" A( s
: W2 U+ U n: u: I2 [* z在编译standalone后,nginx编译时可以通过"--add-module"添加modsecurity模块:
: S" T( m S, ~% u0 U' Q# x
6 n9 C0 J* o: s./configure --add-module=/root/modsecurity-2.8.0/nginx/modsecurity/ --prefix=/opt/tengine
]( B" ]$ ^' e5 E( d7 L0 ~make && make install
, H" t6 @- F$ R& A" e- b: q四.添加规则
0 R9 ~8 w9 Q% }0 @' x& Y
! |7 V& P) a, n1 O& E9 n5 [& _; mmodsecurity倾向于过滤和阻止web危险,之所以强大就在于规则,OWASP提供的规则是于社区志愿者维护的,被称为核心规则CRS(corerules),规则可靠强大,当然也可以自定义规则来满足各种需求。
; N$ s. T K$ W2 E6 k# N; ~! `9 @3 S" H' p
1.下载OWASP规则:
; `% f3 x4 t: i+ a& d0 t, i4 g |. r& O; `7 S+ I9 T# g& F$ O& `
git clone https://github.com/SpiderLabs/owasp-modsecurity-crs
7 U: b& e; T" Y& \, t4 g$ X8 H6 D/ V
; K2 x( T9 w$ { f! I4 j6 mmv owasp-modsecurity-crs /opt/tengine/conf/2 l- P* c" M9 e( `6 _% `
- E( I- y, f$ {1 d- r
cd /opt/tengine/conf/owasp-modsecurity-crs && mv modsecurity_crs_10_setup.conf.example modsecurity_crs_10_setup.conf5 P+ r% y4 L% [+ F; \
2.启用OWASP规则:$ n5 x! j" B5 d8 }' u C- ^
9 g( h# E, l# P# ^9 Q/ u" `复制modsecurity源码目录下的modsecurity.conf-recommended和unicode.mapping到nginx的conf目录下,并将modsecurity.conf-recommended重新命名为modsecurity.conf。
2 s$ Z- {6 f9 u/ V
/ Y% g' G5 }7 }编辑modsecurity.conf 文件,将SecRuleEngine设置为 on+ q, o: M/ ?5 c+ A) s9 v
) ^* q" `7 a7 v; K9 y9 |" E* {
owasp-modsecurity-crs下有很多存放规则的文件夹,例如base_rules、experimental_rules、optional_rules、slr_rules,里面的规则按需要启用,需要启用的规则使用Include进来即可。
) u7 }2 O+ E. ?" D3 R) k0 ^; [- O% ^' X$ K3 J
Include owasp-modsecurity-crs/modsecurity_crs_10_setup.conf3 [$ @# o5 T2 j3 m
Include owasp-modsecurity-crs/base_rules/modsecurity_crs_41_sql_injection_attacks.conf
' |; j0 g* m! w9 I- L: ~9 TInclude owasp-modsecurity-crs/base_rules/modsecurity_crs_41_xss_attacks.conf6 L. |+ R; @, N5 U Q
Include owasp-modsecurity-crs/base_rules/modsecurity_crs_40_generic_attacks.conf
8 `5 I" h. M: [3 `Include owasp-modsecurity-crs/experimental_rules/modsecurity_crs_11_dos_protection.conf1 t n4 X* q6 c+ W" N
Include owasp-modsecurity-crs/experimental_rules/modsecurity_crs_11_brute_force.conf: M$ `- Q9 @8 O& q
Include owasp-modsecurity-crs/optional_rules/modsecurity_crs_16_session_hijacking.conf; L1 l3 D2 ^' a
五.配置nginx2 P j. K6 m4 R; [# H
3 B; k: f" a/ I, J1 F3 |在需要启用modsecurity的主机的location下面加入下面两行即可:
0 A% r0 G0 [' T7 Q) o' N8 C6 W* f$ I$ s
ModSecurityEnabled on;
! R/ K8 k m ?) A4 SModSecurityConfig modsecurity.conf;2 x1 l3 f7 t& Y9 k$ a0 @$ I$ J
下面是两个示例配置,php虚拟主机:
6 b7 X$ ~; w" R) K/ t# g" `: `' X0 m% J" D. C4 p
server {0 L1 e; N+ ], D. d0 t! Y
listen 80; j& Y1 o1 h3 c
server_name 52os.net www.52os.net;
1 m4 m" u6 V( N6 A
9 k5 s. E: d' Q location ~ \.php$ {
' `! a; J! f- d# b, Q7 `% p ModSecurityEnabled on; 4 E, {; v% B5 N8 n/ n) q0 D3 a
ModSecurityConfig modsecurity.conf;6 y6 {7 p* r1 P& F3 @& b- R0 c
9 B n8 r0 H/ W6 u4 h! h root /web/wordpress;9 L8 `$ J: \# T1 c' Y9 B$ C1 Q0 Q
index index.php index.html index.htm;: T; L& W7 s0 E5 C
/ a3 g' ~) Q- r. `, @; b! e, R6 Q4 A
fastcgi_pass 127.0.0.1:9000;- j+ b" V. S6 f4 i
fastcgi_index index.php;2 c3 t6 L/ D. x
fastcgi_param SCRIPT_FILENAME $Document_root$fastcgi_script_name;! v& h: N, E0 O3 ]% l% ~ |
include fastcgi_params;5 c; j" n9 C: E
}
" y; w6 q+ d/ t6 ]7 G }, N7 w/ I; m' F3 i
upstream负载均衡:
1 T/ q# ~/ n( R: [( A3 R- X. n; O# n1 v% s3 }
upstream 52os.net {* B+ J2 h* ?8 o! z# |& i
server 192.168.1.100:8080;
. p- u5 ]; B8 X/ W server 192.168.1.101:8080 backup;8 T; M1 R& T4 J( f& i& D" J( n
}
, ~; m! u$ B3 t: Z! j/ q! z& `1 P/ d7 Y
5 g1 c' B0 m, q/ `1 l2 Kserver {
7 i; W1 t# Y+ l2 C) v7 ~listen 80;
. V( @; }9 m1 d; B9 Lserver_name 52os.net www.52os.net;+ }, l# @0 J, W& N
( A2 @0 Q% P$ X, |! u1 W2 }
location / {; K8 s; o$ q3 P. ?7 {: K' C4 z
ModSecurityEnabled on; ) r8 G6 Y* ^" ^9 z+ M. ^
ModSecurityConfig modsecurity.conf;
: z3 x& P& G9 d( U6 H' d) H: h; a: X9 ?& t2 Z
proxy_pass http://online;0 z; ]2 e8 L; S; F
proxy_redirect off;6 Z7 P- z4 G3 Z6 w k% p
proxy_set_header Host $host;
5 Z3 @) c/ @. g* z proxy_set_header X-Real-IP $remote_addr;; B+ Y4 A1 i7 R- o2 w; j' i
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;; h0 C; z5 O: [/ ~; \
}* g6 M( `, P& A ^1 d9 ]! h J5 U
}
# F4 e V8 y# B六.测试0 p P! B/ l D6 a- \" r0 d; _
* y/ Q3 V; k Y: ^. c2 j8 [3 ]
我们启用了xss和sql注入的过滤,不正常的请求会直接返回403。以php环境为例,新建一个phpinfo.php内容为:' _; X9 l' J2 t0 i0 W
1 z* u3 X9 E- g: B( v( _<?php
. o2 r; C2 Z1 ?: V* z4 t+ j8 { phpinfo(); , ?8 M1 \# y) X8 B8 }/ V
?>
- k9 G- I& \/ a0 _! B在浏览器中访问:
! H! E R7 e' S: F3 G% `% y4 A3 O( M+ Y, N) A3 h5 |9 j
http://www.52os.net/phpinfo.php?id=1 正常显示。. W5 t6 i- d# v5 ^
http://www.52os.net/phpinfo.php?id=1 and 1=1 返回403。
( { R8 J- {1 d3 Y* v( _- a2 Ohttp://www.52os.net/phpinfo.php?search=<scritp>alert('xss');</script> 返回403。
- J2 A( K3 m+ v说明sql注入和xss已经被过滤了1 j: W. [( C, m3 a% w- V
2 ]. e6 A! q: M9 j! W
七、安装过程中排错
4 U( h6 u4 W n# I0 j+ y3 I* t$ k
4 c! s7 d" O* X1.缺少APXS会报错
% F5 d$ D$ Z, }9 Z7 @+ n; l0 Q, m4 U4 \, N. N6 W5 D: t: E- o
configure: looking for Apache module support via DSO through APXS
9 C1 V! w7 q) Oconfigure: error: couldn't find APXS) _ e- U: A( g9 ]' l7 K; e
apxs是一个为Apache HTTP服务器编译和安装扩展模块的工具,用于编译一个或多个源程序或目标代码文件为动态共享对象。! a8 y% p! f+ Z2 \+ t: f* l" R
解决方法:0 x0 |9 k( k, X3 v+ b( |
, S s, H* G9 k5 U5 h/ {/ tyum install httpd-devel9 A; [ F5 g' o8 e9 G+ i
2.没有pcre
: k1 X" m5 T7 B e! y/ W
_0 u' S) S: q- aconfigure: *** pcre library not found.
* Z+ V( u4 v R! |, c% f# F# ~configure: error: pcre library is required) q, A7 G0 P' g: {! F
解决方法:
3 Y& Q3 G7 x; P$ a" ?! K S" ?, n, f3 F3 Y7 M0 Y* ^
yum install pcre pcre-devel
" @8 T+ O3 O5 i! ]1 z3.没有libxml2
7 x3 q- D9 \ C& o1 R/ o, ~; O- L+ b s9 ~0 n+ j) G/ ^7 O( o
# o6 Q' ^7 T; {) p; p
configure: *** xml library not found.
; H1 F4 h" e+ @$ A, y8 Iconfigure: error: libxml2 is required$ `& s- z A% F9 o0 \
解决方法:
5 T" N; ^& {. O6 A/ ^' X- T$ l) t- X: j% i2 b! o" s& J
yum install libxml2 libxml2-devel5 s: I S* Q2 q/ T, z$ F
4.执行 /opt/tengine/sbin/nginx -m 时有警告
; d, U; e) N" e5 Y: ~! Q1 y4 C! Z; r. x Q& C' D
Tengine version: Tengine/2.1.0 (nginx/1.6.2)) Q" {5 V/ M9 z2 ?
nginx: [warn] ModSecurity: Loaded APR do not match with compiled!
; L* r3 U4 `! b7 j! {$ i; E* k- U) S) C原因:modsecurity编译时和加载时的apr版本不一致造成的,并且会有以下error.log5 `2 G8 \3 r8 \5 P- d+ O
' N a( V0 ^ X
2015/01/26 02:04:18 [notice] 29036#0: ModSecurity for nginx (STABLE)/2.8.0 () configured.
6 v- K% E5 |; v/ A2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: APR compiled version="1.5.0"; loaded version="1.3.9"4 `0 R; |! b8 V$ g, d# b* W* s& K" u
2015/01/26 02:04:18 [warn] 29036#0: ModSecurity: Loaded APR do not match with compiled!5 n+ {3 j& p1 n$ G. C
2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: PCRE compiled version="7.8 "; loaded version="7.8 2008-09-05"
) k0 m$ f' b! S9 o2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: LIBXML compiled version="2.7.6"
0 _! d" j0 [& E2 @. C4 g5 w3 f2015/01/26 02:04:18 [notice] 29036#0: Status engine is currently disabled, enable it by set SecStatusEngine to On.
! s* }+ Z& \% x9 R A! W3 n% v5 `解决方法,移除低版本的APR (1.3.9)1 s# W1 G6 W7 o7 R; ~5 \
: i" q8 e f9 k0 G' f7 ~: Z& B! X
yum remove apr0 {5 U% A) i, k9 x3 n' N
5.Error.log中有: Audit log: Failed to lock global mutex
3 I' `: _; j; _( k. ]5 V" w% |6 i- N9 F( u! ~: F
2015/01/26 04:15:42 [error] 61610#0: [client 10.11.15.161] ModSecurity: Audit log: Failed to lock
1 Z8 ?; U3 J) `8 \global mutex: Permission denied [hostname ""] [uri "/i.php"] [unique_id "AcAcAcAcAcAcAcA4DcA7AcAc"]
# s( q" p, s8 b7 G解决方法:8 l2 K" |/ ~( {1 Y. \5 y
编辑modsecurity.conf,注释掉默认的SecAuditLogType和SecAuditLog,添加以下内容:
. l: T3 b; [9 }" a8 @2 T. _) u2 E3 J; E, R* ~* V* ]. V( e& U( X4 r9 R
SecAuditLogDirMode 0777
7 a" L4 t0 `) _9 P% _- fSecAuditLogFileMode 0550, t4 W; k" x4 Q: m: f( i
SecAuditLogStorageDir /var/log/modsecurity
- S& N2 Y9 y" W7 j* T4 g1 O+ E7 {SecAuditLogType Concurrent
- ]6 F+ W: H) {参考文章:
( ?7 S! E. F: r* [$ |https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#Installation_for_NGINX
: J' p2 ^/ J! g0 p6 C: v- Fhttp://drops.wooyun.org/tips/2614 |
|