找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 10889|回复: 0

nginx配合modsecurity实现WAF功能

[复制链接]
发表于 2017-10-19 16:53:31 | 显示全部楼层 |阅读模式
modsecurity原本是Apache上的一款开源waf,可以有效的增强web安全性,目前已经支持nginx和IIS,配合nginx的灵活和高效,可以打造成生产级的WAF,是保护和审核web安全的利器。
6 e9 v4 q# s# k" v0 u5 U" g) R( Y% W, R/ r/ i, {. T8 [: F4 Z1 k- I
一.准备工作
/ e8 V! L9 V; M% J1 U
* C# B, t$ g# w! [) G: y系统:centos 6.5 64位、 tengine 2.1.0, modsecurity 2.8.0
  O# P0 _$ S$ }# e9 i; a  [2 _' u$ J8 Y: p* k# S) g  s1 N
tengine : http://tengine.taobao.org/download/tengine-2.1.0.tar.gz
$ u  z8 y% F  f/ c: i9 c" X' T& p2 n- _9 W! G2 f' m
modsecurity for Nginx: https://www.modsecurity.org/tarball/2.8.0/modsecurity-2.8.0.tar.gz
6 Q5 p  u. w! X0 ^) l/ O8 q% }+ F! T
OWASP规则集: https://github.com/SpiderLabs/owasp-modsecurity-crs2 S% k% ?; L' v& M; Y; Y

