网页防篡改设计

    写这篇博客,只是为了可以在日后再用时,记起这个配置方法。

1、系统运行步骤

  1. 防火墙由某些触发条件触发同步,通过网络文件映射的方式读取远程server上的web更目录(需要管理员提前给出远程计算机的登录用户名密码以及web根目录所在位置)
  2. 根据同步来的网页根目录内容计算哈希
  3. 在有用户请求到来时,抓取后台server的响应信息,并计算响应报文的哈希,与本地备份的哈希进行对比,如果不一致则重定向用户请求
  4. 备份服务器向用户提供服务,达到防篡改效果

 


2、系统主体模块

    首先来看防篡改测试环境的网络拓扑图(如图1所示),Internet端是需要请求服务的广大用户,而两个server是在防火墙之后的,可以在防火墙上设定不同的策略,来实现对服务器的访问。本防篡改系统部署在防火墙的Nginx服务器上。

                                 

                                                                                          图1 网络拓扑图

    接着来看本文的主要内容,防火墙上Nginx的配置,如图2所示

server {#防篡改server模块配置
  listen       80;
  web_defacement on;
  web_defacement_original /home/nfs_root;#此处填写nfs映射目录的路径
  web_defacement_hash_data /home/hash_data;#此处填写网站哈希文件路径
  #charset koi8-r;
  #access_log  logs/host.access.log  main;
  location /recover {
         #当篡改发生时会跳转到此location,可以在这个location中设置proxy代理,将访问的请求重定向至备份服务器                                                
		 web_defacement off;#关闭防篡改  
	     root /var/www/html;                          
		 #root /var/www/html;                                     
  }

  location / {
		web_defacement_index index.html;
		web_defacement_log on;#打开防篡改
		if ($web_defacement) {#判定是否发生了篡改
			   rewrite ^(.*)$ /recover/backup last;
               #此处格式为rewrite ^(.*)$+要跳转到的location地址+last
		}
		proxy_pass http://192.168.117.148:80;
        #如果没有被上面的rewrite重定向,说明未检测到篡改,会正常访问后台服务器
  }

}

                                                                                    图2 防篡改server模块配置

    这是一个Nginx的配置模块,调用Nginx的web_defacement模块,通过对比当前请求网页的哈希和系统曾经备份网页的哈希值来判断是否发生了篡改。完成了配置文件的修改后记得执行以下语句使配置生效:(我的Nginx是安装在这个目录下的)

/usr/local/nginx/sbin/nginx -s reload

    接下来介绍web_defacement这个模块,这个模块也不是我写的,怎么插入nginx模块呢,在网上有很多介绍,在这我只是一个搬运工,执行以下命令即可编译、插入一个新的nginx模块:

1. 下载防篡改模块源码web-defacement.c

#可在本文的附件中下载 
 
2. 查看nginx编译安装时安装了哪些模块

# nginx -V
nginx version: nginx/1.8.0
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC) 
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --with-http_ssl_module --with-http_sub_module --with-http_gzip_static_module --with-http_stub_status_module --add-module=/data/software/ngx_http_substitutions_filter_module
 
3. 加入需要安装的模块,重新编译,如这里添加
–add-module=/home/root/ web-defacement.c

# ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_sub_module --with-http_gzip_static_module --with-http_stub_status_module --add-module=/data/software/ngx_http_substitutions_filter_module --add-module=/data/software/ngx_http_web-defacement_module
# make    //千万不要make install,不然就真的覆盖了

    完成以上步骤就可以将web-defacement.c编译、加载进nginx中了

 


3、其它模块

     1、网络映射模块

     在这里我将网络映射模块写成了一个shell,可以直接使用,代码如下:

#!/bin/bash
username=$1
ipaddress=$2
password=$3
aimdir=$4
local_dir=$5
backupdir=$6
mkdir $local_dir/$ipaddress
mkdir $local_dir/allhash
mkdir $local_dir/allhash/comper_swap
/usr/bin/expect<<EOF
spawn rsync -vzrtopg --progress -e ssh $username@$ipaddress:$aimdir $local_dir/$ipaddress
expect {
 "*yes/no" { send "yes\r"; exp_continue }
 "*password:" { send "$password\r" }
}
expect "*#"
interact
expect eof
EOF
if [ "`ls -A $local_dir/$ipaddress`" = "" ]; then
echo -e "\n0"
else
	cd /home/root/SEnginx-master/
	./web-defacement.pl -d $local_dir/$ipaddress/html -o $local_dir/allhash/$ipaddress
	cd $local_dir/allhash/
	cat $ipaddress | sed 's/^.*'$ipaddress'//g'> comper_swap/$ipaddress
	echo -e "\n1"
fi


    要想使用这个shell首先需要下载expect环境,用以完成与后天服务器的自动化交互,当然如果只是纯手动交互的话就完全不需要这一段了。主要是通过rsync命令将远程服务器的目录内容同步至本地。具体使用方法读者可自行查阅rsync的命令参数。

     2、哈希计算模块

    对这个目录计算哈希值,并将最终的计算结果存储在对应的输出文件当中,以备在之后防篡改时被调用。具体的命令在上面的脚本文件中已经给出,在这里再次给出:

./web-defacement.pl -d $local_dir/$ipaddress/html -o $local_dir/allhash/$ipaddress
#格式为./web-defacement.pl -d 网页根目录 -o 目标文件

    这里使用了SeNginx自带的计算哈希的脚本,在本文的附件中会给出这个pl脚本。

    至此就完成了nginx防篡改的全部设置。

    3、本文参考了以下文章:

添加Nginx模块:https://www.cnblogs.com/lixigang/articles/5130052.html

配置Nginx防篡改:http://blog.chinaunix.net/uid-26479545-id-4569815.html(已被封)

 

4、遗留问题以及解决思路

  1. 对于动态网页的防篡改思路:当用户的请求中出现对PHP文件的请求时,根据PHP文件的路径向后台服务器请求对应PHP文件,将最新获取的文件与备份的PHP文件进行对比,确保PHP文件是正确的。
  2. 本系统设计中将防篡改目录与防火墙部署在了一起,理想情况下应该将防篡改部署在对应的防篡改主机上,重定向模块可以将用户请求重定向到防篡改主机上。

5、附录

防篡改模块源码下载 密码:csgq

如有错误还请指正。thx

展开阅读全文

没有更多推荐了,返回首页