找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 12493|回复: 0

nginx配合modsecurity实现WAF功能

[复制链接]
发表于 2017-10-19 16:53:31 | 显示全部楼层 |阅读模式
modsecurity原本是Apache上的一款开源waf,可以有效的增强web安全性,目前已经支持nginx和IIS,配合nginx的灵活和高效,可以打造成生产级的WAF,是保护和审核web安全的利器。6 n2 r7 m+ t/ l# _3 r8 k- o
4 U4 a, I6 T: k  s. R
一.准备工作3 W9 R" M- L9 y5 L* q2 y4 M2 @( I

1 J& ?$ A( C+ y+ S- o/ m系统:centos 6.5 64位、 tengine 2.1.0, modsecurity 2.8.0* _% d6 T) B, p" N* ?3 e9 r4 f
! y9 W& i  h. Q/ k, A* ]
tengine : http://tengine.taobao.org/download/tengine-2.1.0.tar.gz. G/ |6 Z1 E1 s; g* O
8 t, c/ G& f7 X& w$ s5 n; u9 A: U  Q
modsecurity for Nginx: https://www.modsecurity.org/tarball/2.8.0/modsecurity-2.8.0.tar.gz
- N7 H) ?, {2 B5 Z1 @2 @" U9 }$ R+ w7 i" ~% \6 @* c" I; r$ }
OWASP规则集: https://github.com/SpiderLabs/owasp-modsecurity-crs
* C7 O4 d9 z6 ?0 A9 f
) j0 Y- F+ E1 _9 c6 a3 E  V依赖关系:. f8 q6 @0 A* n: ~" P: T
tengine(nginx)依赖: pcre 、zlib、 openssl, 这三个包centos 6.5 系统源里都有:' S6 B( x8 _/ S+ t* W
( n  N/ X5 d1 S2 c" X
yum install zlib zlib-devel openssl openssl-devel  pcre pcre-devel
: w; }* |1 I. _! n$ }modsecurty依赖的包:pcre httpd-devel libxml2 apr
& j) |: k0 f8 y& q9 r8 k
: P) Z( B" R+ b; j9 Z: |* g2 Hyum install httpd-devel apr apr-util-devel apr-devel  pcre pcre-devel  libxml2 libxml2-devel- b: F, c* q1 D
二.启用standalone模块并编译
* X; C3 U2 t1 B2 Y. P3 u+ h+ K; t  T9 {+ u" @
下载modsecurity for nginx 解压,进入解压后目录执行:
. I/ m: U. Y% m( c$ m: Q' P- J; N& O' c; ^
./autogen.sh2 L8 w( E4 _, h  A) w: R9 x
./configure --enable-standalone-module --disable-mlogc3 M6 {0 a3 a) V: q. v, q; D2 W
make $ G, k3 x: \5 a9 t
三.nginx添加modsecurity模块
: |3 T  r9 |& g2 f9 z/ {7 w4 I' A( ~1 p
在编译standalone后,nginx编译时可以通过"--add-module"添加modsecurity模块:
  h8 E8 I4 S" K0 E; d3 M9 v7 \4 `; r+ D1 _6 h* X
./configure --add-module=/root/modsecurity-2.8.0/nginx/modsecurity/  --prefix=/opt/tengine- f0 E2 R4 u8 ?' h5 K2 d
make && make install
6 S9 |2 r5 z( U6 E, F四.添加规则
2 L2 ?5 Q: ~1 W0 I
! h, a+ }9 k& L2 wmodsecurity倾向于过滤和阻止web危险,之所以强大就在于规则,OWASP提供的规则是于社区志愿者维护的,被称为核心规则CRS(corerules),规则可靠强大,当然也可以自定义规则来满足各种需求。
. ^7 ?! o0 S* J7 i
# k; A0 G2 z8 w: t' l9 N7 H9 ~1.下载OWASP规则:
4 }2 t/ }' p" w- `1 O. e/ U$ c+ i
. A/ r" J; j- t" v+ p1 sgit clone https://github.com/SpiderLabs/owasp-modsecurity-crs. k  p. `( Y+ I& w7 [- k( Z* \3 n% v

, j7 Q3 E4 p1 h. ^, V6 omv owasp-modsecurity-crs /opt/tengine/conf/
# b1 Z, L1 P/ V6 l- \) L5 l4 G/ N' o, b# v6 F8 C
cd /opt/tengine/conf/owasp-modsecurity-crs && mv modsecurity_crs_10_setup.conf.example modsecurity_crs_10_setup.conf  N8 @4 D! w* x- X" b# v
2.启用OWASP规则:
3 S/ R6 m8 ^$ \9 M% {
# J. x/ Y  k7 t# k& e4 C! _$ m+ `复制modsecurity源码目录下的modsecurity.conf-recommended和unicode.mapping到nginx的conf目录下,并将modsecurity.conf-recommended重新命名为modsecurity.conf。4 K+ b* x6 T5 f( H6 a6 E; r' K
" ]  }6 B; H  S
编辑modsecurity.conf 文件,将SecRuleEngine设置为 on
7 J- j/ f6 l6 ~$ B( J/ `6 I: U* k" }! D4 Q
owasp-modsecurity-crs下有很多存放规则的文件夹,例如base_rules、experimental_rules、optional_rules、slr_rules,里面的规则按需要启用,需要启用的规则使用Include进来即可。
0 I  q/ U3 J4 n: H5 L
% S! ^5 F4 k7 _% v3 r0 q: DInclude owasp-modsecurity-crs/modsecurity_crs_10_setup.conf  k  |2 p$ l1 ^4 H7 q7 B/ T( [
Include owasp-modsecurity-crs/base_rules/modsecurity_crs_41_sql_injection_attacks.conf
1 n, i3 d: D# x" @" yInclude owasp-modsecurity-crs/base_rules/modsecurity_crs_41_xss_attacks.conf9 `& t; v3 G2 b8 w3 V
Include owasp-modsecurity-crs/base_rules/modsecurity_crs_40_generic_attacks.conf5 t) U0 d: t$ e9 \- g+ ^
Include owasp-modsecurity-crs/experimental_rules/modsecurity_crs_11_dos_protection.conf3 u' r' j  [1 S( V9 ~- `' g3 s
Include owasp-modsecurity-crs/experimental_rules/modsecurity_crs_11_brute_force.conf9 |  |8 z4 X( R* q
Include owasp-modsecurity-crs/optional_rules/modsecurity_crs_16_session_hijacking.conf
5 v( C7 m7 d0 i' y/ z五.配置nginx8 f0 k: j; k$ ~
: ^2 S- b/ V2 O) x. Q
在需要启用modsecurity的主机的location下面加入下面两行即可:
. j' T" N9 M5 ^% o  P+ e2 y# `9 |% y6 C5 ]' A9 a/ g
ModSecurityEnabled on;  - y6 }  i) u8 s& P1 P( S! B( q2 n3 [
ModSecurityConfig modsecurity.conf;
) n4 |. z' N: T- K4 P. K下面是两个示例配置,php虚拟主机:
: K& i3 M/ _: u! W
' W- j* `! E  \server {$ J% l0 e: l. ^7 y& R
      listen      80;1 {' U8 b7 V$ f6 H# |  u+ d$ ?
      server_name 52os.net www.52os.net;/ m+ u/ K- _/ S7 t5 G
     . a2 E6 |7 |: B" a5 o* {
      location ~ \.php$ {7 p0 `4 `: [3 @& k, R
      ModSecurityEnabled on;  8 g, u- w! b# ~1 |2 J) m9 R
      ModSecurityConfig modsecurity.conf;- t* b" u% W3 G/ @3 B9 T
. I4 L1 U. O# ^9 \% Q% V3 F( K
      root /web/wordpress;
2 A, X! {3 \) F- K7 B. d3 T      index index.php index.html index.htm;
- o9 ]& b3 M5 t5 F' _$ b( E  
# t. }( _' P' j2 U      fastcgi_pass   127.0.0.1:9000;( W: \3 s: b; V
      fastcgi_index  index.php;
- C5 H1 }- c! S1 {      fastcgi_param  SCRIPT_FILENAME  $Document_root$fastcgi_script_name;; a& T3 Z  ]9 I/ `, b% U0 e
      include        fastcgi_params;8 Q, R# f) Y2 m0 K: C# x8 X) E* m- |
      }) K/ C9 q" [$ u) }, ?' A+ i
  }
+ U8 E4 x. y2 G$ u- D* Bupstream负载均衡:; i# @5 {. T2 U
% P/ ?9 J. v* ~
upstream 52os.net {
. |( b% y/ Y6 M* a! S; o    server 192.168.1.100:8080;8 S6 f# `7 r) a* k& c
    server 192.168.1.101:8080 backup;+ D* y# Y) f. X+ j" V
}% k5 p# Y% W  t8 ?% X+ I7 o

) }+ _8 ~; D7 u  y1 l) E3 eserver {& c, F; O; g5 q2 S- `6 G6 G7 O7 v
listen 80;
2 h5 f' S4 `+ A4 e3 ]4 b- Bserver_name 52os.net www.52os.net;
- C1 u* E1 n* A( L. D& o+ _: _& i" E; R5 i" F* @2 g
location / {, h2 \9 v8 D5 W) e
    ModSecurityEnabled on;  
6 I- q# D2 r6 K    ModSecurityConfig modsecurity.conf;  - t) e8 Z/ U% ^/ y8 f  o
8 w* w$ b, }. e" [) s
        proxy_pass http://online;
