网页防篡改

来自SEnginx
跳转至: 导航, 搜索

目录

网页防篡改

概要

网页防篡改模块监控服务器磁盘上的文件,并在请求到达SEnginx的时候核查文件水印是否有变化,从而达到防篡改的目的。防篡改模块可以和nginx配合以达到在篡改发生时,恢复网页内容的功能。
此模块默认随SEnginx一起发布,也可以单独使用在标准的nginx版本上。
注:此模块只是防止网页篡改的补救措施,网站管理员必须使用如SElinux之类的工具加强网站服务器自身的安全,这样才能从根本上解决网页篡改问题。

命令

web_defacement

语法 web_defacement on/off
默认值 off
上下文 http/server/location

开启web defacement功能。
示例:

web_defacement on;

web_defacement_original

语法 web_defacement_original /path/to/original/files
默认值
上下文 http/server/location

指定要保护的网页文件所在的目录,一般来讲,是网页的根目录在文件系统中的位置。如果配的是相对路径,则此路径会以SEnginx的conf目录为根目录。
示例:

web_defacement_original /var/www/html;


web_defacement_hash_data

语法 web_defacement_hash_data /path/to/hash/data/file
默认值
上下文 http/server/location

指定要保护的网页文件的hash数据文件的位置,hash数据的文件用随SEnginx发布的web_defacement.pl脚本生成。如果配的是相对路径,则此路径会以SEnginx的conf目录为根目录。
示例:

web_defacement_hash_data /usr/local/senginx/hash_data;

hash数据文件的生成方法:

cd senginx-install-dir
./web_defacement.pl -d /path/to/original/files -o /path/to/hash/file;

例如:

cd /usr/local/senginx
./web_defacement.pl -d /var/www/html -o ./hash_data;

web_defacement_log

语法 web_defacement_log on/off
默认值 off
上下文 http/server/location

指定当发现页面被篡改时,是否发出攻击日志,攻击日志会以error级别记录到SEnginx的error.log中,具体的位置视用户的配置而定。
示例:

web_defacement_log on;

web_defacement_index

语法 web_defacement_index filename
默认值
上下文 http/server/location

指定默认的index文件,此选项用于当用户的请求是一个路径时,防篡改模块默认匹配的文件名。
示例:

location /cn/ {
    web_defacement_index index.html;
}

这说明当客户端请求的时候/cn/时,防篡改模块会自动寻找/cn/index.html文件进行反篡改检查。需要注意的是,路径必须带有最后一个/,否者会当成文件名处理

web_defacement_whitelist

语法 web_defacement_whitelist ua_var_name=UA whitlist ip_var_name=IP whitelist ip_var_value=value;
默认值 -
上下文 HTTP/Server/Location
有效版本 1.5.11及以后版本

此命令设置引用的全局IP白名单和User-Agent白名单,其中,IP白名单是和nginx的geo模块配合使用
例如:

#定义IP白名单
geo $ip_wl {
    ranges;
    default 0;

    127.0.0.1-127.0.0.1 1;
    3.0.0.1-3.2.1.254 1;
}

#定义UA白名单
whitelist_ua $ua_wl {
    "autotest" ".*\.test\.com";
}

server {
    location {
        web_defacement_whitelist ua_var_name=ua_wl ip_var_name=ip_wl ip_var_value=1;
    }
}


变量

网页防篡改模块提供了两个变量用于用户自行处理动作。

  • $web_defacement

当请求的页面被识别为篡改时,此变量的值为真。

  • $web_defacement_file

当请求的页面被识别为篡改时,此变量的值为设置为请求的URL,也就是对应发生篡改的文件。

例子

SEnginx做web服务器时的例子

假设一个网站的所有文件都放在/var/www/html目录下,senginx安装到/usr/local/senginx。需要执行如下步骤来使用网页防篡改功能:
进入senginx的安装目录

cd /usr/local/senginx

使用web_defacement.pl脚本,生成hash_data文件,生成的文件位于/usr/local/senginx/hash_data

./web_defacement.pl

修改nginx.conf配置文件,在要保护的location中或者server中开启网页防篡改功能:

