找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 12942|回复: 0

nginx配合modsecurity实现WAF功能

[复制链接]
发表于 2017-10-19 16:53:31 | 显示全部楼层 |阅读模式
modsecurity原本是Apache上的一款开源waf,可以有效的增强web安全性,目前已经支持nginx和IIS,配合nginx的灵活和高效,可以打造成生产级的WAF,是保护和审核web安全的利器。8 |+ Y$ N7 f- v" N2 G3 k  k7 Z6 [

2 M  w& c7 a5 U4 v. B一.准备工作
4 G5 W. K0 i/ m
5 m" z& {3 r, d系统:centos 6.5 64位、 tengine 2.1.0, modsecurity 2.8.0
: O7 ^& N8 c" `# G, R2 W1 u" [+ h1 N7 q- b5 D3 \
tengine : http://tengine.taobao.org/download/tengine-2.1.0.tar.gz
1 ^8 {2 |% c# a. o$ A7 z2 G; G
6 s% w0 p5 y# d* {% Y- `modsecurity for Nginx: https://www.modsecurity.org/tarball/2.8.0/modsecurity-2.8.0.tar.gz7 `. l; S% H8 a" a7 p. R/ d
9 w& b" T9 s; O1 f$ o
OWASP规则集: https://github.com/SpiderLabs/owasp-modsecurity-crs  b0 H: ?, |$ j# ?* g( H

8 ^4 k" \) `7 R+ V* @依赖关系:5 `# d% l" P# g8 M' ], g
tengine(nginx)依赖: pcre 、zlib、 openssl, 这三个包centos 6.5 系统源里都有:
+ Q& c* z* d. `7 r5 L
" S# C& \6 ]4 U$ K" Cyum install zlib zlib-devel openssl openssl-devel  pcre pcre-devel9 g. r! r4 E# p' `2 F8 }6 G( w
modsecurty依赖的包:pcre httpd-devel libxml2 apr8 R6 _6 l) _" p# X& c3 e+ g6 A
: K0 C  O' K; V6 \0 i" c+ d
yum install httpd-devel apr apr-util-devel apr-devel  pcre pcre-devel  libxml2 libxml2-devel" m3 b) x, R% v: `. I+ t2 m9 t
二.启用standalone模块并编译6 L+ Y. e1 s9 T! F' W

, E- L# E9 @" f& \; R下载modsecurity for nginx 解压,进入解压后目录执行:
, t) u3 B# W5 @8 n& z. g! v- F$ `9 \  a: o6 r
./autogen.sh- ?* S7 F( c* L5 p: }
./configure --enable-standalone-module --disable-mlogc
! F' Y, K) |6 b3 n+ C2 o% a& ^& h7 omake
& g: n. T3 h, _7 k! [' j3 k5 r三.nginx添加modsecurity模块5 X' a& [4 q4 B: D: g

) v. G6 x6 |4 k* w在编译standalone后,nginx编译时可以通过"--add-module"添加modsecurity模块:" w. }4 c3 Q: N% A- L+ J

% a% P7 ~0 ]$ B; _) {4 K0 j: b./configure --add-module=/root/modsecurity-2.8.0/nginx/modsecurity/  --prefix=/opt/tengine( N0 D$ J3 ^2 k# a( p
make && make install
1 W. U3 @* z- B8 [5 k# ?  a四.添加规则
. K! y. t! h/ y/ U1 a
# _+ C8 l, |0 f9 vmodsecurity倾向于过滤和阻止web危险,之所以强大就在于规则,OWASP提供的规则是于社区志愿者维护的,被称为核心规则CRS(corerules),规则可靠强大,当然也可以自定义规则来满足各种需求。4 l  Q9 b" `7 F- D

  l+ P; o. w  o( ]% K* h( i; W1.下载OWASP规则:" e4 n$ U' i$ O; t

) h: N6 G3 ]4 r/ b/ H& Wgit clone https://github.com/SpiderLabs/owasp-modsecurity-crs
8 h: x& K' b6 m
8 I% v: D+ [5 J7 ymv owasp-modsecurity-crs /opt/tengine/conf/& b2 Q' m* V' H# V0 }9 ]* D

* i: [8 ]/ N! d2 e5 ~% Hcd /opt/tengine/conf/owasp-modsecurity-crs && mv modsecurity_crs_10_setup.conf.example modsecurity_crs_10_setup.conf
* }! b+ {, t2 D2.启用OWASP规则:
' _) e- K6 X9 u4 q( P5 |% R1 p" _3 \8 F2 o0 J+ T0 W
复制modsecurity源码目录下的modsecurity.conf-recommended和unicode.mapping到nginx的conf目录下,并将modsecurity.conf-recommended重新命名为modsecurity.conf。" g$ W9 T3 o. u9 {9 i5 ]
; G7 k8 Q* \) r$ K1 a: ~7 |
编辑modsecurity.conf 文件,将SecRuleEngine设置为 on
' ]+ t9 w4 W* O5 [; r
! i: i3 A' T: a5 p5 j; @. y2 i$ X0 E2 S; uowasp-modsecurity-crs下有很多存放规则的文件夹,例如base_rules、experimental_rules、optional_rules、slr_rules,里面的规则按需要启用,需要启用的规则使用Include进来即可。2 h; L+ Z9 l5 d* V$ D9 y

- m: t, N! l7 J5 G6 RInclude owasp-modsecurity-crs/modsecurity_crs_10_setup.conf% c9 D( ~% m( {. v5 |. x$ q8 {
Include owasp-modsecurity-crs/base_rules/modsecurity_crs_41_sql_injection_attacks.conf
" A/ d1 n0 U! S+ i. [# kInclude owasp-modsecurity-crs/base_rules/modsecurity_crs_41_xss_attacks.conf
' k0 G. i. ?. U  C$ L1 a& vInclude owasp-modsecurity-crs/base_rules/modsecurity_crs_40_generic_attacks.conf
3 u+ N# F* T0 t1 e/ n$ w  \Include owasp-modsecurity-crs/experimental_rules/modsecurity_crs_11_dos_protection.conf4 F0 F* N9 R8 R8 Y" o1 l* F7 r
Include owasp-modsecurity-crs/experimental_rules/modsecurity_crs_11_brute_force.conf' e7 z6 _1 \* Q5 R- w9 R
Include owasp-modsecurity-crs/optional_rules/modsecurity_crs_16_session_hijacking.conf8 C1 I1 j' ]) D' Z5 v" |# A) Q
五.配置nginx  r& {8 ]" T& n
  w3 G2 o+ Q' q! {
在需要启用modsecurity的主机的location下面加入下面两行即可:
: r1 j; g  A( T# W+ B
4 ?$ T1 d9 U- C( K6 kModSecurityEnabled on;  
# \4 d4 R! d4 Y3 v, s5 dModSecurityConfig modsecurity.conf;
8 ]2 D: m* f! o! ^4 w8 O% j下面是两个示例配置,php虚拟主机:  E+ C8 f& z& V3 G  ?/ x

" U' y) W7 D6 V. h% D* u9 {7 @server {+ ?* F8 M1 X+ `: u/ u/ X+ ?
      listen      80;
$ y2 a  l! Z9 j3 C  g      server_name 52os.net www.52os.net;
5 c% u2 v  I! H) Q. G     ; t5 R& O: A, U( M- p: ~
      location ~ \.php$ {
  w; s: Z0 }5 \0 H" [      ModSecurityEnabled on;  ! ~% g( l. B# W' n
      ModSecurityConfig modsecurity.conf;# m! ?" ^2 f$ A) [4 _; M/ `3 s/ W

- |# n3 Z; I% @4 k; a. Q      root /web/wordpress;7 t$ S$ d) E5 o. N' }2 X* b* v, K
      index index.php index.html index.htm;2 P( r) @" o$ ~7 o
  6 z) L+ C0 b' F/ J
      fastcgi_pass   127.0.0.1:9000;: Q, }: Z$ S1 l, y
      fastcgi_index  index.php;( k5 ^. U2 y( H. l
      fastcgi_param  SCRIPT_FILENAME  $Document_root$fastcgi_script_name;. A7 K" ~! G& P
      include        fastcgi_params;2 {  E4 O4 i# B6 Y
      }7 K/ X% g* [6 ?1 t$ F' S! [1 j
  }
( a/ I; y4 d/ O5 p) ?: mupstream负载均衡:
/ z' {5 Z: q1 F) o
! i" j- T3 i. J- z9 jupstream 52os.net {, x5 J" O2 _& ?& t0 f; v
    server 192.168.1.100:8080;
7 l4 ^( b5 t, v    server 192.168.1.101:8080 backup;
# Y. X+ ?. Q9 y6 @8 K6 ?}
+ G6 Y8 q& z0 X" c; {4 p, h& e8 g4 l: N
server {* I) o* }' w/ L* L3 a
listen 80;: Z% M! L% E) f( [, K2 H- ~
server_name 52os.net www.52os.net;
" Y* a) Z: P9 o' _& @
, Z) B$ f, d3 Q& e& Zlocation / {% l6 p- u( N4 K
    ModSecurityEnabled on;  - a, d9 ?: J: T6 n* m: f. I
    ModSecurityConfig modsecurity.conf;  1 @' O4 B3 i( q: K+ m

" A9 n% x% `4 ]* u0 a$ ?7 d        proxy_pass http://online;
! A; G0 N  M  o+ W' I3 y4 i        proxy_redirect         off;! J% b* j5 ]9 o4 x- m8 c. c
        proxy_set_header Host $host;3 o5 S! }; S4 l4 `9 Y6 {
        proxy_set_header X-Real-IP $remote_addr;( g& l+ c: n! G3 _3 ^# Q! `
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
( x$ C! |' \( }! K! X" _5 t    }- F) I1 I0 S1 [( j6 h+ S
}$ C- w8 v. N9 |! E4 F( n4 q1 [
六.测试, ~! M; O  H" D# p# P+ N! q4 P$ P

$ \) O4 U! j; J- Q+ k, c$ o" |9 p# b, O0 }我们启用了xss和sql注入的过滤,不正常的请求会直接返回403。以php环境为例,新建一个phpinfo.php内容为:6 h( {# |/ i( m1 t# V2 `; P! Q
$ X& D# `6 J! U7 t$ e! }
<?php( ~4 q. Y* V5 {3 J' X( b& W+ m2 ]
    phpinfo();   
" w* W' q! W+ C9 S; [, }?>
6 B* H0 N; |  b$ o在浏览器中访问:
) l4 a4 f8 g0 V1 u, n6 l3 b0 L4 `3 H1 f0 C
http://www.52os.net/phpinfo.php?id=1 正常显示。; p+ o! D, o/ [; }: i3 I0 W
http://www.52os.net/phpinfo.php?id=1 and 1=1  返回403。  m: F0 F" ]' h  {+ [# O
http://www.52os.net/phpinfo.php?search=<scritp>alert('xss');</script>  返回403。
1 ^* c5 }. T1 N! Y9 P7 E) Y0 Q/ ]0 I0 q/ ?说明sql注入和xss已经被过滤了
/ n0 O7 ]6 r1 K! O) L& n* I! P$ Z4 c4 i# M4 j' U! Z# V7 a
七、安装过程中排错
! Q2 v& N5 I& x7 ~6 C( G* {9 E# ]. Z. `+ [; u
1.缺少APXS会报错( D7 L; E' ~7 G, ?$ u. [) y

) d6 Q1 f: L: Tconfigure: looking for Apache module support via DSO through APXS  V. f* c* J# J( O1 U
configure: error: couldn't find APXS6 _! G- j8 a- X* U+ P/ r- O* q
apxs是一个为Apache HTTP服务器编译和安装扩展模块的工具,用于编译一个或多个源程序或目标代码文件为动态共享对象。
  k/ p( k5 h' A1 ?解决方法:
! \6 d5 y1 o3 X( P) p$ A1 l! W) v# f4 d, p( O8 M
yum install httpd-devel" L  W% Z: V  u) {) A, n6 `
2.没有pcre: A2 ^$ d2 p% M7 P1 i

, c4 [1 d4 C9 i0 [+ @% a7 Q- I0 Kconfigure: *** pcre library not found.7 [2 b2 m8 Z) k$ i' K
configure: error: pcre library is required
" b' w3 @! q# p* k* G* F/ Q2 f5 c解决方法:$ n( s& }, |% T0 ^+ U5 J* `
/ W5 R+ I2 R. N# Z
yum install pcre pcre-devel1 N% l  w1 d( T) c" ]! G. s% |
3.没有libxml2
* g! [( g. H: N& f5 [$ [( _% }) p' L3 h; t

' E+ R) i5 v7 T7 wconfigure: *** xml library not found.
) f8 f0 g: ], \configure: error: libxml2 is required
" ?3 G6 P$ J( q0 O解决方法:: r# L' z! c5 e
$ b8 p' q: ?7 ^8 \1 s
yum install  libxml2 libxml2-devel
3 u0 S/ b  J# u3 o4 f5 L- x- d" C4.执行 /opt/tengine/sbin/nginx -m 时有警告; I+ I0 F9 k* f; p+ a- }/ H
' {: F4 V- u+ b2 q! s, f
Tengine version: Tengine/2.1.0 (nginx/1.6.2)4 N5 }% a, Z8 u. s5 I1 J4 \8 h
nginx: [warn] ModSecurity: Loaded APR do not match with compiled!
! i! N  W9 P& `- D8 L原因:modsecurity编译时和加载时的apr版本不一致造成的,并且会有以下error.log$ j+ R3 b1 G( P3 I0 Z
& Q1 ~: Z& D$ v: j: o2 U! z! O
2015/01/26 02:04:18 [notice] 29036#0: ModSecurity for nginx (STABLE)/2.8.0 () configured.
) t0 G+ @2 L5 K: V! b; T5 _, e" A2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: APR compiled version="1.5.0"; loaded     version="1.3.9"
" M3 q3 ?# E& e; l5 P  q# b) H2015/01/26 02:04:18 [warn] 29036#0: ModSecurity: Loaded APR do not match with compiled!
! ~2 ^; a, W; O- j- E, N7 x, _6 W2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: PCRE compiled version="7.8 "; loaded version="7.8 2008-09-05"
7 O, L! k3 t$ k+ A9 G0 P2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: LIBXML compiled version="2.7.6"! q" R9 g2 n" b! u, ]- j# M% Z
2015/01/26 02:04:18 [notice] 29036#0: Status engine is currently disabled, enable it by set SecStatusEngine to On.; M9 B7 G1 a0 c
解决方法,移除低版本的APR (1.3.9)
& E7 }- W# M, ]. l( d- H& ]* k
, z- C( l1 ]) @$ D, ^6 r' a' ^yum remove apr
4 Q: A& i$ P  y7 _+ H# T5.Error.log中有: Audit log: Failed to lock global mutex& i8 ~. m. W9 C! ^1 q+ R, J
- n9 H) ]; |% Q2 j1 C1 Z
2015/01/26 04:15:42 [error] 61610#0: [client 10.11.15.161] ModSecurity: Audit log: Failed to lock     # y" S8 V$ Q$ r) C8 d( S- c
global mutex: Permission denied [hostname ""] [uri "/i.php"] [unique_id "AcAcAcAcAcAcAcA4DcA7AcAc"]
/ Y: q( ]: M( o+ Q解决方法:
' Z& g: H- g: o  d8 d+ n: a编辑modsecurity.conf,注释掉默认的SecAuditLogType和SecAuditLog,添加以下内容:3 ]6 o1 K4 W9 L, f: m7 ]/ [' ?; g

+ I" S6 L$ a+ c( |8 I  u; QSecAuditLogDirMode 07775 m8 V- x" A) }* M% f( y- V
SecAuditLogFileMode 0550
7 b/ o/ K0 ]- {- @SecAuditLogStorageDir /var/log/modsecurity7 D$ M1 b: X- t$ e' e5 K
SecAuditLogType Concurrent
1 V7 C# {; M. n7 e) v参考文章:
  @' F* ^4 G7 y7 _# @/ w2 ahttps://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#Installation_for_NGINX' l5 k* X6 U, ~( `3 W3 Q+ {
http://drops.wooyun.org/tips/2614
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-10-28 05:57 , Processed in 0.061238 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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