找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 11997|回复: 0

nginx配合modsecurity实现WAF功能

[复制链接]
发表于 2017-10-19 16:53:31 | 显示全部楼层 |阅读模式
modsecurity原本是Apache上的一款开源waf,可以有效的增强web安全性,目前已经支持nginx和IIS,配合nginx的灵活和高效,可以打造成生产级的WAF,是保护和审核web安全的利器。# z$ K& x( O- f. t* W
) j* M& ]4 m. P9 p' u
一.准备工作+ v- [, x8 G5 Z/ J1 y6 g
' p* |* w9 F: P, s4 k
系统:centos 6.5 64位、 tengine 2.1.0, modsecurity 2.8.0
# Y' v9 o5 t& ]9 x! M4 H+ k3 j7 P7 y8 W5 d" o7 v2 r2 t/ X; ?
tengine : http://tengine.taobao.org/download/tengine-2.1.0.tar.gz+ K. f" N+ a2 l

$ D* a3 v# n6 J5 _- j7 O( t; D' Wmodsecurity for Nginx: https://www.modsecurity.org/tarball/2.8.0/modsecurity-2.8.0.tar.gz
$ Q# {6 K, w& H
* F9 Q6 K, F5 {OWASP规则集: https://github.com/SpiderLabs/owasp-modsecurity-crs0 y! _; D  i& A+ B/ P" s$ {
/ u  d8 A' h8 R5 i( J; o
依赖关系:6 K2 h/ h" `- l  m# @
tengine(nginx)依赖: pcre 、zlib、 openssl, 这三个包centos 6.5 系统源里都有:" A: ]. k2 M) c  ~: `& `$ `2 t
+ {1 r' a5 A& s8 `
yum install zlib zlib-devel openssl openssl-devel  pcre pcre-devel
3 q2 H4 S; f& ^  u* z5 d; J4 `modsecurty依赖的包:pcre httpd-devel libxml2 apr$ o; h7 C8 G9 z- e( k

# G6 k) |% r( `* ~2 J3 {yum install httpd-devel apr apr-util-devel apr-devel  pcre pcre-devel  libxml2 libxml2-devel, v+ K( t9 N* q4 F# g
二.启用standalone模块并编译9 O* v% |: p% E% d6 k# V& F

( k; {; S7 F( Z: A; T  A$ o1 G下载modsecurity for nginx 解压,进入解压后目录执行:
. l6 }1 `/ ~) M" b) a) a% V  B  j# u8 K- b; B; s$ b
./autogen.sh5 z; n# `' R- o5 q. K
./configure --enable-standalone-module --disable-mlogc  Y( c  |5 ?: L* J# v
make * R% U( Y! {* y& ?& Z: [# k. J
三.nginx添加modsecurity模块
$ }' q  s0 D' z4 a  Z) ]* A6 ^
7 P% E& m9 o0 U8 |7 P  U7 ~! @在编译standalone后,nginx编译时可以通过"--add-module"添加modsecurity模块:
( m4 A3 `" V5 y  W! E& c! m* U5 b  x# f& P$ i+ \, n
./configure --add-module=/root/modsecurity-2.8.0/nginx/modsecurity/  --prefix=/opt/tengine# j. a* @7 H& M5 l8 B  n
make && make install" m0 T) p& b4 g0 q  l5 ~- R' B
四.添加规则7 A5 g. b# ^( o0 P7 c

( f1 n( k; H. U: `modsecurity倾向于过滤和阻止web危险,之所以强大就在于规则,OWASP提供的规则是于社区志愿者维护的,被称为核心规则CRS(corerules),规则可靠强大,当然也可以自定义规则来满足各种需求。
7 c. |: |4 P. O5 A/ g# l. `" O, q
1.下载OWASP规则:
3 r; K' l8 i; u5 u5 V- U; V0 m; ~% R3 W" v' u. g
git clone https://github.com/SpiderLabs/owasp-modsecurity-crs
. w" U; r8 B& S/ u% P; h  }- \1 `# l" b1 i
mv owasp-modsecurity-crs /opt/tengine/conf/
; P) l- E* a; H1 I- J3 o
. y% Y+ P) s6 k0 m' C+ mcd /opt/tengine/conf/owasp-modsecurity-crs && mv modsecurity_crs_10_setup.conf.example modsecurity_crs_10_setup.conf$ D/ Y, N9 S' {' v: p* i
2.启用OWASP规则:# t3 i1 M$ B: w3 t9 T- U7 o( B; L; D6 L

& J# G' H* e" u& j6 Y复制modsecurity源码目录下的modsecurity.conf-recommended和unicode.mapping到nginx的conf目录下,并将modsecurity.conf-recommended重新命名为modsecurity.conf。' s# X. M4 D% j( i
9 c# q2 w4 P' G1 q; {6 D- l6 e
编辑modsecurity.conf 文件,将SecRuleEngine设置为 on! X1 }: k& h( }9 Y9 e, u4 b

8 R2 ]4 t0 _' h( T7 T( Z' Bowasp-modsecurity-crs下有很多存放规则的文件夹,例如base_rules、experimental_rules、optional_rules、slr_rules,里面的规则按需要启用,需要启用的规则使用Include进来即可。2 y& ?0 |: r( q2 L4 A% ~. o, {0 ~

! t  B* k" a* U# }$ K/ a$ j" tInclude owasp-modsecurity-crs/modsecurity_crs_10_setup.conf
  H7 E9 E9 ^4 W3 b! z8 r! Q5 K7 ^Include owasp-modsecurity-crs/base_rules/modsecurity_crs_41_sql_injection_attacks.conf8 n' x# K) M; [  r
Include owasp-modsecurity-crs/base_rules/modsecurity_crs_41_xss_attacks.conf: u" A( P, j; _. d
Include owasp-modsecurity-crs/base_rules/modsecurity_crs_40_generic_attacks.conf
* U5 x7 p, A5 |/ m7 ?& XInclude owasp-modsecurity-crs/experimental_rules/modsecurity_crs_11_dos_protection.conf7 W& \" r0 _, s0 T" p2 N6 h$ p: A3 F
Include owasp-modsecurity-crs/experimental_rules/modsecurity_crs_11_brute_force.conf
3 j; v3 R1 L( t9 v1 G/ SInclude owasp-modsecurity-crs/optional_rules/modsecurity_crs_16_session_hijacking.conf
8 k" r1 ]! D5 M五.配置nginx: Q% B% n1 h9 x5 J) t& O- @* D

  }4 R8 d( d, W0 [4 h) K在需要启用modsecurity的主机的location下面加入下面两行即可:! d+ \2 P, @$ C' @0 m: G
6 }  U" u: ^" w5 A, K
ModSecurityEnabled on;  
; w% _! D! Y: a7 e* M* e$ w2 H. q! NModSecurityConfig modsecurity.conf;
4 x( T8 |9 G$ q下面是两个示例配置,php虚拟主机:
8 t1 c% m/ ?) s, p- B4 k$ U# f
' f/ Y8 y4 P5 ?3 m* j6 wserver {: V* w8 v7 {( W9 ^, s! o
      listen      80;% B8 |& c8 g! C1 m2 t5 q; E
      server_name 52os.net www.52os.net;8 p+ P  x9 f" |9 d
     6 K6 u- e6 B  Y- B& o; e: f( U
      location ~ \.php$ {7 p+ j5 N8 q- I& E. G! b
      ModSecurityEnabled on;  
9 z* z: N3 \$ F- r% R' s      ModSecurityConfig modsecurity.conf;
* D  ]6 M& ?$ U: e) g5 k) x; S# `$ Z
      root /web/wordpress;
" W2 B* D1 o2 W/ Y; Q5 R      index index.php index.html index.htm;
; z' e: [, \' v  R" E8 A  
: h- c, p6 B$ ?8 \+ r+ T+ x) j      fastcgi_pass   127.0.0.1:9000;2 Z/ T8 g+ N& x5 H1 Y
      fastcgi_index  index.php;
9 q! m% w3 J+ f; E1 Z1 e      fastcgi_param  SCRIPT_FILENAME  $Document_root$fastcgi_script_name;
0 P7 f! \: ?  C( v+ l$ O      include        fastcgi_params;+ p$ @- d0 ~8 r+ J/ M
      }% \, k# y" F2 d. ^
  }9 \0 d4 C7 }1 q% y
upstream负载均衡:
7 Q/ g9 l+ k) U6 L& P8 v' K% ?9 B  [' {
upstream 52os.net {
  q( n+ X5 }+ l- Y  u    server 192.168.1.100:8080;
5 [* j3 i; X2 b# G# N  q" f    server 192.168.1.101:8080 backup;* \3 v. }4 O$ [
}9 g; e" g; n: k! _# z, U

8 y8 E( e$ n7 Z- x% \server {
+ C8 n" ?9 L' ]( N2 Blisten 80;
6 t: L: L- D* B9 Tserver_name 52os.net www.52os.net;
5 [3 H+ X" H0 s) \4 }" A' I. k2 W4 X9 v, X, k* d
location / {9 R& V3 r. w3 j3 S! ^: K
    ModSecurityEnabled on;  
# z* g4 v7 f# P3 T! Z    ModSecurityConfig modsecurity.conf;  9 y, z8 b' Z5 [3 E5 @

- E6 t! {5 K0 m        proxy_pass http://online;" w; \7 Z! d+ w; m9 O: D( v. k
        proxy_redirect         off;
  j& T! d, b3 ~        proxy_set_header Host $host;7 ^8 ]) D* ]# [
        proxy_set_header X-Real-IP $remote_addr;
7 j2 H; c! h/ Q        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;/ ^$ `+ K8 w4 f! L( E
    }
' e1 ~; Z; o7 A2 l7 w; z7 W; v}
7 }: m9 }  X! j$ m( A六.测试. j9 o4 v# v# @4 F% ?
8 ^/ e+ A- v& h6 N; j+ k% o
我们启用了xss和sql注入的过滤,不正常的请求会直接返回403。以php环境为例,新建一个phpinfo.php内容为:
" i4 s1 w# W7 J9 J# P1 ~! n$ _3 {7 Z9 `; q' L( V
<?php" T7 V  B$ |: D5 }( V/ w* C1 d
    phpinfo();    " |4 R. p' b' q# D
?>
' W8 ~. T$ Y- a& ^在浏览器中访问:
) W3 w! m6 l2 f( g& T7 N1 p1 F- W: n8 D- H
http://www.52os.net/phpinfo.php?id=1 正常显示。
3 J* O( n9 s& p' p9 h+ _5 m( Ghttp://www.52os.net/phpinfo.php?id=1 and 1=1  返回403。3 X! w+ I) u! B& H2 H5 z# f
http://www.52os.net/phpinfo.php?search=<scritp>alert('xss');</script>  返回403。
" g! |- B9 X9 j9 z; f2 }! }# r1 \6 P6 m; O说明sql注入和xss已经被过滤了
- r+ H0 N( |5 K/ g/ K* }+ r* }  L3 C1 o. ^
七、安装过程中排错
8 u' A- z( H+ i  K* N
/ i% c( n  P) @1.缺少APXS会报错
* {3 U2 Q  F% h6 b
* a. [) G5 R  z! lconfigure: looking for Apache module support via DSO through APXS
4 Q* X) t# k9 Y3 {* ]" Z; `& Mconfigure: error: couldn't find APXS0 U; _; r) ^. i9 i0 ^( H( m% B
apxs是一个为Apache HTTP服务器编译和安装扩展模块的工具,用于编译一个或多个源程序或目标代码文件为动态共享对象。9 q3 Q4 [- i+ v3 _
解决方法:
+ T; Q, F) @2 g5 x# R% T: N
! q) J6 N9 ?# s, a) C8 Ryum install httpd-devel2 R! q0 i* M) ?0 ]7 v
2.没有pcre+ t+ a8 d4 r: Z9 ^7 Q
# |: s% `5 k% n6 @8 S/ d
configure: *** pcre library not found.
8 J) G3 v: e% b7 p4 c$ {configure: error: pcre library is required' S2 e+ \( R+ O6 `
解决方法:" a6 z4 c& L! G9 B% {
4 b& a* U# y, O. T! j
yum install pcre pcre-devel& C5 H' J) a  C* A0 m: ?
3.没有libxml2
  ]& V! y8 b; S& N
/ X( n+ b" R% n+ {$ `& v
' F' w& S# L6 _configure: *** xml library not found.3 v- {" ^9 y& e
configure: error: libxml2 is required
5 j) a  S, l3 Y8 E解决方法:
0 Z# `2 s8 _! o/ P* c) q
% |/ T/ O/ I. Y' Eyum install  libxml2 libxml2-devel
+ n: r% {" I* R4.执行 /opt/tengine/sbin/nginx -m 时有警告. \! F' b- C0 _6 U8 k; M

7 H) r) r, M7 @9 fTengine version: Tengine/2.1.0 (nginx/1.6.2)
( J8 Z4 t9 V8 S& L! \* fnginx: [warn] ModSecurity: Loaded APR do not match with compiled!# D. t1 l- f$ R9 W) t4 B
原因:modsecurity编译时和加载时的apr版本不一致造成的,并且会有以下error.log
  _9 t: n# q" s! a
( B1 M* w& e% y1 w9 n) M9 c2015/01/26 02:04:18 [notice] 29036#0: ModSecurity for nginx (STABLE)/2.8.0 () configured.
- r3 h& t9 c1 Z+ A2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: APR compiled version="1.5.0"; loaded     version="1.3.9"- @7 `" Z2 P+ O2 }# M* W1 r
2015/01/26 02:04:18 [warn] 29036#0: ModSecurity: Loaded APR do not match with compiled!
1 O$ \5 m( ?2 A, r8 Z( H, d  z, X2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: PCRE compiled version="7.8 "; loaded version="7.8 2008-09-05"" y( K% K6 Y% H* g0 s& ^% R8 D
2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: LIBXML compiled version="2.7.6"
; x$ I3 }& h2 C3 e" w2 l% x% D2015/01/26 02:04:18 [notice] 29036#0: Status engine is currently disabled, enable it by set SecStatusEngine to On.
; @+ n' G& w3 e( P解决方法,移除低版本的APR (1.3.9)
7 i0 Y# X. o' k+ d' {, Q# t5 |
! e* f# C0 o# ?' e. Pyum remove apr3 P$ L( G0 @6 d+ o3 c  _
5.Error.log中有: Audit log: Failed to lock global mutex6 i" r2 T5 ?4 O" G& a8 ?

! {; M4 ]1 N; b6 N9 b# Z/ q# \2015/01/26 04:15:42 [error] 61610#0: [client 10.11.15.161] ModSecurity: Audit log: Failed to lock     
+ P$ [% U" J* l  S( S. W# Iglobal mutex: Permission denied [hostname ""] [uri "/i.php"] [unique_id "AcAcAcAcAcAcAcA4DcA7AcAc"]
. b" H( N: a: o1 m解决方法:2 g+ b3 V2 M' s& E. k
编辑modsecurity.conf,注释掉默认的SecAuditLogType和SecAuditLog,添加以下内容:
! C. j; I: b3 V3 s. q0 o3 S+ ?
& ^+ J+ Y3 |. G5 q9 ISecAuditLogDirMode 0777( H- X& e! g  p3 F8 W* E3 ~
SecAuditLogFileMode 0550
$ g$ r1 w" |$ |$ h( Y- LSecAuditLogStorageDir /var/log/modsecurity8 ]% ], a# ~. K! O' o# j* Y
SecAuditLogType Concurrent2 @! k  t0 J4 p( T  w9 c  @
参考文章:
8 z) \* C  R, @% Vhttps://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#Installation_for_NGINX- b0 `. o' q* t' x7 l( M5 l" \
http://drops.wooyun.org/tips/2614
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-8-2 01:14 , Processed in 0.087869 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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