1. 相关介绍

1.1 Nginx

Nginx(发音同engine x)是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,由俄罗斯的程序设计师Igor Sysoev所开发,可以稳定的运行在Linux、Windows等操作系统上。其特点是占用内存少,并发能力强。

1.2 Naxsi:

Naxsi 是一个开放源代码、高效、低维护规则的Nginx web应用防火墙模块。Naxsi的主要目标是帮助人们加固他们的web应用程序,以抵御SQL注入、跨站脚本、跨域伪造请求、本地和远程文件包含漏洞。 详见http://code.google.com/p/naxsi/wiki/TableOfContents?tm=6

1.3 WebNginx

WebNginx是一款基于PHP+Mysql开发的系统,利用它可以通过Web界面来管理、配置Nginx服务器。

web-nginx把每一个虚拟主机看成为一个服务:配置服务|->|配置服务配置|->|提交配置|->|生成配置vserivce文件|->|写入日志|->客户端程序读取日志下载配置|->服务reload。

详见https://code.google.com/p/web-nginx/

2. 编写目的:

利用Nginx+Nasxi+WebNginx搭建一套高效、可靠、方便使用的Web应用防护系统,从而有效的保护后端Web服务器的安全。

3. 部署架构:

3.1 将Nginx配置为反向代理;让访问后端Web服务器的流量都经过Nginx

3.2 让Nasxi(WAF)检测经过Nginx的流量,将***流量根据相关配置进行阻断,从而保护运行在后端Web服务器上的应用程序。

3.3 利用WebNginx可以通过Web界面来管理、配置Nginx更加的方便。

具体的部署架构如下:

图1

用户正常访问请求处理流程具体如下图所示:

图2

***者恶意请求处理流程具体如下图:

图3

4. 环境搭建:

系统环境:CentOS 5.5

4.1 Nginx+Naxsi安装

安装包:

Nginx 1.3.15:http://nginx.org/download/nginx-1.3.15.tar.gz

Naxsi 0.50:http://naxsi.googlecode.com/files/naxsi-core-0.50.tgz

pcre-8.32:http://sourceforge.net/projects/pcre/files/pcre/8.32/pcre-8.32.tar.gz/download

安装过程:

4.1.1 安装必要的支持组件

在安装Nginx之前,需要先安装必要的支持组件,否则Nginx完全正常安装。

安装pcre过程:

[root@localhost LNMP]# wget http://sourceforge.net/projects/pcre/files/pcre/8.32/pcre-8.32.tar.gz/download

[root@localhost LNMP]#tar -zxvf pcre-8.32.tar.gz

[root@localhost nginx-1.3.15]#cd pcre-8.32

[root@localhost pcre-8.32]]#./configure

[root@localhost pcre-8.32]#make && make install

安装zlib库组件过程:

[root@localhost LNMP]# yum -y install zlib-devel

4.1.2 Nginx和Naxsi安装过程

[root@localhost LNMP]# wget http://nginx.org/download/nginx-1.3.15.tar.gz

[root@localhost LNMP]# wget http://naxsi.googlecode.com/files/naxsi-core-0.50.tgz

[root@localhost LNMP]# tar -zxvf nginx-1.3.15.tar.gz

[root@localhost LNMP]# tar -zxvf naxsi-core-0.50.tgz

[root@localhost LNMP]# cd nginx-1.3.15

[root@localhost nginx-1.3.15]# ./configure --add-module=../naxsi-core-0.50/naxsi_src

[root@localhost nginx-1.3.15]#make && make install

4.1.3 启动Nginx,并测试

/usr/local/nginx/sbin/nginx        #启动Nginx

/usr/local/nginx/sbin/nginx -t     #测试配置文件是否正常

Killall -9 nginx                    #杀死nginx进程

kill -HUP `cat /usr/local/www/nginx/logs/nginx.pid`   #以平滑方式重启Nginx

图4

如果在启动Nginx时,出现如下错误:

图5

按照下面的方法即可解决。

32位系统 [root@localhost lib]# ln -s /usr/local/lib/libpcre.so.1 /lib
64位系统 [root@localhost lib]# ln -s /usr/local/lib/libpcre.so.1 /lib64

