找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 11862|回复: 0

nginx配合modsecurity实现WAF功能

[复制链接]
发表于 2017-10-19 16:53:31 | 显示全部楼层 |阅读模式
modsecurity原本是Apache上的一款开源waf,可以有效的增强web安全性,目前已经支持nginx和IIS,配合nginx的灵活和高效,可以打造成生产级的WAF,是保护和审核web安全的利器。7 o1 F5 Q" Q/ p4 {) e
. ]) s, x5 C8 h4 @% o2 ?
一.准备工作& d. @* @5 n  y- H- _

: y& ?! u/ w: C) Y( d系统:centos 6.5 64位、 tengine 2.1.0, modsecurity 2.8.0
" N( R& k9 e5 U% l$ C$ _4 Z* \1 u5 B- F( X' `2 _& J  S/ n
tengine : http://tengine.taobao.org/download/tengine-2.1.0.tar.gz
, }& i! x5 h( J- \3 A5 i0 \! }! D/ r' |+ P* B
modsecurity for Nginx: https://www.modsecurity.org/tarball/2.8.0/modsecurity-2.8.0.tar.gz: ^* _) g; t7 Z
" `3 m3 W: [  v: U2 P' b% X
OWASP规则集: https://github.com/SpiderLabs/owasp-modsecurity-crs
/ W2 i8 \, r& [8 R( A- I" h6 a6 U& F
依赖关系:6 h4 n1 [1 f9 b2 S) D+ O8 [  r" Q
tengine(nginx)依赖: pcre 、zlib、 openssl, 这三个包centos 6.5 系统源里都有:
& Y  D% [( T, ~7 D" U) `( H) _. x4 i, {8 y
yum install zlib zlib-devel openssl openssl-devel  pcre pcre-devel
. {% a# I' ^! W( A1 m3 Emodsecurty依赖的包:pcre httpd-devel libxml2 apr1 u+ P. G7 |) @) y2 E# h' @, c

+ X6 _( c* {( \: Cyum install httpd-devel apr apr-util-devel apr-devel  pcre pcre-devel  libxml2 libxml2-devel& U$ @& E4 c$ r% [9 ^* z
二.启用standalone模块并编译
4 v) u, G: g1 K  T) v5 P+ n# R
# c7 \* N% h' c. W; Q" ^下载modsecurity for nginx 解压,进入解压后目录执行:2 \' U7 b- e. U2 g
9 m5 _/ i5 g- e. y4 Y; D0 ]1 d
./autogen.sh
# M# D: x$ h7 R2 F( I2 A./configure --enable-standalone-module --disable-mlogc
. ~+ _$ W/ y0 {( h  ~make
( B3 [  g  C' Y三.nginx添加modsecurity模块+ ]& z$ B: |1 J4 j% e. U

. l2 P  q6 E9 e: Y5 f" V在编译standalone后,nginx编译时可以通过"--add-module"添加modsecurity模块:" r% h, R6 k  s; T7 t: I5 {

3 F1 t' A9 b) g./configure --add-module=/root/modsecurity-2.8.0/nginx/modsecurity/  --prefix=/opt/tengine6 H' Z% a9 m8 ~, I& j! D
make && make install9 U1 _! L) [0 N  u" R
四.添加规则
4 t0 E* Y: G; \/ d- v% g1 N  y
$ ?( R* `0 }7 |. E8 D3 q, j) umodsecurity倾向于过滤和阻止web危险,之所以强大就在于规则,OWASP提供的规则是于社区志愿者维护的,被称为核心规则CRS(corerules),规则可靠强大,当然也可以自定义规则来满足各种需求。1 ]  x5 s- i2 C" M: a' p

9 Y# T* \9 s) o3 {1 l+ Y: A4 F$ A1.下载OWASP规则:
5 h, a* ]  ~; w; m
5 M  X% P7 N2 H2 s8 X1 ?& Tgit clone https://github.com/SpiderLabs/owasp-modsecurity-crs
: z+ U- [2 e& X  b; m  X( M( H. \3 K8 h0 ]1 O
mv owasp-modsecurity-crs /opt/tengine/conf/5 j# r4 V" a* M1 v

6 y/ o5 C/ ]+ q: ~7 q0 F+ M6 ocd /opt/tengine/conf/owasp-modsecurity-crs && mv modsecurity_crs_10_setup.conf.example modsecurity_crs_10_setup.conf
# n( e1 \- f& D' p2.启用OWASP规则:! q1 n( R2 h- ?; r) V8 D, O' u/ G. P

5 Y$ X5 U! U5 K* t4 ^, z. r4 q复制modsecurity源码目录下的modsecurity.conf-recommended和unicode.mapping到nginx的conf目录下,并将modsecurity.conf-recommended重新命名为modsecurity.conf。
# `1 y: W  a: O
( ~+ j; P* j3 z5 N3 F. t编辑modsecurity.conf 文件,将SecRuleEngine设置为 on. I. |) x/ b/ p/ Q

) Y( r* f1 x6 I, N# [& Sowasp-modsecurity-crs下有很多存放规则的文件夹,例如base_rules、experimental_rules、optional_rules、slr_rules,里面的规则按需要启用,需要启用的规则使用Include进来即可。' m9 v7 c% l" W$ z6 z1 r
& ^0 L! L$ H% I$ o$ F0 V  q
Include owasp-modsecurity-crs/modsecurity_crs_10_setup.conf
5 K& v5 Q' k0 z% FInclude owasp-modsecurity-crs/base_rules/modsecurity_crs_41_sql_injection_attacks.conf
* ]2 n! E" l5 t2 n5 ZInclude owasp-modsecurity-crs/base_rules/modsecurity_crs_41_xss_attacks.conf
0 s7 R) e5 ^- p1 |Include owasp-modsecurity-crs/base_rules/modsecurity_crs_40_generic_attacks.conf8 b# t. h9 U! r- s2 g
Include owasp-modsecurity-crs/experimental_rules/modsecurity_crs_11_dos_protection.conf+ ]' J+ d1 g  o/ D' j. N) K
Include owasp-modsecurity-crs/experimental_rules/modsecurity_crs_11_brute_force.conf% d/ p& N) e) X1 q: C& B! Y6 v! u3 e
Include owasp-modsecurity-crs/optional_rules/modsecurity_crs_16_session_hijacking.conf* p' T8 t6 U8 q- F
五.配置nginx
+ m( U9 j  _+ S0 V- X$ o  T- ?5 e/ _" J8 S
在需要启用modsecurity的主机的location下面加入下面两行即可:. z2 Z# J3 d/ w4 F" h
0 N' c9 A9 n2 q* m" [9 L
ModSecurityEnabled on;  
6 L3 \& M" U5 F) J7 {2 }ModSecurityConfig modsecurity.conf;
  a. D3 b/ e6 t下面是两个示例配置,php虚拟主机:: M4 ]) K3 J' V  u5 a
' l7 Z: G/ a) W/ Z0 J- w7 y- k  ^* n
server {
- W  I. D; ]1 \& T; L      listen      80;
, ^% t, z4 \+ r/ m& L      server_name 52os.net www.52os.net;  h( G. ^, P/ }5 l: M
     
9 V5 {, z$ P' M$ ?2 ?: U* j      location ~ \.php$ {
; E0 s! x$ E" v# a* _6 v# z; ]      ModSecurityEnabled on;  
/ f3 ^" b5 j* x8 c& ]' b. l      ModSecurityConfig modsecurity.conf;
: M2 f* d1 o* Q3 U3 ^0 C; j3 |% ^1 ~1 _* T5 r) w
      root /web/wordpress;: w( e! t. _* S% O1 i* i# U
      index index.php index.html index.htm;
8 u) H& ^6 T' [: {* q" ]- f- W  + l5 k* m- u/ X! ?) `0 p
      fastcgi_pass   127.0.0.1:9000;' P6 H9 t" r2 _/ v. i; D. z
      fastcgi_index  index.php;
8 \' k; k4 }% a0 |9 T: y" K+ X' y      fastcgi_param  SCRIPT_FILENAME  $Document_root$fastcgi_script_name;
  Z4 T. s' s6 e$ p. q' L      include        fastcgi_params;
4 E0 W, o, A' [$ G) r      }2 [% W* r9 L1 @4 S+ q
  }
8 `  U6 P1 |  A5 Yupstream负载均衡:
* n% [# A% i9 {6 @# d
1 {' u9 t6 H  L# r/ hupstream 52os.net {
) O3 M( ~7 f) i6 F    server 192.168.1.100:8080;3 S, R/ K8 v* [5 [+ Z4 l: w
    server 192.168.1.101:8080 backup;; d; f( \* c- g$ K, e5 B  U
}  P  ]3 F$ E7 J$ z5 K/ O+ L' O: i

9 [" b# q" L7 }server {% O6 u; A3 M" E9 N
listen 80;1 S) P# H, k7 |( N
server_name 52os.net www.52os.net;7 _/ `( S7 ]- n4 D& G4 ~: m% ~, L9 s
- \* k" F% D" R. @% p8 |% E  w3 Z) c
location / {
9 m7 h8 R* {0 e7 b    ModSecurityEnabled on;  
; F. d6 X7 A# G, B$ \+ {1 y  D; U    ModSecurityConfig modsecurity.conf;  
# p! N2 [4 S9 S$ Y: \- }6 f4 [1 B# s2 @; z3 q: w/ x
        proxy_pass http://online;
# @8 l# Y2 i+ Y; F0 U" H+ S        proxy_redirect         off;
1 ]# Z! |6 h% X7 j        proxy_set_header Host $host;; y7 [) S7 J/ Q. ^, k; D
        proxy_set_header X-Real-IP $remote_addr;' w1 W& V4 a3 A' k. a: m
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;  m6 l$ c6 P( f; ?
    }
& [) M, U. |# V7 S) p}
* `8 w1 g7 n( }. {/ y0 A0 v六.测试
. B/ I0 L) J/ q% i9 c) O' u3 U0 b- l4 g$ C% Z' \
我们启用了xss和sql注入的过滤,不正常的请求会直接返回403。以php环境为例,新建一个phpinfo.php内容为:
' G( e7 Y# w, J# m; y- i8 n6 P- n
<?php
* ?* @/ ~8 k" D" l( |2 D+ q, w2 r    phpinfo();   
* j! z  U7 f% w1 C9 W/ k?>
% y2 d! M. p  L1 S2 i在浏览器中访问:
# x8 T+ ~- z- q; e) T: h: p! _6 u& ^7 R8 k& E0 T: ^
http://www.52os.net/phpinfo.php?id=1 正常显示。
9 O" p1 o. ?0 B% X& _http://www.52os.net/phpinfo.php?id=1 and 1=1  返回403。
$ ^. l3 T4 W# y/ Jhttp://www.52os.net/phpinfo.php?search=<scritp>alert('xss');</script>  返回403。
/ |* O% ]0 M) F说明sql注入和xss已经被过滤了
) Z7 c$ `4 x2 f% `. B6 J( L. Q) Z- k9 z
七、安装过程中排错
# p$ i4 h: u5 t  I3 t, B
5 q2 Z" n$ }. J1.缺少APXS会报错0 J: D2 L; X, M. A
7 Y$ J3 K- z2 T6 s2 C
configure: looking for Apache module support via DSO through APXS
* w) D+ A7 X  S& Q$ F: yconfigure: error: couldn't find APXS
; ]. q5 D" X5 aapxs是一个为Apache HTTP服务器编译和安装扩展模块的工具,用于编译一个或多个源程序或目标代码文件为动态共享对象。- X9 V2 J: u, u2 k; f; b
解决方法:
4 C8 L. b2 o! f$ a& I7 ~* P' @0 R
yum install httpd-devel* T3 d" ~0 y0 g+ N0 E' @& |- c
2.没有pcre
! }/ i- S! p. F- y4 H& u2 l; R7 K  S) u( Q! B' w# d
configure: *** pcre library not found.' O3 W( ^4 ~: \4 T4 s
configure: error: pcre library is required  o* R; j3 p" P& ^& R# O, u
解决方法:
3 J0 H  }. e4 k% \9 ~# }, T$ v4 j) i( N8 R! p0 Q2 m1 _/ |, _4 `4 y0 y' y, D
yum install pcre pcre-devel1 A6 M. N! i' b: s  p; Z# i- B
3.没有libxml2; j( _$ E  y- ?  z) }8 V! P
4 j: H% k! Q3 N1 }

( i  Y  f, N7 i2 V) @configure: *** xml library not found.
& `  W" Z( P7 N& v) V$ [' econfigure: error: libxml2 is required
  b1 }  E. n3 [, D: X" p2 |0 t7 T解决方法:
% g( e% W) a; O
  L3 s, X- Q) \# o" W% uyum install  libxml2 libxml2-devel
# T& z# w. R% }/ z3 y& Q: ?4.执行 /opt/tengine/sbin/nginx -m 时有警告
2 J& f9 ~5 \8 p4 M9 ]) i+ D) i3 I: o! t
Tengine version: Tengine/2.1.0 (nginx/1.6.2)
% ]8 V5 B; W; m# b, W8 e0 |5 enginx: [warn] ModSecurity: Loaded APR do not match with compiled!
0 b6 `& g6 O4 v' R$ X6 ^原因:modsecurity编译时和加载时的apr版本不一致造成的,并且会有以下error.log
# ]# M& d9 d0 _8 x8 R( j3 t6 J3 w) A$ v7 {; L! h( M* g
2015/01/26 02:04:18 [notice] 29036#0: ModSecurity for nginx (STABLE)/2.8.0 () configured." V4 c3 a6 X- S4 i
2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: APR compiled version="1.5.0"; loaded     version="1.3.9"- N9 f8 d, m8 g, `# t# t2 R& x
2015/01/26 02:04:18 [warn] 29036#0: ModSecurity: Loaded APR do not match with compiled!# V; E# J3 m8 d" [# P
2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: PCRE compiled version="7.8 "; loaded version="7.8 2008-09-05"' Z1 h+ k$ M. o( ]9 a5 i, l
2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: LIBXML compiled version="2.7.6"
" W) Y, ^$ M0 K2015/01/26 02:04:18 [notice] 29036#0: Status engine is currently disabled, enable it by set SecStatusEngine to On.
; m7 J; k  z8 X$ @4 O; I0 o. q解决方法,移除低版本的APR (1.3.9)
8 u( K1 y% U) c. ^! q8 I! P2 Q" L8 W& S, p$ T( x
yum remove apr& S4 B% [0 ]! n! s, l  c) f  T
5.Error.log中有: Audit log: Failed to lock global mutex
( S  O5 ^! N9 s$ J9 V3 T4 C; g" X1 ]2 q
2015/01/26 04:15:42 [error] 61610#0: [client 10.11.15.161] ModSecurity: Audit log: Failed to lock     , g! d! D$ Q! m( ~/ H+ v
global mutex: Permission denied [hostname ""] [uri "/i.php"] [unique_id "AcAcAcAcAcAcAcA4DcA7AcAc"]; Q  T: n  I7 N4 M0 J0 o
解决方法:
. N  q$ C( N; J& h+ Z编辑modsecurity.conf,注释掉默认的SecAuditLogType和SecAuditLog,添加以下内容:
& ~, i& f7 K: s! k; i. l5 }9 `$ Y3 W, X. p7 l; G% w0 @' J
SecAuditLogDirMode 0777
2 v/ W4 V% R9 C' B$ q( ZSecAuditLogFileMode 0550
9 N& m* r) u5 R2 }5 ?9 c5 `: }SecAuditLogStorageDir /var/log/modsecurity# w, u3 M3 {- {0 f0 B
SecAuditLogType Concurrent' }, X& a8 r. a$ u1 N
参考文章:# t6 B- v3 }& s, i2 z
https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#Installation_for_NGINX
! |* u! v/ k/ l- u+ D; n* khttp://drops.wooyun.org/tips/2614
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-7-19 11:47 , Processed in 0.055403 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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