找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 12263|回复: 0

nginx配合modsecurity实现WAF功能

[复制链接]
发表于 2017-10-19 16:53:31 | 显示全部楼层 |阅读模式
modsecurity原本是Apache上的一款开源waf,可以有效的增强web安全性,目前已经支持nginx和IIS,配合nginx的灵活和高效,可以打造成生产级的WAF,是保护和审核web安全的利器。- ?% Z, W/ n3 V, }- a
6 t: U0 V. ~3 f9 ^" p
一.准备工作: f5 D4 z) n/ u  f6 d
$ M1 N( e' V% D" k, w' a; r# u
系统:centos 6.5 64位、 tengine 2.1.0, modsecurity 2.8.0
) Y, P; z9 L( `% ]8 x$ g% B4 N, U; g( u
tengine : http://tengine.taobao.org/download/tengine-2.1.0.tar.gz8 h7 u2 M' ^/ X  x8 q% o5 n

* R/ z# j# W: M7 ]+ L3 l+ Pmodsecurity for Nginx: https://www.modsecurity.org/tarball/2.8.0/modsecurity-2.8.0.tar.gz8 B4 y/ }  u  s2 j: \  g, c
3 ~9 P) c$ z& K# ~+ U
OWASP规则集: https://github.com/SpiderLabs/owasp-modsecurity-crs1 f# s9 |: j' j

4 \/ s: O5 i: Q2 ~+ w依赖关系:
& L6 T2 h2 `7 t: @! Otengine(nginx)依赖: pcre 、zlib、 openssl, 这三个包centos 6.5 系统源里都有:
: l3 f2 S% r$ U, P8 Z
) L8 o7 T, C; Q' J4 v# p7 {yum install zlib zlib-devel openssl openssl-devel  pcre pcre-devel# {5 v& r. E) n( c/ c5 f
modsecurty依赖的包:pcre httpd-devel libxml2 apr, S" N$ K' z! Y/ C

* J- i9 a1 O  o  j" y  jyum install httpd-devel apr apr-util-devel apr-devel  pcre pcre-devel  libxml2 libxml2-devel
2 V* ~! D/ ^- ^! ^二.启用standalone模块并编译
9 f1 d  m8 C' s' t9 Q! [) u2 O, k5 g2 z$ ?! O
下载modsecurity for nginx 解压,进入解压后目录执行:
# M8 h. W' ~. U, A* f: n& x, U$ [& A
./autogen.sh& j2 M; A$ _8 b; A9 J6 p
./configure --enable-standalone-module --disable-mlogc7 o0 F7 @, `) M4 [
make % e3 o  |$ v' k- f  I( D. d
三.nginx添加modsecurity模块
, A  x! {! f. b+ b0 |3 z5 Q
$ g  S. R, q8 o在编译standalone后,nginx编译时可以通过"--add-module"添加modsecurity模块:
' K* j# @3 _' A7 g; p  h( S1 a6 k6 D" W& w
./configure --add-module=/root/modsecurity-2.8.0/nginx/modsecurity/  --prefix=/opt/tengine
  B; w, w( e# `+ t" L/ cmake && make install- e4 Y- |" P: U
四.添加规则. E  N- e4 D4 E  f- s3 B6 o& A