server {
        listen       80;
        server_name  localhost;
 
 
        web_defacement on;                                                                    #开启防篡改
        web_defacement_original /var/www/html;                                    #指定网页文件所在的目录
        web_defacement_hash_data /usr/local/senginx/hash_data;      #指定hash文件
         
        location / { 
              web_defacement_index index.html;                                        #指定目录下的index文件名
              web_defacement_log on;                                                       #指定记录日志
 
              if ($web_defacement) {                                                           #防篡改模块的动作,是通过if语句实现的,判断是否发生了篡改,如果是,则返回403,
                                                                                                          #当然,在这里还可以做其他事情。
                     return 403;
              }
                
              index index.html;
              root /var/www/html;
        }
 
        location /other {
              web_defacement off;                                                              #此location关闭防篡改功能
              ... ... 
        }
}

启动或reload SEnginx

SEnginx做反向代理时的例子

SEnginx在做反向代理时,需要处理的一个问题就是如何让SEnginx访问到后端服务器上的网页文件,在本例中,我们使用的是NFS挂载远程服务器的网页目录。假设后端服务器的IP地址为1.1.1.1,后端服务器的网页目录为/var/www/html,挂载到SEnginx所在的服务器的/opt/original目录下。
挂载1.1.1.1:/var/www/html到SEnginx所在反向代理服务器的/opt/original目录,NFS服务器的设置和权限问题请自行解决。
按照上个例子的步骤,生成hash_data,注意,指定的original目录是/opt/original目录。
编辑nginx.conf配置文件:

server {
        listen       80;
        server_name  localhost;
 
 
        web_defacement on;                                                                    #开启防篡改
        web_defacement_original /opt/original;                                        #指定网页文件所在的目录
        web_defacement_hash_data /usr/local/senginx/hash_data;      #指定hash文件
        location / { 
              web_defacement_index index.html;                                        #指定目录下的index文件名
              web_defacement_log on;                                                       #指定记录日志
 
              if ($web_defacement) {                                                           #防篡改模块的动作,是通过if语句实现的,判断是否发生了篡改,如果是,则返回403,当然,在这里还可以做其他事情。
                     return 403;
              }
 
              proxy_pass http://1.1.1.1;
        }
        location /other {
              web_defacement off;                                                              #此location关闭防篡改功能
              ... ... 
        }
}

当然,如果不使用NFS,手动拷贝网页文件到SEnginx所在反向代理服务器,也是一种选择。缺点就是当网站发生更新了,得同步反向代理服务器。

在篡改后恢复原始网页的例子

因为防篡改模块提供了变量来表示是否发生了篡改,因此可以在nginx配置文件中灵活的处理各种攻击检测后的动作,本例提供一种当页面被篡改时恢复原始页面的方法。这种方法需要将网页文件备份一份,如果是反向代理模式的话,则需要拷贝到SEnginx所在的服务器上。假设备份的网页路径在/var/www/recover下。
按照上例,反向代理或者web服务器的配置方法,生成hash_data。
编辑nginx.conf配置文件:

server {
        listen       80;
        server_name  localhost;
 
 
        web_defacement on;                                                                    #开启防篡改
        web_defacement_original /opt/original;                                        #指定网页文件所在的目录
        web_defacement_hash_data /usr/local/senginx/hash_data;      #指定hash文件
 
        location /recover {
               web_defacement off;
               root /var/www;
        }
 
        location / { 
              web_defacement_index index.html;                                        #指定目录下的index文件名
              web_defacement_log on;                                                       #指定记录日志
 
              if ($web_defacement) {                                                           #如果发生篡改,则重定向到recover目录,从本地读取备份网页进行恢复。
                     rewrite ^(.*)$ /recover$1 last;
              }
 
              proxy_pass http://1.1.1.1;
        }
        location /other {
              web_defacement off;                                                              #此location关闭防篡改功能
              ... ... 
        }
}
(function(w, d, g, J) { var e = J.stringify || J.encode; d[g] = d[g] || {}; d[g]['showValidImages'] = d[g]['showValidImages'] || function() { w.postMessage(e({'msg': {'g': g, 'm':'s'}}), location.href); } })(window, document, '__huaban', JSON);
个人工具
名字空间
  • 页面
  • 讨论

变换
操作
导航
其他语言
工具箱