|
|
modsecurity原本是Apache上的一款开源waf,可以有效的增强web安全性,目前已经支持nginx和IIS,配合nginx的灵活和高效,可以打造成生产级的WAF,是保护和审核web安全的利器。* C! W$ B% Z0 {4 V. [
2 x6 a! v- F- b
一.准备工作
" Q- r, |6 t- o' x: U9 _6 h# ]
Y1 v' F$ x- P3 D5 h8 i6 ^系统:centos 6.5 64位、 tengine 2.1.0, modsecurity 2.8.0
" K- \1 s0 v* r: @8 F
& k; a2 f/ M4 |7 w6 w3 ptengine : http://tengine.taobao.org/download/tengine-2.1.0.tar.gz5 e/ p. r' b. Y3 z! U: l
2 m- l2 n2 u& amodsecurity for Nginx: https://www.modsecurity.org/tarball/2.8.0/modsecurity-2.8.0.tar.gz
2 J& A% `5 E3 D }! P5 v) ^4 B' Y
% A- d, r* k6 |7 UOWASP规则集: https://github.com/SpiderLabs/owasp-modsecurity-crs/ T* v* m4 A, M5 G9 N$ r" i( o
; L6 P: k6 c- f4 ]2 \% R. z& p7 V6 ^3 l
依赖关系:+ {# e5 ?6 ]1 a2 x ]- e+ z
tengine(nginx)依赖: pcre 、zlib、 openssl, 这三个包centos 6.5 系统源里都有:$ j4 l" g L6 y. C
2 ^' B0 @9 [, x) y$ A# wyum install zlib zlib-devel openssl openssl-devel pcre pcre-devel
" a- l! C7 @0 N4 i) jmodsecurty依赖的包:pcre httpd-devel libxml2 apr
9 p' M6 Z2 d/ B+ ?/ |# N: p$ g* ~$ d o9 e+ V/ w8 F3 L# j/ M$ J V# S, Z
yum install httpd-devel apr apr-util-devel apr-devel pcre pcre-devel libxml2 libxml2-devel. s0 g1 J) R' x, \: u
二.启用standalone模块并编译* J" d; Y4 Z, H; H% o& Y
6 r% N }+ h# q" H
下载modsecurity for nginx 解压,进入解压后目录执行:0 w# e/ Z/ ?$ } t0 w1 l8 J
$ \0 b* Q, Z q$ i" z0 @, T: j/ W
./autogen.sh$ h, d/ ~' l% }2 o7 k
./configure --enable-standalone-module --disable-mlogc
3 b( Z6 j t3 j7 Emake . O( U5 ^6 a M/ r' v
三.nginx添加modsecurity模块
0 r' X5 I! Y* G. q
3 T' F9 O2 ^7 }& t ^! m在编译standalone后,nginx编译时可以通过"--add-module"添加modsecurity模块:
) Q# R* |6 O9 p# _+ `
$ @ [$ @$ F, a0 U3 `./configure --add-module=/root/modsecurity-2.8.0/nginx/modsecurity/ --prefix=/opt/tengine
F$ ^+ _* b$ b' ]make && make install& @9 \6 k0 l- K* \% h9 c4 R
四.添加规则: f1 N* F2 ^9 t
/ M( W. I. }2 ]
modsecurity倾向于过滤和阻止web危险,之所以强大就在于规则,OWASP提供的规则是于社区志愿者维护的,被称为核心规则CRS(corerules),规则可靠强大,当然也可以自定义规则来满足各种需求。
8 T- g" N2 v) S5 L5 Z, D1 H! C( v
1.下载OWASP规则:9 ~0 ?- M+ }" O- Q- X5 E9 `
4 L; n' P' d! ]) I5 J( _# Z: z* e
git clone https://github.com/SpiderLabs/owasp-modsecurity-crs: ^6 _& K5 }1 [: ? i
% r( Y" ~: c1 `3 G4 S- Gmv owasp-modsecurity-crs /opt/tengine/conf/
2 R* f$ c" z' ~3 M! z o; b9 E' [3 {8 r
cd /opt/tengine/conf/owasp-modsecurity-crs && mv modsecurity_crs_10_setup.conf.example modsecurity_crs_10_setup.conf
- ^3 z8 d* a, }3 ^, K' n2.启用OWASP规则:
1 B" j e* v6 A
; E0 h' d. q& D1 R/ G复制modsecurity源码目录下的modsecurity.conf-recommended和unicode.mapping到nginx的conf目录下,并将modsecurity.conf-recommended重新命名为modsecurity.conf。
5 f, z# \; s _% M; ^! G+ r
2 q4 x+ E# B+ U' j! g' |编辑modsecurity.conf 文件,将SecRuleEngine设置为 on
' k1 a3 } S" L+ @% Q* a% @3 \: B" G! [$ B& E
owasp-modsecurity-crs下有很多存放规则的文件夹,例如base_rules、experimental_rules、optional_rules、slr_rules,里面的规则按需要启用,需要启用的规则使用Include进来即可。
: a& U+ \8 j! c+ N8 p- F
( u: o1 m" W& z6 b# l% g" u1 bInclude owasp-modsecurity-crs/modsecurity_crs_10_setup.conf2 V/ l. G1 \' ] J% R0 V( ^% Z
Include owasp-modsecurity-crs/base_rules/modsecurity_crs_41_sql_injection_attacks.conf
2 ^! Q. p+ y# v% L8 E4 `Include owasp-modsecurity-crs/base_rules/modsecurity_crs_41_xss_attacks.conf
* I8 }; E4 m3 ]/ eInclude owasp-modsecurity-crs/base_rules/modsecurity_crs_40_generic_attacks.conf) p1 F6 {! M' \# |! j
Include owasp-modsecurity-crs/experimental_rules/modsecurity_crs_11_dos_protection.conf
) J; l% t% o, J f" {5 j0 oInclude owasp-modsecurity-crs/experimental_rules/modsecurity_crs_11_brute_force.conf
/ P. o3 I; h; X- VInclude owasp-modsecurity-crs/optional_rules/modsecurity_crs_16_session_hijacking.conf
; }' N! v% [+ E+ ^& f9 i: n: G1 O五.配置nginx8 t0 w& M% O( `, u
" F( S5 g. Q% _( b1 q5 I" ?: ^% b, T. P在需要启用modsecurity的主机的location下面加入下面两行即可:
; @( ~9 o: @% G1 B% Z9 v1 R' H% E: X/ o! b {
ModSecurityEnabled on; / R" w0 {3 \3 w8 p6 x5 F3 b* B
ModSecurityConfig modsecurity.conf;
! D# N# e) C8 F. a( g3 s3 N8 i; ]下面是两个示例配置,php虚拟主机:9 e }' d: f, d8 l2 ^
% U) S) l& ^6 j8 j
server {7 P7 i1 D& h$ @7 J+ M
listen 80;1 K5 v& D: s9 u& |( {
server_name 52os.net www.52os.net;5 c J% w+ k& Z
1 z. k& V3 n; P! b! g location ~ \.php$ {
% W- y/ ]# K& t% R" [; d: } ModSecurityEnabled on;
; O$ v" X3 s, ^% V ModSecurityConfig modsecurity.conf; T* j* L2 Z4 S. e" q$ y6 X
. U' ]5 L9 V. m
root /web/wordpress;
3 x; E& g& Y7 D5 v. v' o9 M index index.php index.html index.htm;
7 N, H+ p! r- B- x: Q4 G; F) D ' i, D. y3 N% C i- K2 z5 N7 G
fastcgi_pass 127.0.0.1:9000;
: B, _: j$ h' ~ fastcgi_index index.php;# t/ e' K* e2 q# ?
fastcgi_param SCRIPT_FILENAME $Document_root$fastcgi_script_name;: j. z6 ~4 y' z5 f1 I9 _' [5 D
include fastcgi_params;9 Y6 Z; b. Y9 W/ B4 L7 N
}' W, K. P" {4 `, K
}
7 p: F& w9 y$ N5 f2 M/ I' b9 Hupstream负载均衡:# c& d9 b+ U* ^
4 ?+ ]1 i6 t7 I8 d0 tupstream 52os.net {
* k+ I. D9 O% z7 Y9 B1 e( l server 192.168.1.100:8080;# v- ~3 y2 V1 V: X! E
server 192.168.1.101:8080 backup;+ S+ X; { K. [. K9 R
}1 L( p8 w) V9 J& J! X! N
6 z& U3 Y- M! S& b8 E1 c; U( Bserver {
) s5 j/ G' i2 e: l( y. flisten 80;6 H# Q3 t+ a1 W) C
server_name 52os.net www.52os.net;
* T7 }' |& O; d/ r- k. C8 T% j9 S5 k7 u+ V$ z7 h7 {% x& p
location / {9 m8 E s' F* a+ [2 _( h( C
ModSecurityEnabled on; " `$ M9 D w4 j
ModSecurityConfig modsecurity.conf;
X& O7 `1 j, y
3 B% t$ x- t( Y( s) i, w. O( G8 e% U proxy_pass http://online;
H8 k4 L9 v+ l$ y proxy_redirect off;- [( i+ Q& C9 p" a. w
proxy_set_header Host $host;
9 p7 x9 F6 }& I& x' z proxy_set_header X-Real-IP $remote_addr;7 r7 A' Z+ X+ B- e( L+ \+ [7 v; w
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;7 [! M* U) w. z1 H
}
; F; M. l1 v% w/ Y}
U: ^* z+ h9 m! \; d+ l六.测试6 C3 s6 X$ I1 u; s; T( W# J
9 \7 Y% B2 J0 K8 R7 W, Q7 s我们启用了xss和sql注入的过滤,不正常的请求会直接返回403。以php环境为例,新建一个phpinfo.php内容为:
9 d; D* M2 |: }. b! a& f0 y z3 P y
! k% |' J& ^+ |7 m4 ?<?php
9 N* A2 s/ z, I- |6 E! T phpinfo();
8 T) G9 k: y4 z5 _3 Z' x3 ^?>
% i- E' C4 V% ~7 \* T3 C- M3 Y% u+ f& g) I在浏览器中访问:0 M+ c/ |6 R; T. ^1 |+ w! e
% n/ m# q3 n/ h* j+ n" F v* K
http://www.52os.net/phpinfo.php?id=1 正常显示。
8 E0 h0 \- \& p# N1 m; uhttp://www.52os.net/phpinfo.php?id=1 and 1=1 返回403。
/ @, [" S% i/ Y" t Ahttp://www.52os.net/phpinfo.php?search=<scritp>alert('xss');</script> 返回403。
- @. a4 ^% u9 K6 `) t8 h9 G1 l说明sql注入和xss已经被过滤了, m! z/ B( u) j. \
9 s \0 i0 C) ~5 r$ R2 \, t5 h七、安装过程中排错
1 \' U1 n* ~0 b" }
+ d; X# B2 Y; T; x4 ]9 Z' ^" \1.缺少APXS会报错
0 ]" g& B5 L4 e8 y) T! S6 c" {5 q: |9 I: Z7 i! E
configure: looking for Apache module support via DSO through APXS
' q( [% ?) F* b3 o- S% Z p: tconfigure: error: couldn't find APXS
# ]$ K' ]1 d1 J" O7 V9 J3 Tapxs是一个为Apache HTTP服务器编译和安装扩展模块的工具,用于编译一个或多个源程序或目标代码文件为动态共享对象。, ]* N, c$ F0 j; h6 o C
解决方法:" f& O9 A* c! d. d/ x
: l& l/ m$ l3 L" i1 Q) P S
yum install httpd-devel
3 a' l+ J5 T% T! l( N0 v( ^2.没有pcre! d$ ~% F% @3 j
; m# `# |; w/ d M6 a
configure: *** pcre library not found.* j. {) e. d1 w/ a; T! e1 J
configure: error: pcre library is required
( h8 Q! H0 K( W3 X; S解决方法:3 A9 z& B- O4 G% Y. v. J7 I
# Y! s: q4 s# v: Hyum install pcre pcre-devel4 V3 X1 H5 |; i
3.没有libxml2
H4 t3 K6 `# v3 y) H9 N* w% i$ X8 Y2 C2 H% U' i5 Y
5 ?" i. b& [8 t& e/ ^
configure: *** xml library not found.
, w( A, L+ @7 W/ Mconfigure: error: libxml2 is required8 W# t: b! s* p# O& M' w8 ` u
解决方法:
# ~+ q9 o3 ?2 S1 C, Z
, C: s+ o9 g3 j! {yum install libxml2 libxml2-devel3 X v$ B, a. G! D L; Z' ~( R# B
4.执行 /opt/tengine/sbin/nginx -m 时有警告
# `6 z8 T. ^4 F, k& x0 j* z' e- ^
* k% |. q6 V" C F* n, j5 L, xTengine version: Tengine/2.1.0 (nginx/1.6.2)
: y1 v3 m4 ~/ _$ a" W g; Ynginx: [warn] ModSecurity: Loaded APR do not match with compiled!
4 \; K8 O: C5 D原因:modsecurity编译时和加载时的apr版本不一致造成的,并且会有以下error.log
, L: u# M6 p+ z! V) k: f$ q8 {' x1 C2 n/ S3 u! E
2015/01/26 02:04:18 [notice] 29036#0: ModSecurity for nginx (STABLE)/2.8.0 () configured.
0 V/ C/ _. K% \. i2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: APR compiled version="1.5.0"; loaded version="1.3.9"5 a2 `% W: e& b: E
2015/01/26 02:04:18 [warn] 29036#0: ModSecurity: Loaded APR do not match with compiled!
% A! x! o/ Q7 j& H+ ?2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: PCRE compiled version="7.8 "; loaded version="7.8 2008-09-05"
( }6 L( i; n) t- F; q# g2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: LIBXML compiled version="2.7.6"0 c0 e/ x$ g# i% A+ x5 W
2015/01/26 02:04:18 [notice] 29036#0: Status engine is currently disabled, enable it by set SecStatusEngine to On.
9 X* t. E8 F' _; O解决方法,移除低版本的APR (1.3.9)- K @4 B% K% _# `
" z+ I0 Y. X, I2 t+ Y- ^/ _1 {
yum remove apr( {- T4 W6 T8 v+ p
5.Error.log中有: Audit log: Failed to lock global mutex- L* F! d5 |9 a: V% j) k& e( R
* L+ V* R% e( T8 |* y2015/01/26 04:15:42 [error] 61610#0: [client 10.11.15.161] ModSecurity: Audit log: Failed to lock / ?2 N& {! L9 h2 {
global mutex: Permission denied [hostname ""] [uri "/i.php"] [unique_id "AcAcAcAcAcAcAcA4DcA7AcAc"]0 }, p! H; A8 @3 u/ J
解决方法:
2 y, k$ ` p9 j j编辑modsecurity.conf,注释掉默认的SecAuditLogType和SecAuditLog,添加以下内容:6 G' q* ~5 p7 J. v0 Y
$ [" [! |2 a' B! R: tSecAuditLogDirMode 0777
1 Z0 J4 N# _ @/ Z# g( W$ {9 ]2 e! [$ eSecAuditLogFileMode 0550
4 d# n6 `2 O7 K# y) W8 mSecAuditLogStorageDir /var/log/modsecurity3 z2 s u/ x4 v2 U! o6 D1 a
SecAuditLogType Concurrent
6 a+ `' z7 X. Y' |9 r参考文章:
/ \0 v* J" e- ^5 ghttps://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#Installation_for_NGINX
! c& J. `$ I1 B/ @5 D Zhttp://drops.wooyun.org/tips/2614 |
|