0x01 前言

我目前使用naxsi作为我网站的waf,但是naxsi目前还没支持HTTP/2。虽然GitHub项目中已经有相关的分支,但回顾这项目的效率,估计还得等一段时间。

在应用waf之前我是启用了HTTP/2的,不过因为naxsi的缘故我有关闭了。在学习参透naxsi后开始学习ModSecurity这一款开源的waf,计划在2个月内将naxsi替换为ModSecurity并启用一些新技术。

今天先记录ModSecurity的安装过程。

-更新:2017-09-21

因为该文章中的ModSecurity使用了v2.9,与新版的nginx不兼容。请点击以下链接查看ModSecurity v3与nginx编译安装的步骤:

0x02 准备

我依旧使用openresty作为nginx的替代品,可以通过以下地址下载最新版:

然后是ModSecurity for Nginx,打开以下地址,在页面底部即可找到nginx的版本:

有了基础环境,还需要各种各样的规则。因为这是开源的,所以有很多开源的规则,当然也有收费的,打开以下页面即可找到两种不同类型的规则:

我一个小站,只好选用OWASP ModSecurity Core Rule Set (CRS) Version 3这个开源的规则。

0x03 安装

先使用root用户登入系统并下载相关文件:

先进入OWASP ModSecurity CRS目录将crs-setup.conf.example复制一份:

在rules文件夹中也有两份配置文件,我这里也将其复制一份,设为启用:

进入ModSecurity文件夹并将其解压:

因为nginx不同于apache的动态加载模式,所以modsecurity需要以standalone module的形式存在。需要先将其编译,然后再将其通过nginx的编译整合在一起。

这里先进入modsecurity文件夹,并编译:

在进行编译之前还需要修改两处内容,使用以下命令进行修改:

如果不修改,则使用最新automake编译的时候会出错。然后进行编译:

这里不需要安装。

完成之后进入nginx的文件夹并将其解压:

然后进入openresty文件夹并编译安装,在这里我使用以下文章里的configure参数:

需要注意在最后的一个函数,请按你的实际情况进行修改:

安装完成后通过以下命令查看nginx信息:

至此安装已完毕。

0x04 配置

modsecurity灵活性很高,你可以将ModSecurityEnabled这个指令放置在server或location块,以此控制modsecurity的启用与否。

以下使用nginx默认的配置文件nginx.conf进行修改,首先在文件顶部添加以下内容:

让nginx加载动态模块,这样才能识别下方ModSecurity的配置内容。

然后将以下两行内容放置在location块中:

到这里nginx配置文件的修改就完成了。然后将modsecurity.conf的配置文件复制一份到nginx目录下:

然后在nginx.conf同级目录下新建一个名为modsec_includes.conf的文件并填入owasp modsecurity crs配置文件与modsecurity.conf的路径:

至此,所有配置均已完成。

如果你是使用我的configure参数,那么测试nginx配置文件的时候会出现一个错误:

这时候只需要建立一个文件夹即可:

然后启动

0x05 测试与拦截

成功启动nginx后即可展开测试,先在终端中使用tail查看日志:

然后在浏览器打开以下地址:

例如:

再回到终端,即可看到相关记录:

但目前只有记录日志,并没有实施拦截。如果想实施拦截动作,则需求修改modsecurity.conf与crs-setup.conf这两个配置文件:

完成后重新加在nginx并再次打开日志监控终端:

然后刷新一下页面,会发现恶意访问已经被拦截了:

日志也有相关记录,已经返还403状态码:

0x06 结语

因为这是通用的规则,在拦截上会比较严格,安装完成后还需要进一步的调整才可以用在生产环境中。

如果可以,建议先不打开拦截模式,收集一段时间的日志,根据实际情况编写好规则后再上线使用。

2 条评论 / comments

  1. 启用modsecurity后,发现get不到登录页面,查看error.log,存在大量
    worker process 4678 exited on signal 11

Comments are closed.