找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 12566|回复: 0

nginx配合modsecurity实现WAF功能

[复制链接]
发表于 2017-10-19 16:53:31 | 显示全部楼层 |阅读模式
modsecurity原本是Apache上的一款开源waf,可以有效的增强web安全性,目前已经支持nginx和IIS,配合nginx的灵活和高效,可以打造成生产级的WAF,是保护和审核web安全的利器。
. A* l8 F! a; k% z0 a* h' Y1 h  U: n* V" m
一.准备工作) q. ]2 F  H# e* I& C

: J) g1 m& p: k- F$ w( p9 s. L系统:centos 6.5 64位、 tengine 2.1.0, modsecurity 2.8.0; M8 m; F( G( o( l) [8 {8 k# G

( K; y1 a2 u( _! i# W7 Z1 Atengine : http://tengine.taobao.org/download/tengine-2.1.0.tar.gz
# }7 C8 T$ F5 P! @, w; @" @. I8 m% k% a0 \! S
modsecurity for Nginx: https://www.modsecurity.org/tarball/2.8.0/modsecurity-2.8.0.tar.gz
( H$ E' Z2 {& h
6 A7 u" j+ K0 |/ d: yOWASP规则集: https://github.com/SpiderLabs/owasp-modsecurity-crs
* o: o5 F) p5 e( g: j! e
% L' o& r+ C9 d4 U: ?! I% B: K; Y# W8 D依赖关系:* D% Z7 E( J  [% A+ r! p) u( X6 Z) ?
tengine(nginx)依赖: pcre 、zlib、 openssl, 这三个包centos 6.5 系统源里都有:4 ?' X' m* ]& D
# h2 ^! t  k! W$ a
yum install zlib zlib-devel openssl openssl-devel  pcre pcre-devel( I/ h$ Y; \* h9 e
modsecurty依赖的包:pcre httpd-devel libxml2 apr
$ h$ ?$ O$ r9 |; |5 s* s! ~: |3 a& {3 i: j- G8 I
yum install httpd-devel apr apr-util-devel apr-devel  pcre pcre-devel  libxml2 libxml2-devel
& }( F4 a- T- {0 t1 |! I- h二.启用standalone模块并编译& k! J) I: Y4 f/ I! ~% _
. S+ z1 S  y! W" e( n
下载modsecurity for nginx 解压,进入解压后目录执行:
( r( O9 ~' [+ k% P: K$ @
8 q9 d$ p- G/ R3 _9 z  m! }  G./autogen.sh& T- B0 R  d9 T" _
./configure --enable-standalone-module --disable-mlogc
( o) y5 m0 ]( U. l0 @: G2 Ymake
, U7 M2 g) ?& d; N8 I% N三.nginx添加modsecurity模块
0 K% n$ a: h  m/ _: N3 D
5 O. I$ [% Y% ^9 D: L在编译standalone后,nginx编译时可以通过"--add-module"添加modsecurity模块:, Z( m9 U5 L; ]' }1 @- w0 m

) |& Z% x. ^1 J./configure --add-module=/root/modsecurity-2.8.0/nginx/modsecurity/  --prefix=/opt/tengine& a- ~, u8 K( r6 S- U; N, z
make && make install
! G( _8 ^* a1 }& Y8 _! d四.添加规则
+ O+ L9 I2 F% X) M! D% J7 V3 D: e4 y0 S, w
modsecurity倾向于过滤和阻止web危险,之所以强大就在于规则,OWASP提供的规则是于社区志愿者维护的,被称为核心规则CRS(corerules),规则可靠强大,当然也可以自定义规则来满足各种需求。: J1 F; ]3 [# k

5 W/ H  f0 j5 k0 Z1.下载OWASP规则:
& P1 O5 H1 i+ e& `% [+ @7 B- w
! y& a( F: n0 x+ |9 jgit clone https://github.com/SpiderLabs/owasp-modsecurity-crs+ S( h# m5 l% |7 k
8 |; C6 Q$ K' T0 T
mv owasp-modsecurity-crs /opt/tengine/conf/
& A( ^( a, f7 q( B5 J
! k* s4 P( B; @) I3 N( Wcd /opt/tengine/conf/owasp-modsecurity-crs && mv modsecurity_crs_10_setup.conf.example modsecurity_crs_10_setup.conf. k) Q* n- M! {0 ?
2.启用OWASP规则:0 O) _5 A. @  P: ]5 u. _2 E

4 T, B, A# L% `: S复制modsecurity源码目录下的modsecurity.conf-recommended和unicode.mapping到nginx的conf目录下,并将modsecurity.conf-recommended重新命名为modsecurity.conf。6 _4 u; {# i( H# }
: w. a3 n# i: G4 d0 V  n% b
编辑modsecurity.conf 文件,将SecRuleEngine设置为 on8 J2 ^8 z2 Y% f: g9 H( I+ _
: }' ~7 I8 J" r; d
owasp-modsecurity-crs下有很多存放规则的文件夹,例如base_rules、experimental_rules、optional_rules、slr_rules,里面的规则按需要启用,需要启用的规则使用Include进来即可。' V, \# `# `' V

# S, x' w1 Y. r% I3 G. l: eInclude owasp-modsecurity-crs/modsecurity_crs_10_setup.conf
+ Z! x& Z. h( l. CInclude owasp-modsecurity-crs/base_rules/modsecurity_crs_41_sql_injection_attacks.conf7 F$ T1 [9 z* |5 w) u
Include owasp-modsecurity-crs/base_rules/modsecurity_crs_41_xss_attacks.conf) A, ]/ z  t/ I) e
Include owasp-modsecurity-crs/base_rules/modsecurity_crs_40_generic_attacks.conf" g! Z' E3 B8 q( }+ ]
Include owasp-modsecurity-crs/experimental_rules/modsecurity_crs_11_dos_protection.conf- `1 O9 U  e& U
Include owasp-modsecurity-crs/experimental_rules/modsecurity_crs_11_brute_force.conf
3 e; D% X* l% P1 C' n5 MInclude owasp-modsecurity-crs/optional_rules/modsecurity_crs_16_session_hijacking.conf
! M; |# G/ c0 h五.配置nginx
: o& v! j! ~" v3 A0 l) H
" `5 ?  v: N# b9 k) U9 P* \# |在需要启用modsecurity的主机的location下面加入下面两行即可:
& K7 E1 ]5 I) {6 H
* s0 e% r- v( Q; E& v$ T2 HModSecurityEnabled on;  
/ r; _+ @; T$ c, YModSecurityConfig modsecurity.conf;
" n+ K. [# Z; n. s5 G& O" Q5 k- G下面是两个示例配置,php虚拟主机:7 Y+ f1 _$ O8 X. q) J6 t" t- Q. D
9 |7 w6 ^- e2 C% a" f  d
server {
, m% N8 g, p- R  Z5 k      listen      80;; h( H  a7 e4 O. F, ]' Q
      server_name 52os.net www.52os.net;7 t% ]  U7 S% z
     
+ Q3 G. s) y8 }8 H; h7 Y      location ~ \.php$ {
) B8 J( X: w" l( S& u6 W      ModSecurityEnabled on;  
! z, b* w; d4 g8 I# a      ModSecurityConfig modsecurity.conf;
* D) T8 g' f  Q7 Q1 j7 M0 b: w9 y& T7 k7 F! C
      root /web/wordpress;
) \! k: z. B6 \      index index.php index.html index.htm;- V- W4 @( `& m8 A+ ?& H
  1 P5 {( Z' b' K8 u- l; }5 [
      fastcgi_pass   127.0.0.1:9000;
$ A9 H& i% `4 g  j7 B' c. ?      fastcgi_index  index.php;
3 o( {8 o; w7 k6 q% t      fastcgi_param  SCRIPT_FILENAME  $Document_root$fastcgi_script_name;
3 t; \- f7 G7 N; @      include        fastcgi_params;
, ?& F' V0 B( A7 t+ M9 v      }) p2 _$ Y' Q  J2 J
  }
1 f! o3 Z2 X  B1 Y! q- q" F: l* Gupstream负载均衡:
* ^/ e' H! f" H) g& z# O* _
' E  w7 l) v& G6 i4 w" \0 o" G# qupstream 52os.net {
! U: I# I1 k' {! c% ?9 ?* O    server 192.168.1.100:8080;1 D, w( m3 o5 W  F
    server 192.168.1.101:8080 backup;
3 U$ R" V5 S' m: L}7 J% n) _; h7 A0 O8 z, t
) Y+ c# s, T, {4 i
server {
, B' K: \) ~0 E) r. tlisten 80;
2 t7 G5 Z2 Q: Y- e( y, m4 ~server_name 52os.net www.52os.net;: n' Q! {( ~" x+ V* U0 ]1 _" a% b7 J
# I( Q6 U+ b/ V' T; v* D
location / {7 Y3 R# a# L% l  z1 @- C+ B
    ModSecurityEnabled on;  1 s. e9 _- e6 B3 U7 D. u
    ModSecurityConfig modsecurity.conf;  
5 f+ i1 k  [6 R1 J
& K+ U: B' m, J9 _9 @1 n  d        proxy_pass http://online;- ~" }+ y' J  Y, h. Z
        proxy_redirect         off;
/ D# M- l* M2 x% k        proxy_set_header Host $host;
  ?$ B' L" w- S+ M8 H+ O8 Y9 u$ x9 a8 [        proxy_set_header X-Real-IP $remote_addr;
  {) C4 W/ p& L! W5 k' |% b        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;" M. L6 V8 I' m1 ~6 ~
    }0 `3 j3 l$ U3 E. v5 e. Y! d3 _
}
$ g/ U& W5 G' z9 {9 R0 S9 R. q. f7 z六.测试2 D* f7 p. m/ B2 b
$ b& ?1 v% z; o1 `4 ^5 e) s
我们启用了xss和sql注入的过滤,不正常的请求会直接返回403。以php环境为例,新建一个phpinfo.php内容为:
) o6 c7 d8 H' G4 e) q6 w9 W$ U) \8 B9 Y( H+ V3 o  n( @
<?php
- u; f8 j+ P5 E% Q6 l    phpinfo();    6 m' h% k+ P4 _2 E3 [, M; Q
?>
4 j/ |/ J9 V6 p* l' Z  r在浏览器中访问:: i  X3 N& n% H1 ^$ Y2 B

$ m; m$ h. X4 i, ]* ?: d9 ehttp://www.52os.net/phpinfo.php?id=1 正常显示。
4 l7 X# l2 _5 A2 hhttp://www.52os.net/phpinfo.php?id=1 and 1=1  返回403。
9 n4 Z* ^; u" s3 [. e: n& xhttp://www.52os.net/phpinfo.php?search=<scritp>alert('xss');</script>  返回403。6 i% }7 m# L- J5 r, ~5 H) g
说明sql注入和xss已经被过滤了
! x/ x- z. n* C8 B& p# }& ]7 {. g' p. {' h
七、安装过程中排错
7 K; Y0 [/ B; x) @5 t+ f
7 }2 ^' a. o' g1.缺少APXS会报错6 L, R8 T2 W' y* f* S. P6 o# ~
% H% d% Q7 D4 W. y2 N* [  Y
configure: looking for Apache module support via DSO through APXS( X1 r( v7 d: k2 @% p& f3 O5 ^
configure: error: couldn't find APXS$ L8 ?! y0 F' P$ l' }
apxs是一个为Apache HTTP服务器编译和安装扩展模块的工具,用于编译一个或多个源程序或目标代码文件为动态共享对象。( }) ?+ d6 \% X# h
解决方法:
2 I2 w# ~3 t" p) x6 b( w! N
) y* n* J) t2 W( Syum install httpd-devel
  @( X; g# i( i2.没有pcre, q0 ^, D4 z6 i% N

: |; ^- ]3 X  E9 o( |/ Q  ]+ Sconfigure: *** pcre library not found.$ D; [; L7 N) l  Y( G" x2 h
configure: error: pcre library is required
  O# m( K; O1 a5 E' I解决方法:
6 u; K' X9 z: ]8 v! h7 G9 F: D' J" B9 L( \' c! g7 F
yum install pcre pcre-devel) q0 r$ h( a' G5 Y: h8 a3 k8 ~
3.没有libxml2
3 C1 n8 c: ?! p, V5 z& }
, T& j4 g8 o3 v) O* @2 y, u9 H* u) u' ^
configure: *** xml library not found.' b$ _( {) B% s
configure: error: libxml2 is required: ^0 [: ?* o. b% V; j
解决方法:1 y5 {1 R  r/ o. @+ ~

6 R( D0 V7 ~0 l) syum install  libxml2 libxml2-devel/ n: _* ?0 v# z/ S: a
4.执行 /opt/tengine/sbin/nginx -m 时有警告) g5 w2 y* G$ N. J
" }+ i% X3 u& _) u$ D3 u
Tengine version: Tengine/2.1.0 (nginx/1.6.2)& T6 U$ M8 I% y0 R( F/ U: C
nginx: [warn] ModSecurity: Loaded APR do not match with compiled!  H$ E& [6 i, F. M
原因:modsecurity编译时和加载时的apr版本不一致造成的,并且会有以下error.log
+ a  W0 k7 ^3 K4 N# D) b1 c, M6 A5 V8 f% L+ o$ }4 G2 `
2015/01/26 02:04:18 [notice] 29036#0: ModSecurity for nginx (STABLE)/2.8.0 () configured.
/ }3 A+ W: m7 n3 R: ]) O1 M8 q2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: APR compiled version="1.5.0"; loaded     version="1.3.9". x8 V' C9 U7 d* z
2015/01/26 02:04:18 [warn] 29036#0: ModSecurity: Loaded APR do not match with compiled!
# R+ y4 E: n, `: U+ i$ D2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: PCRE compiled version="7.8 "; loaded version="7.8 2008-09-05"
/ n8 T6 v* G: ]! k2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: LIBXML compiled version="2.7.6"0 G5 s8 |. p1 t7 k6 t+ v+ {
2015/01/26 02:04:18 [notice] 29036#0: Status engine is currently disabled, enable it by set SecStatusEngine to On., `; r9 H: c0 Z+ Q1 R# L- U
解决方法,移除低版本的APR (1.3.9)2 S5 \! W3 W2 l! y% k9 C

* C$ {4 f1 Z0 byum remove apr* d# h  V# p! b9 f
5.Error.log中有: Audit log: Failed to lock global mutex0 Y: a0 k" A# {- h6 K; ~" z

1 K4 v* E# }2 q8 u+ i; p2015/01/26 04:15:42 [error] 61610#0: [client 10.11.15.161] ModSecurity: Audit log: Failed to lock     " W3 W; S8 v' s7 v$ T  z: [
global mutex: Permission denied [hostname ""] [uri "/i.php"] [unique_id "AcAcAcAcAcAcAcA4DcA7AcAc"]6 x! V1 j2 U  V3 p
解决方法:. K0 y3 F/ Z7 ?9 i& M7 M
编辑modsecurity.conf,注释掉默认的SecAuditLogType和SecAuditLog,添加以下内容:
* U8 c# U& z7 Z3 f6 V6 j/ e. ^
3 P* p2 d2 {5 n8 n8 m8 U7 rSecAuditLogDirMode 0777
, v4 @* j% U( }& U1 m$ M" dSecAuditLogFileMode 0550
# x5 k2 y" V) YSecAuditLogStorageDir /var/log/modsecurity+ B8 R+ I. o0 T
SecAuditLogType Concurrent
6 m4 ?( I$ P2 t- U8 \- l- g参考文章:$ X6 k+ d8 q( N% t" y" G- u& s' ~6 j
https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#Installation_for_NGINX% P7 y0 D# M: K; p2 z! d
http://drops.wooyun.org/tips/2614
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-9-18 03:41 , Processed in 0.069318 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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