找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 10854|回复: 0

nginx配合modsecurity实现WAF功能

[复制链接]
发表于 2017-10-19 16:53:31 | 显示全部楼层 |阅读模式
modsecurity原本是Apache上的一款开源waf,可以有效的增强web安全性,目前已经支持nginx和IIS,配合nginx的灵活和高效,可以打造成生产级的WAF,是保护和审核web安全的利器。0 v8 z# U* P' J1 M; D

* I. J% S/ k1 l4 g* r8 g1 {" N一.准备工作. |- y" Y% r7 S# l$ N, t" B! h
6 V5 g5 N) Z2 V7 A; o" ?
系统:centos 6.5 64位、 tengine 2.1.0, modsecurity 2.8.0
7 F) j# a* o- f+ E2 v! A1 c
) ]. h- C% n' `  Z& Htengine : http://tengine.taobao.org/download/tengine-2.1.0.tar.gz- C. ?' w* I, F$ R9 y! B

  C9 X7 [. D4 L% Cmodsecurity for Nginx: https://www.modsecurity.org/tarball/2.8.0/modsecurity-2.8.0.tar.gz$ l: B# L* ]+ l% X! i& K  F
2 k* R3 y/ E5 p2 G+ ^# Y* \
OWASP规则集: https://github.com/SpiderLabs/owasp-modsecurity-crs
0 b( F( P) z% g3 s
+ |5 j) \/ ?" q4 s6 S, ]3 I依赖关系:
" q3 ?. N5 o6 U3 [7 A- \: Ztengine(nginx)依赖: pcre 、zlib、 openssl, 这三个包centos 6.5 系统源里都有:7 c% t; n' r- E+ V0 @( ]

; R$ D& w, v' h8 vyum install zlib zlib-devel openssl openssl-devel  pcre pcre-devel
9 Y* b" K+ }, M/ [modsecurty依赖的包:pcre httpd-devel libxml2 apr
6 m# R  D% Q! M7 @& G6 n; T
2 G$ Y% `8 M* e' vyum install httpd-devel apr apr-util-devel apr-devel  pcre pcre-devel  libxml2 libxml2-devel" i( e# l. @' s9 {/ n) l3 }
二.启用standalone模块并编译
4 w  q+ S* m* T7 \
$ ~0 x/ v$ \& h' }下载modsecurity for nginx 解压,进入解压后目录执行:& V5 L4 L  C  S/ O, w! k. v

2 h- Q- w/ |: n; F./autogen.sh
9 T, g! f, X% c./configure --enable-standalone-module --disable-mlogc
/ e4 _; ]( l8 o& x: R% N  lmake
2 ]9 l9 L3 `5 W- q0 b三.nginx添加modsecurity模块2 T- p. s, T: S- B/ b" S

, M* W  W( p( l/ x+ c在编译standalone后,nginx编译时可以通过"--add-module"添加modsecurity模块:" v0 M' D. E- E& n8 F
+ T4 m; d9 ^! x$ a
./configure --add-module=/root/modsecurity-2.8.0/nginx/modsecurity/  --prefix=/opt/tengine9 Z# ]7 F: n/ _0 C3 ?% \: h8 [; S
make && make install0 g7 ?5 o! D9 P" w
四.添加规则
# g/ [, y3 p2 s$ n3 P3 Z% |. \0 m; q, T* {1 p
modsecurity倾向于过滤和阻止web危险,之所以强大就在于规则,OWASP提供的规则是于社区志愿者维护的,被称为核心规则CRS(corerules),规则可靠强大,当然也可以自定义规则来满足各种需求。
8 J2 w  V6 l  E8 |. |- E, l% v. I/ N* k/ i4 z+ o
1.下载OWASP规则:1 B9 F# P# V5 H' M% N
( W7 f4 d0 U! l" k  \, c
git clone https://github.com/SpiderLabs/owasp-modsecurity-crs
( v  i! ?' M- w3 j  i* ]! S- k, K1 K
mv owasp-modsecurity-crs /opt/tengine/conf/
( R6 G% i4 H* S1 s' d% u
8 w' _9 W$ r. ~- ?cd /opt/tengine/conf/owasp-modsecurity-crs && mv modsecurity_crs_10_setup.conf.example modsecurity_crs_10_setup.conf
6 I; {$ T/ k# }/ c# ?0 m. R; F2.启用OWASP规则:  i% `0 Y5 \. {) j- g( g& w) e7 @
/ X9 a* v$ n: l, d9 W/ H* v
复制modsecurity源码目录下的modsecurity.conf-recommended和unicode.mapping到nginx的conf目录下,并将modsecurity.conf-recommended重新命名为modsecurity.conf。% k5 d! g5 `- v/ Z: l. C& N

( P  O3 |8 b* _1 O/ H# X4 I6 ?编辑modsecurity.conf 文件,将SecRuleEngine设置为 on9 f9 d' T, u( p& \& N

, G3 O( h( f! a4 D6 w$ N8 _, O" cowasp-modsecurity-crs下有很多存放规则的文件夹,例如base_rules、experimental_rules、optional_rules、slr_rules,里面的规则按需要启用,需要启用的规则使用Include进来即可。
9 A$ w8 q0 t/ s$ I2 j9 ^" V) Y% o7 J! E
Include owasp-modsecurity-crs/modsecurity_crs_10_setup.conf! R2 x; ?0 C7 D8 ^
Include owasp-modsecurity-crs/base_rules/modsecurity_crs_41_sql_injection_attacks.conf. ~  i4 w* g7 U6 C
Include owasp-modsecurity-crs/base_rules/modsecurity_crs_41_xss_attacks.conf8 [, X2 d8 S3 ~$ M: I: |( S
Include owasp-modsecurity-crs/base_rules/modsecurity_crs_40_generic_attacks.conf
, a' f2 H; @' i" Q  d' x1 nInclude owasp-modsecurity-crs/experimental_rules/modsecurity_crs_11_dos_protection.conf; _& x5 p. c' A- z; r
Include owasp-modsecurity-crs/experimental_rules/modsecurity_crs_11_brute_force.conf
  e0 D) e) Q" X1 |% p- d- SInclude owasp-modsecurity-crs/optional_rules/modsecurity_crs_16_session_hijacking.conf
# J/ g# D6 v2 V2 M$ _五.配置nginx% h7 O0 s6 `5 L: f- X& @

3 o7 v# J; `0 U在需要启用modsecurity的主机的location下面加入下面两行即可:( C6 Q# r* l, \  ~; t3 u4 u
; W& j3 c6 X: J5 ~* Y
ModSecurityEnabled on;  ( v+ j" u0 t& E- m( q! p; H
ModSecurityConfig modsecurity.conf;) |" ^; a4 d1 a! _1 W- Q) K- N
下面是两个示例配置,php虚拟主机:+ j( Y. c' }# r& P2 O+ A

; l0 G$ f4 L/ d0 H; Wserver {
6 k0 S  F; S& p& }      listen      80;
0 I2 J$ c0 |3 l" A      server_name 52os.net www.52os.net;- n* z" ?# N4 N/ Y9 w0 z" _+ Z% b
     - _) |# U- e) z2 r6 S
      location ~ \.php$ {
: a; ?% G$ e- X* v      ModSecurityEnabled on;  4 ~7 V; y2 E, |" e% D6 D- a7 O  {* I
      ModSecurityConfig modsecurity.conf;6 ]* }- V# Q% r9 T
% {" H5 E5 U- y" j# D
      root /web/wordpress;
0 j$ }. V: \8 n9 ^1 B: W      index index.php index.html index.htm;6 L# f$ H* M% `& Q+ w
  & Q. S, a% @; Z" M, T- |
      fastcgi_pass   127.0.0.1:9000;
; b4 g- x2 c% h5 t, ~, n      fastcgi_index  index.php;
, e! Z# W8 L$ d, E2 j- u      fastcgi_param  SCRIPT_FILENAME  $Document_root$fastcgi_script_name;" |! Y7 r2 r3 J6 I* `& i8 |
      include        fastcgi_params;
9 U; M- f6 k+ h9 g      }
$ d, f3 y* G) m* Y. C. N0 E/ m  }
+ i/ `: P3 ^1 O  z7 s& s1 hupstream负载均衡:( b/ S* A* J" N/ s0 y: J

  B; f6 P# F) j" m& D6 M# M: @" aupstream 52os.net {
5 ]! R" u! |. m    server 192.168.1.100:8080;
0 ]( P" n- d$ A* o$ b    server 192.168.1.101:8080 backup;+ A1 m% T) |& J; f0 x$ `; Q8 u) d# O
}
( U3 T! H4 p+ z4 w9 x. l* k5 x/ s' }; b+ f' j
server {
7 O' ]/ `1 W6 i$ w8 H& O6 G8 p1 xlisten 80;
; |* A, O& x- O9 \. j0 Hserver_name 52os.net www.52os.net;
- }# G. g6 D6 F) \1 |: J9 w+ ^. T8 |/ I, w3 c/ L
location / {) x  X+ N1 w) k  V6 G
    ModSecurityEnabled on;  
% u3 D, g7 a8 K& ^5 c    ModSecurityConfig modsecurity.conf;  
, y' j, e& O1 S% q5 F0 r' S) X1 F% r( U2 n# E$ W
        proxy_pass http://online;
; M  \0 h% v5 v4 Z! E        proxy_redirect         off;! P+ y* Q9 A( t$ g& c; i3 b5 e* c
        proxy_set_header Host $host;
% z, O- Z1 p' y9 \3 h! _( i        proxy_set_header X-Real-IP $remote_addr;
; O* u4 s$ O1 l5 j! W9 O/ U        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;  J! j0 d6 X) s% K' q6 C/ }' \
    }
