首页 应用实战正文

ModSecurity拦截后跳转到自定义拦截页面

王子 应用实战 2019-11-25 10283 0

本文介绍当访问请求被ModSecurity拦截时如何跳转到指定的拦截提示页面。

本文中涉及的规则均已在景安网络(http://www.zzidc.com)的20万个虚拟主机业务中正常运行(或测试通过),可正常使用。


ModSecurity安装成功后,当访问触发拦截机制时,ModSecurity默认是向客户端返回403状态码,而在生产环境中,可能会由于目录权限、服务器配置等其他原因导致出现403的情况,因此如果仍按ModSecurity的默认机制进行拦截,一旦网站访问出现403情况,要查找对应的原因时,反而会增加运维人员的工作量,因此,我们需要定义一个提示页面,当访问被ModSecurity拦截后便跳转到这个指定的页面上,这样我们就能够很直观的观察到,是由于ModSecurity的拦截导致的无法访问,而不用再进行大量的排查工作。


一、配置教程

ModSecurity拦截后跳转到指定页面,需要使用"redirect"指令。

SecRule REQUEST_HEADERS:User-Agent "Test" "phase:1,id:130,log,redirect:http://modsecurity.cn/practice/intercept.html"

上述规则表示,当此次访问的请求头的User-Agent属性的值含有"Test"时,将此次访问跳转至http://modsecurity.cn/practice/intercept.html,效果如下图所示:

image.png


二、初级应用

此时存在一个问题,如果要所有规则都跳转到指定的页面,那就需要将所有的规则都进行修改,工作量巨大,此时,我们可以使用"SecDefaultAction"指令,配置所有规则的默认拦截动作,如下图所示:

SecDefaultAction "phase:1,deny,log,status:302,redirect:http://modsecurity.cn/practice/intercept.html"
SecDefaultAction "phase:2,deny,log,status:302,redirect:http://modsecurity.cn/practice/intercept.html"

至此,所以使用"block"作为拦截动作的规则,一旦触发拦截,都将跳转至http://modsecurity.cn/practice/intercept.html页面。


三、高级应用

但此时,尽管我们知道了此次请求无法正常进行是被拦截导致的,但如果是误拦截的话,对于运维人员仍要去检查被拦截的URL是什么,而相应的,我们依然可以通过一些配置来减少此工作量,对此我们最终需要以下规则(规则需复制进crs-setup.conf文件中,同时将文件中现有的SecDefaultAction配置注释):

SecDefaultAction "phase:1,deny,log,noauditlog,status:302,redirect:http://modsecurity.cn/practice/intercept.html?url=%{REQUEST_FILENAME}&intercept_domain=%{request_headers.host}"
SecDefaultAction "phase:2,deny,log,noauditlog,status:302,redirect:http://modsecurity.cn/practice/intercept.html?url=%{REQUEST_FILENAME}&intercept_domain=%{request_headers.host}"

该规则表示定义全局的拦截动作,当触发拦截时,跳转指定的URL地址,并将相应的参数传递过去;

最终显示效果如下:

image.png


四、其他补充

1、如果使用SecDefaultAction指令进行全局的拦截配置的话,其他规则的阻断性动作需要配置为block,block的作用在于阻止访问,但不指定阻止的具体执行方式,这个想法是为了让使用者可以自定义阻断后执行哪些操作,如使用SecDefaultAction指令。

2、deny、drop虽然也代表了阻止访问,但deny不会触发SecDefaultAction指令的默认配置,而是执行当前规则中指定的拦截方式,drop表示直接关闭TCP连接,不会向客户端返回任何内容,相比之下,drop通常用于防御DOS攻击,以用于节省服务器资源。

版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。