: [( C* A$ o1 b' X7 V  e5 d- `% }        proxy_redirect         off;# c, U. l. I$ s$ }: h) E
        proxy_set_header Host $host;
+ d% g5 [1 e% @6 \3 I$ {% q( S) B        proxy_set_header X-Real-IP $remote_addr;5 H9 `( e, J9 U$ s. v
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;+ q2 e- v* x7 n! ~
    }$ m* q7 O2 L. q) o0 `' }# _  [, V
}) L7 Q9 ^& j/ @" T: [0 T0 a
六.测试5 G; i& C6 R4 F1 A/ |

, c) z% l5 B4 H5 d我们启用了xss和sql注入的过滤,不正常的请求会直接返回403。以php环境为例,新建一个phpinfo.php内容为:6 `7 A# n( J9 O( D/ s4 p% m- y) ?

! _6 o9 C3 K. p0 ^/ e: C. R6 A, P2 e<?php
& V& n( [+ @" o- C: F, t! ?    phpinfo();    * t! f- S% n6 l- n8 j
?>! h2 g0 Y' e2 w8 u4 Y2 l( T8 G6 [
在浏览器中访问:- Y/ {& p& @" y% f% j9 I1 C" y
1 C, ]6 M$ W' [+ ~
http://www.52os.net/phpinfo.php?id=1 正常显示。
1 ?% V% d! O0 |http://www.52os.net/phpinfo.php?id=1 and 1=1  返回403。
7 c! B6 M. K; O5 Shttp://www.52os.net/phpinfo.php?search=<scritp>alert('xss');</script>  返回403。
$ Z% y1 N9 a; T4 F! f" i说明sql注入和xss已经被过滤了- `3 ^4 @! v% Q; v9 \  A
0 O* m0 m8 y+ p$ O' r
七、安装过程中排错
  Z$ M/ F& l! q9 Z$ c* W' |, v8 ?
1.缺少APXS会报错; O3 H6 z. e  ?) }( u/ b) |9 _