" T7 D( o" B! E( O}
" n$ |: X. o2 i- x/ w# k六.测试
2 Q- x: |' ?' u- X" J2 Q% q
% V& b+ [  C: [# T- O6 X7 V我们启用了xss和sql注入的过滤,不正常的请求会直接返回403。以php环境为例,新建一个phpinfo.php内容为:- D/ d6 q% M. v: n
8 v/ x, o" o! ^" D' K) w
<?php: o2 x: N2 W% Q  Y6 P+ v
    phpinfo();    * A: ?$ @( t" J0 U6 X/ e" N
?>
- }( D+ N2 _; l% n: c$ m  |在浏览器中访问:* C7 ?# W6 q* b8 U9 R1 D& j

! h$ L8 S% V1 zhttp://www.52os.net/phpinfo.php?id=1 正常显示。4 {4 A, }' N* L9 U
http://www.52os.net/phpinfo.php?id=1 and 1=1  返回403。
5 R) a9 F- Y+ I& D7 v+ N! Yhttp://www.52os.net/phpinfo.php?search=<scritp>alert('xss');</script>  返回403。: x. I7 }  Z6 Z( z5 ]
说明sql注入和xss已经被过滤了
  e3 Z) ~  @6 R$ _# L, ]9 c) q/ w
: b. p1 y# D9 w4 \. }1 A/ L七、安装过程中排错
9 j" C9 o, X% j8 i5 G$ o6 T& k1 ~3 }  }9 D
1.缺少APXS会报错
6 k2 y! c0 ~) z/ v
1 v2 m3 @$ K. xconfigure: looking for Apache module support via DSO through APXS8 e$ w- }! D, z$ b8 ~2 [) L/ }& y
configure: error: couldn't find APXS: Z& r" s/ d$ V) L
apxs是一个为Apache HTTP服务器编译和安装扩展模块的工具,用于编译一个或多个源程序或目标代码文件为动态共享对象。
* {+ V" A. x3 d6 \7 y- ~解决方法:. s" b  L7 G, ~" m5 s
$ e  N! Z& n$ R' a! d
yum install httpd-devel
% [) ?: j% ^! [4 V2.没有pcre
3 j" D" R8 T  u4 s
* V/ u7 V1 X, P6 Yconfigure: *** pcre library not found.
3 X8 |0 B! {3 fconfigure: error: pcre library is required% [! s$ P* r5 w3 j0 z+ H! h/ A7 e2 x" b
解决方法:/ I9 J: |; [. P& f; k& v/ w! Z! w
$ B/ I9 G( ]+ Y' I/ j
yum install pcre pcre-devel
9 C7 x% ]$ t6 k, }; d3.没有libxml2, I0 l1 D/ r$ @/ e3 L& B$ Z
$ `1 z$ }9 e5 A1 F7 @* A" z* q' `
/ Y% d% v9 M, ?0 @
configure: *** xml library not found.8 K1 n  H, g$ q( L0 {) f9 U' _) r1 B$ z
configure: error: libxml2 is required, d6 W& x! e. O% ~/ d  P$ J
解决方法:
% i5 I2 |, ^5 e  x+ }) W
. [- R% c5 f& r# ?6 i% hyum install  libxml2 libxml2-devel
4 w7 r7 ]( h4 I5 Z( I! {, L4.执行 /opt/tengine/sbin/nginx -m 时有警告
' L+ c* {; s4 l9 g- y/ w$ \5 W8 q2 G& b: ~2 e( r
Tengine version: Tengine/2.1.0 (nginx/1.6.2): I, j$ g1 H$ d. `4 C
nginx: [warn] ModSecurity: Loaded APR do not match with compiled!4 Q' x, V/ i: n, S* q* i4 r$ n
原因:modsecurity编译时和加载时的apr版本不一致造成的,并且会有以下error.log
) O$ H( M2 X: I$ e8 F/ Z' L
1 M( B& U) ]/ K2015/01/26 02:04:18 [notice] 29036#0: ModSecurity for nginx (STABLE)/2.8.0 () configured.
! U4 ]* x5 Q" X) D2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: APR compiled version="1.5.0"; loaded     version="1.3.9"
6 S) B) S9 K# a% M1 e- ]2015/01/26 02:04:18 [warn] 29036#0: ModSecurity: Loaded APR do not match with compiled!
& D6 ^2 _0 D' e. q- s( m2 ^- Y8 g2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: PCRE compiled version="7.8 "; loaded version="7.8 2008-09-05"
$ g- O8 O: ]2 C! g2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: LIBXML compiled version="2.7.6"1 V1 |. V9 ~- y* |& O3 s: b
2015/01/26 02:04:18 [notice] 29036#0: Status engine is currently disabled, enable it by set SecStatusEngine to On.
1 U/ q" W: D, J4 O8 l解决方法,移除低版本的APR (1.3.9)6 r$ M# {2 @3 G/ |0 b
3 f; G8 l" B2 w  J
yum remove apr
! |$ X+ Z( s6 F5.Error.log中有: Audit log: Failed to lock global mutex* V: [5 E# a' y& z$ ^4 o

4 i) X  m2 ^) G1 D8 D8 q2015/01/26 04:15:42 [error] 61610#0: [client 10.11.15.161] ModSecurity: Audit log: Failed to lock     - s1 U- O! T6 M) n
global mutex: Permission denied [hostname ""] [uri "/i.php"] [unique_id "AcAcAcAcAcAcAcA4DcA7AcAc"]
3 R7 W/ @. d% N5 q解决方法:7 A7 o& x! `! [/ x) W- L) N
编辑modsecurity.conf,注释掉默认的SecAuditLogType和SecAuditLog,添加以下内容:* f! h1 N% V; N7 u

6 p& U) V3 s3 h( nSecAuditLogDirMode 07778 |) ]) N7 Q0 e5 v8 v
SecAuditLogFileMode 0550
! g; g6 y3 Z  ?: i+ oSecAuditLogStorageDir /var/log/modsecurity4 c* {6 T* }# q' }' V$ s
SecAuditLogType Concurrent
9 M4 k- Z8 O9 `9 z参考文章:
, C4 H! N, y0 B  l3 ~7 S. G4 {https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#Installation_for_NGINX, m% i2 B6 e( f7 Q- N! N
http://drops.wooyun.org/tips/2614
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-5-1 23:15 , Processed in 0.061300 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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