|
|
modsecurity原本是Apache上的一款开源waf,可以有效的增强web安全性,目前已经支持nginx和IIS,配合nginx的灵活和高效,可以打造成生产级的WAF,是保护和审核web安全的利器。- d) t% \3 X/ }4 A$ v2 f! J
0 ?: D' U2 | a
一.准备工作; E5 V% s" R" c. C- ]. i
3 I" N. a1 C2 U, e
系统:centos 6.5 64位、 tengine 2.1.0, modsecurity 2.8.0 S, @+ y& q9 o+ F6 `2 _9 b
# |( s* L7 @) T% Y" r! N0 H, d
tengine : http://tengine.taobao.org/download/tengine-2.1.0.tar.gz
3 {4 R( I7 U, C7 h) H" E6 c. I/ K9 X7 M! ?* D
modsecurity for Nginx: https://www.modsecurity.org/tarball/2.8.0/modsecurity-2.8.0.tar.gz8 J! z9 X1 ~( y1 e( D+ r n
! L! |- h/ d1 {+ O! N9 I" M( C
OWASP规则集: https://github.com/SpiderLabs/owasp-modsecurity-crs: Y: N/ y. g4 w( | q- P9 {" i
6 { w! u4 h% R9 u依赖关系:' w x2 {+ S5 D
tengine(nginx)依赖: pcre 、zlib、 openssl, 这三个包centos 6.5 系统源里都有:1 L5 Z( u* t# ]
! C1 ]& a2 {! Y/ pyum install zlib zlib-devel openssl openssl-devel pcre pcre-devel- ^7 ~6 ?( K% l3 `, W
modsecurty依赖的包:pcre httpd-devel libxml2 apr! L8 Z! R5 A+ d" f9 w$ h/ T9 m
" d2 g( c1 k% J! S8 y' @7 Kyum install httpd-devel apr apr-util-devel apr-devel pcre pcre-devel libxml2 libxml2-devel l# o. a7 a% C3 L( F
二.启用standalone模块并编译
; _$ G2 l2 V6 w% p0 r9 A" K! H( W: v+ O5 X3 W" E
下载modsecurity for nginx 解压,进入解压后目录执行:
& g) G* T% x: [. Q6 ^" y! n0 d: n0 q
./autogen.sh
6 Z3 |( A7 u O./configure --enable-standalone-module --disable-mlogc5 c! b- Y9 g3 f( @0 _
make
! g0 w0 J$ c3 ?0 l% A三.nginx添加modsecurity模块
- J/ a8 l! Y5 |3 b/ v% c* ~* c
9 f3 }. Y: }: f/ U$ `3 I在编译standalone后,nginx编译时可以通过"--add-module"添加modsecurity模块:; W( x% p( r# Z1 @6 l" T/ ~7 I
3 n a( `4 U0 C# o0 Z' x' A
./configure --add-module=/root/modsecurity-2.8.0/nginx/modsecurity/ --prefix=/opt/tengine
0 y4 H) ~ W9 M- Dmake && make install" @7 Q; b3 g7 o6 a7 E* l( Z; ?4 }
四.添加规则9 B5 L: c1 x$ }
9 g1 q1 k! ]! j! I3 ?/ Smodsecurity倾向于过滤和阻止web危险,之所以强大就在于规则,OWASP提供的规则是于社区志愿者维护的,被称为核心规则CRS(corerules),规则可靠强大,当然也可以自定义规则来满足各种需求。 Y3 p3 }. x" w0 b; d* n* ]
# f9 k( w$ B2 f! C( v ~
1.下载OWASP规则:
! I; z8 _( N2 Y9 Q- }" M+ D0 S* ]4 s6 v/ ~& m
git clone https://github.com/SpiderLabs/owasp-modsecurity-crs
- f0 t; D: t7 E
1 r9 n- Y% ]; ]mv owasp-modsecurity-crs /opt/tengine/conf/' c9 t8 j1 I% U+ X! F, _
" ?. f# n2 Z( c; `% U4 O) K5 q8 Lcd /opt/tengine/conf/owasp-modsecurity-crs && mv modsecurity_crs_10_setup.conf.example modsecurity_crs_10_setup.conf5 L& [% P/ l& A$ o3 `3 o
2.启用OWASP规则:
. c! j3 n$ _6 g+ D/ L3 H! g5 j' d0 m
复制modsecurity源码目录下的modsecurity.conf-recommended和unicode.mapping到nginx的conf目录下,并将modsecurity.conf-recommended重新命名为modsecurity.conf。
N' M9 b. h9 L; I9 ~; p3 N. B
0 X/ T* ~, Z1 u+ }编辑modsecurity.conf 文件,将SecRuleEngine设置为 on4 l/ Q* o( I: W5 F, h# Z' @5 }
# I( X/ j, h7 z
owasp-modsecurity-crs下有很多存放规则的文件夹,例如base_rules、experimental_rules、optional_rules、slr_rules,里面的规则按需要启用,需要启用的规则使用Include进来即可。
# P$ R% k- I- [, |1 N. b: M5 n5 Q* G# E
Include owasp-modsecurity-crs/modsecurity_crs_10_setup.conf
6 N! Z2 [( Q+ Q. s9 _7 S! p/ N+ \Include owasp-modsecurity-crs/base_rules/modsecurity_crs_41_sql_injection_attacks.conf
; p+ T+ A Z# \! Q+ w/ ~; O. rInclude owasp-modsecurity-crs/base_rules/modsecurity_crs_41_xss_attacks.conf
2 d$ v6 f4 c' cInclude owasp-modsecurity-crs/base_rules/modsecurity_crs_40_generic_attacks.conf; i/ z/ J& _8 [
Include owasp-modsecurity-crs/experimental_rules/modsecurity_crs_11_dos_protection.conf7 ]9 E) v8 l" q5 W' E
Include owasp-modsecurity-crs/experimental_rules/modsecurity_crs_11_brute_force.conf
8 j7 Q- i. K' L! [, [4 wInclude owasp-modsecurity-crs/optional_rules/modsecurity_crs_16_session_hijacking.conf
( ?, a7 ^: d0 w" t. g7 Z) A9 F+ X五.配置nginx
% I0 q5 m8 M/ @7 e/ L: t: ~ @( B7 l
在需要启用modsecurity的主机的location下面加入下面两行即可:
5 p `' d$ S& M1 ~% n4 n, q5 m+ F: _3 u' s4 p
ModSecurityEnabled on; + c" m' O: u0 |3 P' X, _
ModSecurityConfig modsecurity.conf;& v, v7 N, s- c! R3 ?" o
下面是两个示例配置,php虚拟主机:9 G: k; i2 U- E% @* Z) N, L" D
; L$ F- P& Y( G* h: ^
server {
" R) t- f" E4 T0 J# ? listen 80;
& K% t( ]8 S* } server_name 52os.net www.52os.net;
6 d$ N/ F3 s8 P) K& v$ Z
* R$ Q$ @4 X4 y2 d b location ~ \.php$ {
: o" ^; {4 e1 P6 [8 Y ModSecurityEnabled on;
/ c+ a3 K: G" \0 m4 g! a ModSecurityConfig modsecurity.conf;
8 c! @. e: m; j' ^6 W' @2 t0 g9 Z$ i% ~# F% c
root /web/wordpress;1 a4 s7 M! \4 R& _! f3 b% k
index index.php index.html index.htm;( r+ i! O) U* B& H
. w- v9 v1 D" ]
fastcgi_pass 127.0.0.1:9000;; t9 c1 Y+ t) ]$ V1 p6 \' ~0 V7 y3 c
fastcgi_index index.php;# `( j9 G* u! Y" C
fastcgi_param SCRIPT_FILENAME $Document_root$fastcgi_script_name;! L3 ?; a7 D' w
include fastcgi_params;; p: P2 u, m9 R2 k0 e$ y
}
/ ^" O6 K- F2 f' f. e }
* N& K0 ?1 c, D2 Xupstream负载均衡:" H3 ~" v0 w6 N) L' r
5 Y0 P& I* F5 \+ Hupstream 52os.net {5 [# P; ~8 Y0 J7 m* a
server 192.168.1.100:8080;
0 w3 t, `% b+ N% K server 192.168.1.101:8080 backup;
/ M( m R: t1 |}. E- z9 Q6 U( S7 ^" w
- L" V- `7 A! G1 O1 O
server {+ i5 l+ H3 _+ C) c8 I" z
listen 80;
& q! s0 K* \- Q2 h0 N! ]& s1 H0 {6 }server_name 52os.net www.52os.net;
+ @3 d0 e% V9 U/ \ d" R( P# ]
! M8 @7 L& @4 ^; X/ J# hlocation / {
' v$ y' ~( n! O" i3 L7 e0 k" _ ModSecurityEnabled on; 5 s" g1 S) B3 a- }1 Y
ModSecurityConfig modsecurity.conf; ; a- o* p& J- z) {* p* e
+ t) I$ a( i8 \+ t: ?: | proxy_pass http://online;
3 E9 I+ u4 u% o3 y2 H; Z5 m" ` proxy_redirect off;
2 N( i4 f; `9 Z( \0 e proxy_set_header Host $host;" g3 g4 Z0 ?; r, Z _6 O1 B
proxy_set_header X-Real-IP $remote_addr;
$ l) @% t, \0 r, t% n! o proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;0 R& c/ [8 Q# h" ~# h/ e+ d
}
& a( K5 e6 s& n! G}
e% g2 g7 y; w' ]5 j" x/ D" g! T六.测试
& P3 M& g _7 A" L; o7 Y7 s* Y& H* J' K
我们启用了xss和sql注入的过滤,不正常的请求会直接返回403。以php环境为例,新建一个phpinfo.php内容为:
$ g& J" N+ D) k/ [( m* m7 k
7 a' O* u! g o2 v- {<?php
& B7 s E8 R7 A; g phpinfo();
/ O/ i# _# J. g7 k! k/ ?1 T?>( I% y* p1 |! M) }
在浏览器中访问:; P: a9 `8 P/ W- M1 z# V
8 G! a+ h X) `! Z! R) l8 A# T
http://www.52os.net/phpinfo.php?id=1 正常显示。3 F2 q x: A6 D+ v1 ]5 b5 b7 N" O
http://www.52os.net/phpinfo.php?id=1 and 1=1 返回403。
) N- X8 |( R c+ t: G& j6 Fhttp://www.52os.net/phpinfo.php?search=<scritp>alert('xss');</script> 返回403。
1 x7 R/ ?9 G2 C% Q) @; S% Q说明sql注入和xss已经被过滤了
& }4 v1 y1 Z& B* c( ~: v$ O( I
9 N9 A1 p. Q& x1 r; V( R七、安装过程中排错: r& b2 `3 Z8 N' i6 L
$ D. L5 N# y, }4 F9 J
1.缺少APXS会报错% V) e% U; c) ?, B% O0 F
; [# x2 \1 }1 W
configure: looking for Apache module support via DSO through APXS# n# y4 p" l! ~0 E( V
configure: error: couldn't find APXS
( e$ Z5 {# _7 c; \, U1 Qapxs是一个为Apache HTTP服务器编译和安装扩展模块的工具,用于编译一个或多个源程序或目标代码文件为动态共享对象。
$ t% G2 w3 L: v5 z" _( H解决方法:; O& t- K9 Q5 M% P- [
8 O# i# V5 _8 {' {# {0 ^
yum install httpd-devel& K8 f7 ?' f+ F4 w6 f+ L: W& x$ i& ?
2.没有pcre
) j9 l8 w% S) x. R* b' ?1 I2 C/ i% Z
configure: *** pcre library not found.
( ]" o7 T7 M; E/ i( G4 E3 Bconfigure: error: pcre library is required
4 m1 G7 L; y" b+ `解决方法:
* R3 i9 K# z% w' q' W) Q0 m7 x2 j. ` n# H. t7 F
yum install pcre pcre-devel& N ` E! s) j7 N
3.没有libxml2; E3 d6 ?+ r7 J( O. G+ m$ _1 f
, V v# h4 k O# e
2 C# k( ~/ u7 c# Tconfigure: *** xml library not found.
$ N( F- v8 V+ Y Y1 xconfigure: error: libxml2 is required
2 Y3 i3 E0 f" F# i |) h, T解决方法:
1 s. q7 h6 N0 k3 o) g
3 X9 \/ L) P' q J* G# Uyum install libxml2 libxml2-devel0 U- |& d8 \- L: \
4.执行 /opt/tengine/sbin/nginx -m 时有警告
5 ]# Z6 U7 r% o% q; x: O) R- t
! G) V+ [. Z5 a" o3 h0 D' M" WTengine version: Tengine/2.1.0 (nginx/1.6.2)% D2 ^ k" t% u" h3 B3 N* c
nginx: [warn] ModSecurity: Loaded APR do not match with compiled!" u) Y3 Q1 V& p
原因:modsecurity编译时和加载时的apr版本不一致造成的,并且会有以下error.log
7 a* H4 W! c' j
) D, g# O. O* S& G' v9 Y2015/01/26 02:04:18 [notice] 29036#0: ModSecurity for nginx (STABLE)/2.8.0 () configured.
1 N7 ^3 Z c6 v2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: APR compiled version="1.5.0"; loaded version="1.3.9"
5 b% l5 Z' P. {/ X! d2015/01/26 02:04:18 [warn] 29036#0: ModSecurity: Loaded APR do not match with compiled!* b+ f& y5 b' {! G& {1 W/ N' Z2 N
2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: PCRE compiled version="7.8 "; loaded version="7.8 2008-09-05"* O* k+ I: ?/ N+ L9 t/ q4 s
2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: LIBXML compiled version="2.7.6"
; r4 g- g- X; }4 f+ M2015/01/26 02:04:18 [notice] 29036#0: Status engine is currently disabled, enable it by set SecStatusEngine to On.' n$ `, y% @# @6 I; J+ \- Y2 @: g
解决方法,移除低版本的APR (1.3.9)6 i0 J' V2 u/ N, m
( L! C' s9 D. B& q+ qyum remove apr
/ ?- M& X Z' K$ }! R' p8 R5.Error.log中有: Audit log: Failed to lock global mutex3 b: p7 @' w- Z+ c3 K
" M4 S) C" K7 W
2015/01/26 04:15:42 [error] 61610#0: [client 10.11.15.161] ModSecurity: Audit log: Failed to lock 1 m$ U* y5 L4 F- u
global mutex: Permission denied [hostname ""] [uri "/i.php"] [unique_id "AcAcAcAcAcAcAcA4DcA7AcAc"]) D2 ^' |- n" p) D) i4 K
解决方法:4 O7 n5 d* g& G* U0 J, l3 C. z
编辑modsecurity.conf,注释掉默认的SecAuditLogType和SecAuditLog,添加以下内容:
* ]+ b" Q7 |* ^8 o4 A/ N5 X
C5 e6 i; x) V' S# v2 n$ Z, rSecAuditLogDirMode 0777 F, |4 R5 v$ ^- `
SecAuditLogFileMode 0550
. V1 R6 I1 Y2 q. J: ^1 ^& SSecAuditLogStorageDir /var/log/modsecurity1 ]( |; G$ i! B% r
SecAuditLogType Concurrent4 S- G$ T$ A/ |
参考文章:
/ ^# K8 u. K" H5 ghttps://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#Installation_for_NGINX
, }' e& ~- K8 q; u, shttp://drops.wooyun.org/tips/2614 |
|