网页防篡改
目录 |
网页防篡改
概要
网页防篡改模块监控服务器磁盘上的文件,并在请求到达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);