5 s( x; x0 q: W; n. {: Z6 ^modsecurity倾向于过滤和阻止web危险,之所以强大就在于规则,OWASP提供的规则是于社区志愿者维护的,被称为核心规则CRS(corerules),规则可靠强大,当然也可以自定义规则来满足各种需求。
" o' _% L& ^/ i& b0 J6 H; n  a/ f/ F+ r0 J0 s$ l  O* B
1.下载OWASP规则:+ C$ G8 A7 @' N
( ?* V! S0 k; O" O' [
git clone https://github.com/SpiderLabs/owasp-modsecurity-crs. |. V6 E; @4 i& C0 v: |9 I
5 Q% b/ Y" P; z/ |
mv owasp-modsecurity-crs /opt/tengine/conf/
& ~8 n( h+ c/ u! P) v8 i/ N& s
1 U, v" ]# L: F" ?7 n" vcd /opt/tengine/conf/owasp-modsecurity-crs && mv modsecurity_crs_10_setup.conf.example modsecurity_crs_10_setup.conf
8 m8 ]+ B5 |" q& _2.启用OWASP规则:8 ?. ?# z# h/ M5 s$ l; C

& \* G/ E. P3 c0 e复制modsecurity源码目录下的modsecurity.conf-recommended和unicode.mapping到nginx的conf目录下,并将modsecurity.conf-recommended重新命名为modsecurity.conf。2 v6 C/ ?1 J$ A9 y% Q# E/ X% U5 S" [

0 h& R, q3 x8 T/ B$ K编辑modsecurity.conf 文件,将SecRuleEngine设置为 on
* o, R& r- E0 T* B- Y
1 c( }: o6 c' V9 P" F( Uowasp-modsecurity-crs下有很多存放规则的文件夹,例如base_rules、experimental_rules、optional_rules、slr_rules,里面的规则按需要启用,需要启用的规则使用Include进来即可。
1 R) l) b. y5 I: f% n4 I/ F
% f# X: @& Q3 r' x0 U. ?Include owasp-modsecurity-crs/modsecurity_crs_10_setup.conf  t! D' M8 Q1 c% l) D1 K) q: }
Include owasp-modsecurity-crs/base_rules/modsecurity_crs_41_sql_injection_attacks.conf+ ^2 Y$ a' I% N; F% ]  H$ o7 ~% u3 C
Include owasp-modsecurity-crs/base_rules/modsecurity_crs_41_xss_attacks.conf
; k0 r% D6 X; j) ^/ tInclude owasp-modsecurity-crs/base_rules/modsecurity_crs_40_generic_attacks.conf
9 A# L* k9 O' I% w. NInclude owasp-modsecurity-crs/experimental_rules/modsecurity_crs_11_dos_protection.conf
$ A# X3 w$ m" J6 Z$ |/ rInclude owasp-modsecurity-crs/experimental_rules/modsecurity_crs_11_brute_force.conf
) [' m" l1 r# a2 V: L  hInclude owasp-modsecurity-crs/optional_rules/modsecurity_crs_16_session_hijacking.conf
7 K7 C: {7 A$ }' j, `+ P五.配置nginx
- E) a" H4 z! P7 G% k
/ S+ l7 f) L) b- E. _9 B在需要启用modsecurity的主机的location下面加入下面两行即可:9 W3 w  ~: p( W$ ~: O, [
7 h3 Y2 c( _: c5 q/ M- \
ModSecurityEnabled on;  
, l& J5 \. \- s( DModSecurityConfig modsecurity.conf;
/ {; g5 P9 g  K- Z. z下面是两个示例配置,php虚拟主机:
9 F' g; b' D+ h, t! N0 e7 e/ ~5 N4 W7 B0 O- x: J
server {
3 x( z4 A* I- j' R$ O2 N( d. V      listen      80;; H! m- m9 I5 |' j
      server_name 52os.net www.52os.net;
1 x& U' _2 N, R     9 v7 }4 h* J6 V  T' I7 n" y  v
      location ~ \.php$ {' y' k; {5 w0 l( N
      ModSecurityEnabled on;  
2 y( c( c- i; {* a8 J0 c; f      ModSecurityConfig modsecurity.conf;
% @1 s5 ~4 f  q3 k$ j# i1 u" R% o
3 B; H8 l9 D" Q) B; j: X+ d      root /web/wordpress;
! \' f6 T) Y- b( c5 k% r      index index.php index.html index.htm;! a7 y- a: `6 ?% m6 W
  2 K+ S  {' i: X( ]- Z5 }' Y
      fastcgi_pass   127.0.0.1:9000;
" b! c" S- V. D% p' C      fastcgi_index  index.php;
1 w* R* }" ?  S% Y. ~$ v      fastcgi_param  SCRIPT_FILENAME  $Document_root$fastcgi_script_name;
3 \& V! H2 J5 f4 J& F) c      include        fastcgi_params;
  i8 e: B& c/ V9 N9 F& g      }: J& E2 v! Z- R
  }
/ x- G0 \- y8 u3 y0 ]+ I9 Cupstream负载均衡:
$ `" ~3 D" r, D) ]( Y, F
/ O4 p1 K; |. A, I9 I# V4 Q* }upstream 52os.net {
9 i# P. f1 i" |0 h+ D! D    server 192.168.1.100:8080;- a3 f, V5 v. p/ V; l0 y
    server 192.168.1.101:8080 backup;
: f" E6 Q0 s- C}7 C- z- }. e) O7 j  e
# Z& A8 R0 |) a5 v
server {
$ D0 ]1 `0 t3 h# m7 E8 tlisten 80;+ C6 U. S9 T. P) c2 F: L
server_name 52os.net www.52os.net;
) L  f/ W6 N- s0 t$ B) U- y$ G* [0 }) c
location / {
  @4 T9 Z) L* v+ |& Q* G    ModSecurityEnabled on;  
7 T4 ~4 g1 e5 d8 Z    ModSecurityConfig modsecurity.conf;  ! o/ ]0 z5 w- s) l$ g  ]

+ R4 [+ z5 @+ D, b; G" p4 v+ D        proxy_pass http://online;
+ L7 {# c% j" M+ p$ b  U2 t# `        proxy_redirect         off;
2 D3 M, A& H) }        proxy_set_header Host $host;+ P0 c6 E1 u* v/ A8 K" ^
        proxy_set_header X-Real-IP $remote_addr;
, r- b; `( J3 p        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;6 g  i2 K% m6 E2 s& {
    }
' p  i5 [9 j7 R9 r$ r: x}2 n# E* P2 u; K
六.测试
* v; C$ }6 v2 W% |
. P* o# h1 w" m我们启用了xss和sql注入的过滤,不正常的请求会直接返回403。以php环境为例,新建一个phpinfo.php内容为:" _, h& H; U8 @

9 _6 p8 p1 ?' ]9 k8 `  `<?php
) \# k5 X' I, |$ T9 e7 Q9 O* J    phpinfo();    7 [0 F; R. |, n9 W, x8 `
?>- ~: G& T- k! |$ O$ L: s
在浏览器中访问:
5 p0 {. d: m& K! K3 h" w9 T  ^+ G, O1 i5 L* w+ B5 n  _: F5 u
http://www.52os.net/phpinfo.php?id=1 正常显示。
0 H# g4 c: N5 f: ^  C6 ihttp://www.52os.net/phpinfo.php?id=1 and 1=1  返回403。2 Q/ M) }; W" x3 v6 l1 I& n' D$ E6 y
http://www.52os.net/phpinfo.php?search=<scritp>alert('xss');</script>  返回403。2 M1 R* ~2 {7 a+ H; }: J
说明sql注入和xss已经被过滤了
$ _  h8 L# N0 }# {: m9 _& u8 N
, p: T* Q4 U' c" m4 R七、安装过程中排错
: o4 l8 Q2 r  ~* o$ I, z
% \: ~0 }- }& R6 v1.缺少APXS会报错
+ ~3 Z; y( O/ q5 t1 S$ B3 n9 H$ B' r% q$ T! a7 b/ x
configure: looking for Apache module support via DSO through APXS
% I1 F1 x+ }& w: l; Bconfigure: error: couldn't find APXS
" H* y) K0 z* z8 @, K6 L* i6 Gapxs是一个为Apache HTTP服务器编译和安装扩展模块的工具,用于编译一个或多个源程序或目标代码文件为动态共享对象。
5 Y, y/ _9 h- T; @7 ]: h; r: q解决方法:+ T" Y$ v& u2 z/ g
) t  J9 W# r7 |2 S3 X) ?: d
yum install httpd-devel! Z3 _# @7 h6 ]& Y# C5 R1 X% A
2.没有pcre
) q  I8 s8 O$ L) Z3 u
) l) u# \( d7 Z# tconfigure: *** pcre library not found.
% P: Z; v  m- N7 L8 A' u- Gconfigure: error: pcre library is required
2 i( i8 L1 \/ P) R解决方法:
% }, _% _( V2 @) ~6 L' f0 E
/ c  O" a9 g4 U1 v; `- }4 }: z1 I8 syum install pcre pcre-devel3 ]+ K, b$ j) w8 l( Y# Q* e
3.没有libxml2
: b. }6 J5 U. S; u6 s' u8 ^
. j' y: D- l1 g/ p+ |1 ], |4 z
$ n8 M9 {6 g8 s9 L7 V8 Qconfigure: *** xml library not found.' `: B$ J, N6 ]0 ^8 G0 d" k4 P& p: a
configure: error: libxml2 is required$ D$ P- E- a& M# U+ b0 ?! c% G
解决方法:
7 Q' y$ z! f( Q: s/ V2 j& u( ^. N6 ?8 m- E9 R
yum install  libxml2 libxml2-devel5 K7 Z7 z0 J) M( K" L
4.执行 /opt/tengine/sbin/nginx -m 时有警告
6 e& V# @4 }- C
2 @$ G' c" U* {+ QTengine version: Tengine/2.1.0 (nginx/1.6.2)5 R% e4 z0 h3 D/ o
nginx: [warn] ModSecurity: Loaded APR do not match with compiled!5 {( e  g, z- }
原因:modsecurity编译时和加载时的apr版本不一致造成的,并且会有以下error.log; N/ Z* Y4 z1 F* a8 \7 T7 I) r

# i$ t8 t& a" }, L' b2015/01/26 02:04:18 [notice] 29036#0: ModSecurity for nginx (STABLE)/2.8.0 () configured.
. }) b& C- N9 ]' G* Y( k; F6 U2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: APR compiled version="1.5.0"; loaded     version="1.3.9": T* [2 Q) d# L% C; T- k* V
2015/01/26 02:04:18 [warn] 29036#0: ModSecurity: Loaded APR do not match with compiled!3 K: m! Z7 n9 ~# y- m: s" L% l
2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: PCRE compiled version="7.8 "; loaded version="7.8 2008-09-05"" n5 D8 {7 k- O0 _/ X
2015/01/26 02:04:18 [notice] 29036#0: ModSecurity: LIBXML compiled version="2.7.6"
( ^' v2 C. d: N+ F2015/01/26 02:04:18 [notice] 29036#0: Status engine is currently disabled, enable it by set SecStatusEngine to On.4 J- J: u6 w- n0 g( D$ F, w7 J
解决方法,移除低版本的APR (1.3.9)* p9 g. C- `& h/ k! j3 g2 w
- G) p# T. r: y' u5 T& i$ c
yum remove apr
8 ]/ |8 j+ }$ |- g9 K2 j, Y' H8 g5.Error.log中有: Audit log: Failed to lock global mutex. A( G+ w3 Q: s8 ?- D

5 C0 [* w" d, J# U: s; D1 ]2015/01/26 04:15:42 [error] 61610#0: [client 10.11.15.161] ModSecurity: Audit log: Failed to lock     ; [+ s6 v7 W% {" O3 t+ N
global mutex: Permission denied [hostname ""] [uri "/i.php"] [unique_id "AcAcAcAcAcAcAcA4DcA7AcAc"]
+ ~+ h: D* T; H. s解决方法:
  U( _* G. k! l) C: o7 L编辑modsecurity.conf,注释掉默认的SecAuditLogType和SecAuditLog,添加以下内容:
, W" S! X  M% [9 M+ _
6 [: O! s2 A7 G. A. t* `- U: F9 PSecAuditLogDirMode 0777
& m5 p0 Y! D% lSecAuditLogFileMode 0550
5 Y, o) x# q7 I! xSecAuditLogStorageDir /var/log/modsecurity9 ^+ T- e  m/ P! w5 n
SecAuditLogType Concurrent
) [5 O/ T9 Q# N( u6 A8 H9 g9 R参考文章:
7 z* [& n4 j7 y2 G! D4 N9 M6 nhttps://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#Installation_for_NGINX
' j# G7 b0 E3 u- {; R* Qhttp://drops.wooyun.org/tips/2614
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-8-20 12:57 , Processed in 0.068418 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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