7 a" ]+ M+ u0 `+ W" }# d! Sconfigure: looking for Apache module support via DSO through APXS6 A( q% Y& V+ ?
configure: error: couldn't find APXS+ G  @! l2 L' {: R0 l
apxs是一个为Apache HTTP服务器编译和安装扩展模块的工具,用于编译一个或多个源程序或目标代码文件为动态共享对象。5 S1 ^5 |7 l: a( P- z- U
解决方法:- {9 b3 e7 D& X+ l
, I. h, k' Q0 A8 @! y  R3 @9 u+ M
yum install httpd-devel
" m3 Z1 o0 h: e) Q2 o& B3 T6 P' ]2.没有pcre+ d) d6 p5 |( f: E: E( |
5 P- H2 C" Q( N7 t& [" U
configure: *** pcre library not found./ n, Z4 i# Y6 _0 I
configure: error: pcre library is required9 @5 U0 L' Z+ j/ Q0 y2 e
解决方法:
6 {1 z4 a1 ?3 @" H9 ^6 Z" A  N) H
0 R2 [$ J4 t5 ?0 zyum install pcre pcre-devel; ]* E5 M7 [& e' g& B
3.没有libxml2
6 J$ h; a$ \& _. A1 M4 W" w5 R& `/ d, y
$ s, k% \! ~+ d' G( C
configure: *** xml library not found.
- Q+ U8 ^# M' d/ X7 e. t. Q* U% Lconfigure: error: libxml2 is required
% p* z8 s4 [/ Q0 U解决方法:
8 X$ G0 q8 n) P& ^9 y/ Q* f0 p* O! b% d
yum install  libxml2 libxml2-devel: X( C: X# a4 k% [2 a- {/ i
4.执行 /opt/tengine/sbin/nginx -m 时有警告
; r' X+ D) I& J% R4 L4 Z+ J$ B* x9 s/ {
Tengine version: Tengine/2.1.0 (nginx/1.6.2)
, ^; |! ^9 Z: h- p) Lnginx: [warn] ModSecurity: Loaded APR do not match with compiled!( E* B: G* P/ _! o. [
原因:modsecurity编译时和加载时的apr版本不一致造成的,并且会有以下error.log5 O  h1 o/ A( @# p% _- d, D) W

! `5 ]* Q. }; e( q9 f( ]2015/01/26 02:04:18 [notice] 29036#0: ModSecurity for nginx (STABLE)/2.8.0 () configured.
$ Y; M) H7 x5 i' H! f2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: APR compiled version="1.5.0"; loaded     version="1.3.9"9 I2 Y' [7 h. u! c) _; c
2015/01/26 02:04:18 [warn] 29036#0: ModSecurity: Loaded APR do not match with compiled!
0 Y( l% C  r6 g9 e5 V2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: PCRE compiled version="7.8 "; loaded version="7.8 2008-09-05"
7 C5 G5 D' g4 N' a# K2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: LIBXML compiled version="2.7.6"
' ^7 ~2 q) G% F) w2015/01/26 02:04:18 [notice] 29036#0: Status engine is currently disabled, enable it by set SecStatusEngine to On.9 p; E% a* l5 g* `# H$ e
解决方法,移除低版本的APR (1.3.9). }3 U4 T" M8 a  T
: T& }4 ~# `/ _1 t. |
yum remove apr
0 y( F9 R, G4 [9 w) L* V+ r5 T5.Error.log中有: Audit log: Failed to lock global mutex5 C1 F; d7 D7 k9 |  x

/ U+ K7 O( Y6 E5 e2015/01/26 04:15:42 [error] 61610#0: [client 10.11.15.161] ModSecurity: Audit log: Failed to lock     , j! |. U' }6 Q
global mutex: Permission denied [hostname ""] [uri "/i.php"] [unique_id "AcAcAcAcAcAcAcA4DcA7AcAc"]
: _& n1 }! V) J, V解决方法:0 V9 ^3 \! n9 Y; N3 |: l, d
编辑modsecurity.conf,注释掉默认的SecAuditLogType和SecAuditLog,添加以下内容:
$ Z+ j3 f3 r$ Z0 c7 f
, ~% Y, ?+ n# l# q+ ]* wSecAuditLogDirMode 0777
9 H- F$ H2 k$ B8 X# bSecAuditLogFileMode 05505 Q5 Z6 {1 V( k3 {' Y0 q- G
SecAuditLogStorageDir /var/log/modsecurity1 w( P2 t# _3 f/ \- @
SecAuditLogType Concurrent# _2 _% `8 ~8 V) H
参考文章:. Q1 B/ S" L* }5 p  p
https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#Installation_for_NGINX
) ~5 M% u. c/ V6 {2 |http://drops.wooyun.org/tips/2614
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-9-10 07:53 , Processed in 0.074950 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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