+ @+ ]8 C# e, c" |1 a依赖关系:
) u  ?& }0 a) ]  b4 C+ {$ k3 ^tengine(nginx)依赖: pcre 、zlib、 openssl, 这三个包centos 6.5 系统源里都有:( ?* O$ i- ^( P- e4 V
# L# O. f: s( k; U
yum install zlib zlib-devel openssl openssl-devel  pcre pcre-devel
2 i8 S- l" D1 u8 _1 ~3 Cmodsecurty依赖的包:pcre httpd-devel libxml2 apr
9 s# x$ Y0 K1 s1 R& v, E5 e4 P. j: m4 d' [4 v  F
yum install httpd-devel apr apr-util-devel apr-devel  pcre pcre-devel  libxml2 libxml2-devel3 E/ ~, l# q' k; R( S4 i
二.启用standalone模块并编译$ a+ S: s# t! z; X" e
/ S. G8 z$ H; Z, p7 l8 h
下载modsecurity for nginx 解压,进入解压后目录执行:
4 k6 S# V7 I- G& X6 x3 j. e1 G
% D% D& _3 b2 c0 s8 T./autogen.sh& |6 e  u+ a' k, B  r
./configure --enable-standalone-module --disable-mlogc& K; p+ J# O5 _/ w& p- l( O& ^
make
; [" Q+ B- V/ n, O" N' f三.nginx添加modsecurity模块
9 n% L. J; Y1 l% Y8 c- o
& j2 u6 E5 s/ n% x* m在编译standalone后,nginx编译时可以通过"--add-module"添加modsecurity模块:& O/ K& w- i. d( F9 B! p, k7 C

5 R# d3 {7 u* w: I: I./configure --add-module=/root/modsecurity-2.8.0/nginx/modsecurity/  --prefix=/opt/tengine
) F6 ]$ Z+ X, u: m+ N8 o/ c" p$ Nmake && make install
# c+ T2 l' |/ u7 O2 ~% Q; t四.添加规则
, H$ c9 g4 S4 T: v6 L1 C( Q! X! T: @& t( \( l) c
modsecurity倾向于过滤和阻止web危险,之所以强大就在于规则,OWASP提供的规则是于社区志愿者维护的,被称为核心规则CRS(corerules),规则可靠强大,当然也可以自定义规则来满足各种需求。6 k" d7 v! R+ B0 N4 @6 x& a# i
, `& ~( X% K# c7 |. b0 I
1.下载OWASP规则:- p, m& ?2 L. c, m6 @3 U% u1 N2 j
; [! Z3 P' Z, C: L! D
git clone https://github.com/SpiderLabs/owasp-modsecurity-crs
9 V+ p% O- Y* a8 K- `' g' M" c% }
mv owasp-modsecurity-crs /opt/tengine/conf/
, }, P; k) [3 y' w. K
* u0 N6 @  g5 Y! U" ecd /opt/tengine/conf/owasp-modsecurity-crs && mv modsecurity_crs_10_setup.conf.example modsecurity_crs_10_setup.conf: `: i9 T/ M- A* _" g
2.启用OWASP规则:
  @& A7 I7 i) q! u3 N2 t6 F8 q, |! g9 z5 B: d7 c+ b1 Z- J
复制modsecurity源码目录下的modsecurity.conf-recommended和unicode.mapping到nginx的conf目录下,并将modsecurity.conf-recommended重新命名为modsecurity.conf。
3 o- f) m* b* p* j) \
/ r: h5 {* u8 J/ ], W( L编辑modsecurity.conf 文件,将SecRuleEngine设置为 on
- ~1 _& W0 d: T6 t/ K: E6 [8 E2 v( T, L- v5 m- N
owasp-modsecurity-crs下有很多存放规则的文件夹,例如base_rules、experimental_rules、optional_rules、slr_rules,里面的规则按需要启用,需要启用的规则使用Include进来即可。
8 f" X4 \0 \! d! G; M$ M) z5 a
1 h' I5 ]3 v0 rInclude owasp-modsecurity-crs/modsecurity_crs_10_setup.conf  `3 Y, m: X$ V* K2 W3 o
Include owasp-modsecurity-crs/base_rules/modsecurity_crs_41_sql_injection_attacks.conf
: v& l  C/ k% v6 \Include owasp-modsecurity-crs/base_rules/modsecurity_crs_41_xss_attacks.conf5 [0 b& w6 T8 E2 W1 Y* C1 K
Include owasp-modsecurity-crs/base_rules/modsecurity_crs_40_generic_attacks.conf
! u$ u, v6 h; ]1 ~Include owasp-modsecurity-crs/experimental_rules/modsecurity_crs_11_dos_protection.conf; s7 c. t/ E2 [
Include owasp-modsecurity-crs/experimental_rules/modsecurity_crs_11_brute_force.conf$ g# v: L0 |  z0 P
Include owasp-modsecurity-crs/optional_rules/modsecurity_crs_16_session_hijacking.conf
% A0 x+ i) k8 t$ t( u( W五.配置nginx1 m6 t# o; G2 B8 j  q9 _

" K! I8 q( A5 A2 M/ r3 E( H8 F8 f% P在需要启用modsecurity的主机的location下面加入下面两行即可:
( B4 N  j, X. Q- L/ ~/ a5 p" H% b6 Y, a3 D
ModSecurityEnabled on;  
2 o+ Y- W4 V) l+ I; ^ModSecurityConfig modsecurity.conf;+ H; S( C& e# w- R
下面是两个示例配置,php虚拟主机:1 A4 b8 _; n3 T3 \: T: M3 o

/ [4 l9 p7 R& M; d5 J" jserver {
8 {( `1 w2 _: h3 k4 Y. e8 a2 n      listen      80;7 W* q) Y; H) f" k7 A& g
      server_name 52os.net www.52os.net;
7 e4 c) [$ p! y% s5 e2 k     
) W* d  m) z! t& ?2 t      location ~ \.php$ {$ R$ q$ o& ]1 q+ `0 b
      ModSecurityEnabled on;  / b" m  l- T4 E! B' H: g2 D3 A
      ModSecurityConfig modsecurity.conf;! g* Q1 |. a# t) U
4 y% H6 e, Q! V" o
      root /web/wordpress;, N1 U' Z. [& _$ M
      index index.php index.html index.htm;6 Y- B+ Y# r+ E
  
- F& o6 a9 N9 O- v! \( w- p      fastcgi_pass   127.0.0.1:9000;
" ]6 k  `0 a. ]$ s6 \) T5 U8 \      fastcgi_index  index.php;2 J( E, s  J; _4 {" V9 B
      fastcgi_param  SCRIPT_FILENAME  $Document_root$fastcgi_script_name;$ R1 P3 g5 }1 @7 \8 {+ x
      include        fastcgi_params;
, B! b3 l* ]! e5 M      }
; L" q8 T! w9 P+ i8 s5 \/ W0 H  }
& l7 K! D/ B! ~4 R( `) ?9 B* {upstream负载均衡:
3 l( K% Y, g6 w9 l5 C
& S! e- O$ h* I! e* }upstream 52os.net {
, w9 F0 o( H3 b9 P* G9 v! ?* b    server 192.168.1.100:8080;
% G5 x2 T, S! G, u    server 192.168.1.101:8080 backup;7 _# Q& P/ r% T0 N( I7 i
}
6 K5 c. R9 f  R; {3 ?
# N# B' m# w9 h, h0 gserver {8 N: K( f: e* M
listen 80;
5 L* N  F% Z4 f( fserver_name 52os.net www.52os.net;, p2 c- c9 z) I# L& {! r
/ [( m" e' z% l1 t- m$ \$ e- R
location / {
% L1 c* m6 L5 [- S( \6 j; j    ModSecurityEnabled on;  
, F: p# S+ k- ~) u$ @    ModSecurityConfig modsecurity.conf;  
( t1 W. n6 r, G6 p7 o4 ]9 h* N# n1 `# ~; f; \# u
        proxy_pass http://online;# |, k" n$ F5 m$ W* Z/ Q- _; q) w
        proxy_redirect         off;0 q9 x# l8 _" l; e
        proxy_set_header Host $host;' g* V2 F5 o& N- h1 ?
        proxy_set_header X-Real-IP $remote_addr;0 @& s1 s$ b$ j0 V
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;! o3 P* z" v( {( j7 f* J
    }8 c, P2 N6 L$ I! T
}( S; O$ t: S7 t3 G/ O8 \# ~- T& ~, ?9 g
六.测试
4 v/ l: M" m0 p+ S4 Y: F: i, J7 s4 L' X% U. l* K
我们启用了xss和sql注入的过滤,不正常的请求会直接返回403。以php环境为例,新建一个phpinfo.php内容为:% M' J. C( i/ `3 j
. ^6 |! Y& F4 {( m" B2 U
<?php
' V( }. m6 {. `- K/ N" B4 l8 J    phpinfo();    $ G# r/ d! R: C6 H, h7 T
?>% }% Q6 d8 }  O; B
在浏览器中访问:
  c( w* D0 D- @) z: A
4 R# n- z9 P$ xhttp://www.52os.net/phpinfo.php?id=1 正常显示。) C& d( H" J, `9 |6 U. p6 u
http://www.52os.net/phpinfo.php?id=1 and 1=1  返回403。
* |9 Y7 W$ `0 I( O$ m, m% z& s. ]http://www.52os.net/phpinfo.php?search=<scritp>alert('xss');</script>  返回403。" p9 @% j% a, w7 b1 ]# G
说明sql注入和xss已经被过滤了
* W& B* P3 x5 k5 k/ z+ h+ F: ]
, o/ c6 K5 ?% i' [. H* }七、安装过程中排错
- t' K& A& M/ \5 h. _0 o, `$ z* L$ G2 Y7 w2 ^
1.缺少APXS会报错0 a# Q9 ^: Q/ \- U, e& G

9 M* m2 G" F6 K+ `2 n$ A3 oconfigure: looking for Apache module support via DSO through APXS
& p6 Y4 m* m9 [* Nconfigure: error: couldn't find APXS
; w' c1 l' v1 ~* W/ b( Dapxs是一个为Apache HTTP服务器编译和安装扩展模块的工具,用于编译一个或多个源程序或目标代码文件为动态共享对象。
/ W5 A8 h) t4 |7 G0 Z( g2 f解决方法:
+ }( E9 V6 R* y, X" d6 C' ?7 B: C1 M9 t
yum install httpd-devel+ G" x1 t+ I+ X1 P% ^+ r' R
2.没有pcre: H( h# w" l0 W; e8 ~1 K5 s
: d7 p) l! o* U' K
configure: *** pcre library not found.
% \+ Q7 s! q5 F$ @" _6 S7 M3 f8 Xconfigure: error: pcre library is required" Y; m3 g# ?( g
解决方法:. E* a' X( v$ n
; o! G/ K. c- `/ R: ?6 z
yum install pcre pcre-devel
" \4 R. i7 [* x! _  k6 \3 G3.没有libxml2! c! D8 ~% Z4 k
& X8 k  I* F2 c
' s/ ]3 l* s7 |. n& |) k
configure: *** xml library not found.6 L2 b. g* n# X4 D  {8 s0 c
configure: error: libxml2 is required
3 [3 ~! V  z/ J# F0 ~- R4 t0 V4 V解决方法:5 ~; e) k0 n3 [" ?, y8 {
2 c& @, c5 e% h) t
yum install  libxml2 libxml2-devel5 i3 G( t" T  H0 ?2 r) y8 A: J8 j
4.执行 /opt/tengine/sbin/nginx -m 时有警告6 |/ t  f7 b1 E. x6 w
- ^' H" G' L) A3 Z7 ?
Tengine version: Tengine/2.1.0 (nginx/1.6.2)( i( \1 ]2 b: f$ [
nginx: [warn] ModSecurity: Loaded APR do not match with compiled!
% r1 y8 ^, L$ G$ V% T* N原因:modsecurity编译时和加载时的apr版本不一致造成的,并且会有以下error.log
1 u8 b8 v0 N! O( b& y$ O6 S& _3 i' Z  J  J" }& [% P  Z
2015/01/26 02:04:18 [notice] 29036#0: ModSecurity for nginx (STABLE)/2.8.0 () configured.
* l6 S7 J( ]/ n7 J/ w$ i. D* q2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: APR compiled version="1.5.0"; loaded     version="1.3.9"
7 }& y" m+ ]0 l1 ?7 p# z- `/ \2015/01/26 02:04:18 [warn] 29036#0: ModSecurity: Loaded APR do not match with compiled!
7 p0 o1 W3 h# C$ D, y* V  O* h  ~2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: PCRE compiled version="7.8 "; loaded version="7.8 2008-09-05"
' ^# [9 V! j( j& j( }2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: LIBXML compiled version="2.7.6"
. v$ S4 V% }# ]" K, g( ~1 f2015/01/26 02:04:18 [notice] 29036#0: Status engine is currently disabled, enable it by set SecStatusEngine to On.2 ^- h8 {- N) L% S- W5 h( [
解决方法,移除低版本的APR (1.3.9)% {3 f8 }. ?$ ]* h9 l9 O- s: w! ~. n# W

: P" @- i" p" O; ~- M  n5 J6 X0 \9 Ryum remove apr
' p4 p% \& {/ ^2 |: P" e: a5.Error.log中有: Audit log: Failed to lock global mutex
  W1 n# w+ L7 T- U6 K
. U6 a% `; s- x* e9 E$ P* q2015/01/26 04:15:42 [error] 61610#0: [client 10.11.15.161] ModSecurity: Audit log: Failed to lock     5 f$ G* A$ F' q) u) N4 _
global mutex: Permission denied [hostname ""] [uri "/i.php"] [unique_id "AcAcAcAcAcAcAcA4DcA7AcAc"]+ Z/ m# a' E" U8 v
解决方法:
$ G) t0 w! O8 ]" g编辑modsecurity.conf,注释掉默认的SecAuditLogType和SecAuditLog,添加以下内容:1 P& S1 t- A6 N7 @  ]: R0 H
, ?1 ~7 b# _7 T$ V
SecAuditLogDirMode 0777
8 m0 D" N9 Y9 C# J" R# ySecAuditLogFileMode 0550( G% a* v) [' w7 D) W  e/ O
SecAuditLogStorageDir /var/log/modsecurity
  N2 m! D. R/ ^( a4 QSecAuditLogType Concurrent1 i4 m3 r7 R' O% F; p- W
参考文章:
" x# ^. l% k4 {+ q$ l  ihttps://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#Installation_for_NGINX
2 h( _6 }* b1 Z6 u$ G& x0 Thttp://drops.wooyun.org/tips/2614
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|第一站论坛 ( 蜀ICP备06004864号-6 )

GMT+8, 2026-5-5 04:47 , Processed in 0.065029 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表