|
|
modsecurity原本是Apache上的一款开源waf,可以有效的增强web安全性,目前已经支持nginx和IIS,配合nginx的灵活和高效,可以打造成生产级的WAF,是保护和审核web安全的利器。% Q9 L3 w" C: N: h
6 O. R$ ]& L& A- g4 k
一.准备工作
3 H- q, h- M; p/ [2 `8 g
# W; Q7 ^' Z, Q: N% `: s系统:centos 6.5 64位、 tengine 2.1.0, modsecurity 2.8.0
: N% O0 h9 P' r9 e. t* f- D
9 a: T& i* P2 J/ k( Gtengine : http://tengine.taobao.org/download/tengine-2.1.0.tar.gz: X6 m4 {' P2 ?' p7 l) z& [) w
" X) G, @' h- ]$ N
modsecurity for Nginx: https://www.modsecurity.org/tarball/2.8.0/modsecurity-2.8.0.tar.gz/ N6 N2 U$ p; k4 z" P% x$ J# z
( v" r0 L) \0 {& i( e8 H; n0 t' ^OWASP规则集: https://github.com/SpiderLabs/owasp-modsecurity-crs
( Y/ k) C6 R; T9 l Z
% V) n+ r* [( ^9 x* w7 s$ H依赖关系:: z- z" Y' S2 c+ I/ ~$ H
tengine(nginx)依赖: pcre 、zlib、 openssl, 这三个包centos 6.5 系统源里都有:
% r/ A" U2 n( C6 w3 B$ r3 }) V' [
+ r% O; f0 ~6 Kyum install zlib zlib-devel openssl openssl-devel pcre pcre-devel* q; m1 G# l* k- W$ S6 O) e" I
modsecurty依赖的包:pcre httpd-devel libxml2 apr
' K2 M$ D# J' i+ s8 D$ m0 u+ C6 [( `8 Q5 h) {7 z3 ^6 x p/ W
yum install httpd-devel apr apr-util-devel apr-devel pcre pcre-devel libxml2 libxml2-devel
: P8 O5 z l/ a* u8 O9 Q" ^; M- m二.启用standalone模块并编译( C' f, w* f/ h
, e* M( A( M( p下载modsecurity for nginx 解压,进入解压后目录执行:2 D5 Y2 j' l2 \5 ^+ Q
2 q% M3 R; Z$ y./autogen.sh
! R: `) t8 `! }2 Y2 h* l2 g./configure --enable-standalone-module --disable-mlogc
) {2 ]3 I1 C$ U: ]' t+ C4 A, @make 7 i2 x& a3 {6 z3 g: p# ]4 t/ z5 t
三.nginx添加modsecurity模块" E( p1 S$ b! v0 c+ [- v4 ?" v9 U9 r
6 @5 d! E4 _6 z6 o$ P1 j: ^, B
在编译standalone后,nginx编译时可以通过"--add-module"添加modsecurity模块:
( \/ E5 ^: d3 Y
: j% d! H5 V, y/ G( @./configure --add-module=/root/modsecurity-2.8.0/nginx/modsecurity/ --prefix=/opt/tengine
( x* W3 e B& F3 a3 Amake && make install
7 [6 \2 c& `& V p6 z7 ]' o& L四.添加规则
% W& a+ c# U1 k2 A$ \ K4 _* o: g( k5 M5 |2 h; g
modsecurity倾向于过滤和阻止web危险,之所以强大就在于规则,OWASP提供的规则是于社区志愿者维护的,被称为核心规则CRS(corerules),规则可靠强大,当然也可以自定义规则来满足各种需求。
8 Q {/ n9 P5 p% T$ C6 ]2 u4 J4 M* v: a
1.下载OWASP规则:
8 [: g. t1 j0 p" y3 \8 y, O; x8 l
# A8 f# h% U) ~/ s3 tgit clone https://github.com/SpiderLabs/owasp-modsecurity-crs
, h& a* a% l6 {0 j% ~; w* P" o& N2 d( }1 U' e$ j
mv owasp-modsecurity-crs /opt/tengine/conf/
, J+ @! h4 _# h) w
. @: g' Y$ L) p6 Scd /opt/tengine/conf/owasp-modsecurity-crs && mv modsecurity_crs_10_setup.conf.example modsecurity_crs_10_setup.conf0 @. l( Z' B) E% j: b
2.启用OWASP规则:
5 W- K/ o6 B( V% N3 |: m* \* r1 C8 {( G
复制modsecurity源码目录下的modsecurity.conf-recommended和unicode.mapping到nginx的conf目录下,并将modsecurity.conf-recommended重新命名为modsecurity.conf。0 B& _( I, p Q z K
% `! ^1 c7 o7 w* R. z
编辑modsecurity.conf 文件,将SecRuleEngine设置为 on
- Z7 [/ K' g3 M( |1 ]3 n: e
5 t2 M$ h0 o5 D& g% Lowasp-modsecurity-crs下有很多存放规则的文件夹,例如base_rules、experimental_rules、optional_rules、slr_rules,里面的规则按需要启用,需要启用的规则使用Include进来即可。
: y+ F/ A8 P1 F8 }6 I5 S/ a3 O! f( h- K$ i! K, @# k
Include owasp-modsecurity-crs/modsecurity_crs_10_setup.conf
) Q$ q' c" d cInclude owasp-modsecurity-crs/base_rules/modsecurity_crs_41_sql_injection_attacks.conf
' |8 Y" U6 z! `# s, v' AInclude owasp-modsecurity-crs/base_rules/modsecurity_crs_41_xss_attacks.conf
3 v% l% P7 A! y( X: I c3 A( f& WInclude owasp-modsecurity-crs/base_rules/modsecurity_crs_40_generic_attacks.conf
, Z4 w9 u$ P" q) q! K/ WInclude owasp-modsecurity-crs/experimental_rules/modsecurity_crs_11_dos_protection.conf a1 a2 t b, Q$ {7 I& B& M! `! B/ {
Include owasp-modsecurity-crs/experimental_rules/modsecurity_crs_11_brute_force.conf
' ]8 M; a3 Q4 q9 CInclude owasp-modsecurity-crs/optional_rules/modsecurity_crs_16_session_hijacking.conf
$ k2 {+ n2 `+ q0 v( e五.配置nginx
0 ?" p& U- N9 [* _3 ]8 @5 d8 x8 D& A0 N* T+ ^
在需要启用modsecurity的主机的location下面加入下面两行即可:
. y& E, u7 d& \/ s' J& C7 L- e4 O" [
ModSecurityEnabled on;
5 j# D% w% W: QModSecurityConfig modsecurity.conf;
- s' [% g1 b5 O* U7 j3 Q/ |下面是两个示例配置,php虚拟主机:' x1 w2 b# n& [0 x2 b$ i
5 V& @/ a9 ?! S: w! Z
server {) R, o! e" ? Q% I8 [) Q5 O0 `
listen 80;
9 p, y, y5 P' U5 s5 } server_name 52os.net www.52os.net;6 ~" n( w' P4 G1 @! y! v
# ?: ]9 V) e$ o location ~ \.php$ {
7 M- z5 v+ P, k1 [; `- ? \ ModSecurityEnabled on; - o V+ }. L% E0 H
ModSecurityConfig modsecurity.conf;
0 k3 ~; ]% s0 c: b
& I/ e/ G1 U" M, H2 h root /web/wordpress;% z% n7 S- c" @/ e
index index.php index.html index.htm;
- M5 b: }9 C3 j
( D; C% Z/ P; k$ M: T3 c5 I$ D' ]" P) k fastcgi_pass 127.0.0.1:9000;
r! L: G2 f0 C! I# W3 d/ l fastcgi_index index.php;
1 u; L: [8 l: L1 V/ \ fastcgi_param SCRIPT_FILENAME $Document_root$fastcgi_script_name;7 Z/ S9 f: t. I9 J' l4 U( E
include fastcgi_params;, z9 n: c) c* B& M/ d2 G' X6 j
}$ Y( i0 f# D7 Y' [8 d6 H
}# h1 _( e6 s$ z. k" o) l, F9 M
upstream负载均衡:. N! i( v6 \7 c: a/ ~
3 \) ~9 ^) ]8 @. B/ iupstream 52os.net {( E7 I5 B2 A% t9 E9 }# Y6 d) c
server 192.168.1.100:8080;
5 y3 p% I+ ]5 J% Q! B0 U/ ^- | server 192.168.1.101:8080 backup;% Y0 P& e. \/ }7 R# g
}
6 ~! n! [# n+ C/ {& b0 c G9 Y5 m( |1 S6 c5 v q
server {
3 ^' z" N( }! Z' I' clisten 80;( A8 e1 Y6 c+ Q3 a* @
server_name 52os.net www.52os.net;: @ f4 b4 u) B) W* B% P/ H
4 q# I2 i) R+ F7 d* |6 b
location / {
5 {5 _- K9 T- h+ T; E. ], k ModSecurityEnabled on;
" [' K" D7 w/ H. g8 t V4 l ModSecurityConfig modsecurity.conf; 1 c! u( c: w. Q
4 F, y& t+ S! h proxy_pass http://online;
' [; H! n+ i2 p! \% p7 ` proxy_redirect off;
6 p- Q. ^6 L7 u6 j. p proxy_set_header Host $host;
/ b |% \9 k2 n" c9 p; r5 X proxy_set_header X-Real-IP $remote_addr;
2 ]9 z" t$ l+ { M& T1 J proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
1 X7 ?# w- m* L) |, b, Y8 q/ { }
1 q8 X# x+ s; R" Q2 V8 X}
# p$ _; n4 `5 q. |! k: H六.测试
: }" ]0 B0 e: c, v/ U9 U7 U" r7 d1 t K0 V- n8 |# v- c* ^
我们启用了xss和sql注入的过滤,不正常的请求会直接返回403。以php环境为例,新建一个phpinfo.php内容为:8 f6 a1 [4 M! v! u! _3 A
# a4 [; b6 V- X% \
<?php& {9 _' c0 u0 _+ u
phpinfo(); , }5 t+ e6 ~7 \9 J, `# d
?>6 \; o+ i& Q. N; S1 y# n
在浏览器中访问:
( @ |# {) W6 s( ^+ k$ B% a. n) t0 Q) T
http://www.52os.net/phpinfo.php?id=1 正常显示。
6 |6 s* G3 q- c+ i8 ^$ }( {- Ahttp://www.52os.net/phpinfo.php?id=1 and 1=1 返回403。% P6 ~0 B/ d; f& ?* Y8 ]) S
http://www.52os.net/phpinfo.php?search=<scritp>alert('xss');</script> 返回403。
) J: Y0 t% f. v: T2 F说明sql注入和xss已经被过滤了
4 A, A& i5 x* T+ B& X! W
; W7 c, ]# B( b- ?$ B" K七、安装过程中排错* p* P. i. F% o; ?7 F" \9 y
1 d: e0 `! V* D% n! R! Y( S; K. L1.缺少APXS会报错
% t8 {- k6 s' _) ~1 w6 z9 |% H$ ~" F2 O& {+ |% V
configure: looking for Apache module support via DSO through APXS
$ \( Z! \% F$ {! D+ ~) c0 G1 V gconfigure: error: couldn't find APXS
( W/ S" ?5 [8 M3 Iapxs是一个为Apache HTTP服务器编译和安装扩展模块的工具,用于编译一个或多个源程序或目标代码文件为动态共享对象。
4 C' K7 h3 V! s% d解决方法:
/ w6 K' v& c8 T/ D' Q4 Z" J5 z, g4 ~ F9 T z
yum install httpd-devel; B& i6 L# _0 o( {* e$ {
2.没有pcre
R' m- g. _- r7 f0 ~: ^- H5 B. u) ]% u; \. o7 {' {
configure: *** pcre library not found.3 L# ?# a! w, t9 p6 u! Y; H! C
configure: error: pcre library is required
' j ~( X4 z( X2 j解决方法:( b* }# Y7 f- _8 A7 ]$ N: h
; |& S& k. W/ {9 M" ]yum install pcre pcre-devel
3 z$ t) [: G. J1 I Q/ d3.没有libxml2
/ Y& n# v Z& C& t+ _; p2 q9 B
- Y7 E; q0 T: B& X. k
+ X8 a# {2 a) zconfigure: *** xml library not found.
; {; _6 W5 Y- A+ ^( r+ ~- e& Rconfigure: error: libxml2 is required0 d3 v* o ^0 d* I
解决方法:
" D; G9 L& \0 E: X; ~% [) p# o) y" P
yum install libxml2 libxml2-devel
4 ]7 \# N/ i, h# n* V# A: r4.执行 /opt/tengine/sbin/nginx -m 时有警告
6 F$ P" k7 u. V) M X( g/ W' r. N! l# X8 t/ B: j" `1 A% J
Tengine version: Tengine/2.1.0 (nginx/1.6.2)
9 v( W3 Z! s0 U! ?+ Bnginx: [warn] ModSecurity: Loaded APR do not match with compiled!
+ `& l: L6 Q. _/ Z原因:modsecurity编译时和加载时的apr版本不一致造成的,并且会有以下error.log
* R6 D4 A l7 ?. t6 j. e e0 v+ G, @8 R! M; \) e
2015/01/26 02:04:18 [notice] 29036#0: ModSecurity for nginx (STABLE)/2.8.0 () configured./ j0 m' \' E8 r% ^7 ~' E/ S
2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: APR compiled version="1.5.0"; loaded version="1.3.9"' X6 Y9 h8 G& K3 F( q/ l
2015/01/26 02:04:18 [warn] 29036#0: ModSecurity: Loaded APR do not match with compiled! J: Y1 R3 c4 C+ Z$ V
2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: PCRE compiled version="7.8 "; loaded version="7.8 2008-09-05"9 Q4 y# e, a% `% k* z& D
2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: LIBXML compiled version="2.7.6"
; c' ^/ K/ X* N9 O2 t2015/01/26 02:04:18 [notice] 29036#0: Status engine is currently disabled, enable it by set SecStatusEngine to On.. b8 y# J" W/ x
解决方法,移除低版本的APR (1.3.9)3 n5 n3 y9 d7 c5 M3 d
6 H' @5 _6 d& j k1 P: t( p$ [
yum remove apr
! g/ j3 D% f. t, A8 `7 Y& M5.Error.log中有: Audit log: Failed to lock global mutex$ ~" e; f! U( z! f4 {# `
% i M! p+ {. v) a
2015/01/26 04:15:42 [error] 61610#0: [client 10.11.15.161] ModSecurity: Audit log: Failed to lock
- u% l9 I. d9 u5 ^: A! y( j" } ?global mutex: Permission denied [hostname ""] [uri "/i.php"] [unique_id "AcAcAcAcAcAcAcA4DcA7AcAc"]
5 }" C. S5 u; [- V4 n6 l* z7 L解决方法:& t4 t0 }. m4 o- I' D) A) ^) V
编辑modsecurity.conf,注释掉默认的SecAuditLogType和SecAuditLog,添加以下内容:
0 m) L( S; P/ n' Y3 U) M' S. s. c. ?3 \4 V. p% X+ \( F
SecAuditLogDirMode 0777
( F" j& l7 h, p0 D3 LSecAuditLogFileMode 05504 p0 _4 Y4 x' j) q8 O2 X! e, ?
SecAuditLogStorageDir /var/log/modsecurity
5 Z3 }6 v0 \0 ~- i3 z gSecAuditLogType Concurrent5 f% d! r4 E! m" h8 e0 w. G# ?
参考文章:
* T6 C& N3 F& c8 Bhttps://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#Installation_for_NGINX) o( b/ c, w: n6 F
http://drops.wooyun.org/tips/2614 |
|