4.2 WebNginx安装

由于WebNginx采用PHP+Mysql开发,所以在安装WebNginx之前需要先安装好PHP5+Mysql5及其他相应的支持环境。

获取安装包:

Web-nginx v1.0 :

svn checkout http://web-nginx.googlecode.com/svn/trunk/ web-nginx-read-only

安装过程:

4.2.1 安装Mysql及相应组件

由于Mysql需要使用cmake编译,所以需要先安装cmake环境。具体过程如下:

安装Cmake:

Cmake-2.8.10.2:http://www.cmake.org/files/v2.8/cmake-2.8.10.2.tar.gz

[root@localhost LNMP]#wget  http://www.cmake.org/files/v2.8/cmake-2.8.10.2.tar.gz

[root@localhost LNMP]#tar -zxvf cmake-2.8.10.2.tar.gz

[root@localhost LNMP]#cd cmake-2.8.10.2

[root@localhost cmake-2.8.10.2]#./configure && make && make install

安装Mysql过程:

[root@localhost LNMP]#wget http://dev.mysql.com/get/Downloads/MySQL-5.5/mysql-5.5.30.tar.gz/from/http://cdn.mysql.com/

[root@localhost LNMP]#tar -zxvf mysql-5.5.30.tar.gz

创建Mysql安装目录和数据库存放目录

[root@localhost LNMP]#mkdir -p /usr/local/mysql

[root@localhost LNMP]#mkdir -p /usr/local/mysql/data

创建Mysql用户及用户组

[root@localhost LNMP]#gourpadd mysql

[root@localhost LNMP]#useradd -g mysql mysql

[root@localhost LNMP]#cd mysql-5.5.30

编译和安装过程:

[root@localhost mysql-5.5.30]#

cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \

-DMYSQL_DATADIR=/usr/local/mysql/data \

-DDEFAULT_CHARSET=utf8 \

-DDEFAULT_COLLATION=utf8_general_ci \

-DEXTRA_CHARSETS=all \

-DENABLED_LOCAL_INFILE=1

如果出现如下错误:

图6

按下面的方法解决:

[root@localhost mysql-5.5.30]#yum -y install ncurses-devel

[root@localhost mysql-5.5.30]#rm -f CMakeCache.txt

再次编译,如果没有问题的话,执行安装操作

[root@localhost mysql-5.5.30]#make && make install

设置Mysql配置文件

[root@localhost mysql-5.5.30]#cp support-files/my-medium.cnf /etc/my.cnf

将Mysql添加到系统服务启动项

[root@localhost mysql-5.5.30]#cp support-files/mysql.server /etc/init.d/mysqld

授权操作

[root@localhost mysql-5.5.30]#chmod 755 /etc/init.d/mysqld

初使化数据库:

[root@localhost mysql-5.5.30]#sh ./scripts/mysql_install_db --user=mysql

--basedir=/usr/local/mysql/ --database=/usr/local/mysql/data/ &

设置数据库目录权限

[root@localhost LNMP]#chown -R mysql:mysql /usr/local/mysql/

[root@localhost LNMP]#chown -R mysql:mysql /usr/local/mysql/data/  

设置环境变量

[root@localhost LNMP]#vi /root/.bash_profile
在PATH=$PATH:$HOME/bin后添加参数为:
PATH=$PATH:$HOME/bin:/usr/local/mysql/bin:/usr/local/mysql/lib

[root@localhost LNMP]#source /root/.bash_profile

修改Mysql默认密码:

[root@localhost LNMP]#/usr/local/mysql/bin/mysqladmin -u root password "test"

启动数据库命令:

[root@localhost LNMP]#service mysqld start

到此为此,Mysql数据库安装、配置完成。

4.2.2 安装PHP

获取安装包:

[root@localhost LNMP]#

wget http://cn2.php.net/get/php-5.3.24.tar.gz/from/this/mirror

安装必要的支持组件:

[root@localhost LNMP]#yum -y install gcc gcc++ libtool-libs autoconf freetype freetype-devel gd libjpeg libjpeg-devel libmcrypt libmcrypt-devel libpng libpng-devel libxml2 libxml2-devel ncurses ncurses-devel zlib zlib-devel zip unzip curl curl-devel

安装PHP过程:

[root@localhost LNMP]#tar -zxvf php-5.3.24.tar.gz

[root@localhost LNMP]#cd php-5.3.24

[root@localhost php-5.3.24]#./configure \

--with-mysql=/usr/local/mysql/ --with-mysqli=/usr/local/mysql/bin/mysql_config  --with-jpeg-dir --with-png-dir --with-zlib --enable-mbregex --with-freetype-dir \

--enable-xml --with-curl --enable-fpm --with-curlwrappers \

--with-gd --with-mbstring --with-xmlrpc --enable-zip

[root@localhost php-5.3.24]#make && make install

[root@localhost php-5.3.24]#cp php.ini-production /etc/php.ini

[root@localhost php-5.3.24]#

cp /usr/local/etc/php-fpm.conf.default /usr/local/etc/php-fpm.conf

[root@localhost php-5.3.24]#/usr/local/sbin/php-fpm

设置php-fpm开机自启动:

[root@localhost php-5.3.24]#echo "/usr/local/sbin/php-fpm" >>/etc/rc.local 

整合Nginx+PHP,使其支持PHP解析。

修改nginx.conf配置文件,可参考以下方法修改:

图7

4.2.3 WebNginx安装

将WebNginx程序复制一份至Web目录

创建数据库:

mysql> create database nginx_conf;

执行nginx_conf_mysql.sql中的sql语句,创建相应的数据库表。

mysql> source /usr/local/nginx/www/web-nginx/nginx_conf_msyql.sql

安装pear db

[root@localhost nginx]# pear install db

配置数据库连接文件(config.php)

访问WebNginx界面:

图8

说明:通过实际测试,发现WebNginx并不好用。所以在下面的配置中将不使用它。

5. 实例演示:

5.1 背景介绍

有一台Web服务器,在其上运行有两个网站。现在需要将用上面搭建的Web应用防护系统为Web服务器上运行的网站提供防护,加强其安全性。下面是Web服务器的详细情况:

IP:192.168.30.128

Web端口:8080

网站1:http://192.168.30.128:8080/cxphp/index.php

网站2:http://192.168.30.128:8080/cxcms/index.php

5.2 系统架构:

图9

5.3 详细配置

这个具体配置分为两个过程:一、修改Nginx.conf配置文件,配置与Naxsi(WAF)相关选项;二、将Nginx配置为反向代理,为后端Web服务器提供防护。

5.3.1 配置Naxsi相关

首先,将Naxsi的核心配置规则库拷贝至Nginx文件所在目录一份,

图10

接着修改Nginx.conf配置文件,在其中加入如下一行配置,如其包含Naxsi的核心规则库文件:

图11

然后定义一个虚拟主机的安全规则,可参考下面的内容:

LearningMode; #Enables learning mode

SecRulesEnabled;

#SecRulesDisabled;

DeniedUrl "/RequestDenied";

include "/tmp/naxsi_rules.tmp";

## check rules

CheckRule "$SQL >= 8" BLOCK;

CheckRule "$RFI >= 8" BLOCK;

CheckRule "$TRAVERSAL >= 4" BLOCK;

CheckRule "$EVADE >= 4" BLOCK;

CheckRule "$XSS >= 8" BLOCK;

将上面的内容保存在一个文件中。如test.rules。下面会用到。

定义一个阻断时返回给用户的页面,可参考如下内容:

<html>

<head>

<title>Error 403 Request Denied</title>

</head>

<body>

<h2>Error 403 Request Denied</h2>

For some reasons, your request has been denied.

</body>

</html>

5.3.2 配置反向代理

新建一个虚拟主机的配置文件,具体配置如下图所示:

图12

最后,再次修改Nginx.conf,使其包含刚定义的虚拟主机配置文件即可。

图13

重启Nginx服务后配置开始生效。

5.4 防护效果:

5.4.1 未使用Web应用防护系统时,不具备***防护能力。

图14