小白都能配置的WAF
之前的文章中介绍了Apache中开启模块ModSecurity,来作为WAF,发现阅读人很少,当然可以理解,目前国内用Apache的用户已经很少,大部分都在用Nginx,即便Apache新版本中对并发做了大量优化,并发并不输Nginx,但是其相对Nginx还是不够轻量,且配置相对复杂。今天同样是ModSecurity,不同的是介绍其在Nginx中的应用,这也是Nginx官方推荐的
ModSecurity在之前的版本中对于Nginx的兼容性不是很友好,其仅作为依赖模块使用在Apache Web服务器中,因此无法在其他HTTP应用程序中使用,但是在ModSecurity新发布的V3版本中,其作为独立库libModSecurity的ModSecurity的核心功能,即HTTP过滤引擎,它可以通过“连接器”集成到任何其他应用程序中,连接器是一小段代码,允许任何应用程序访问libModSecurity
WAF(Web应用程序防火墙)是一种用户HTTP请求的防火墙。标准防火墙在数据包到达时检查这些数据包,并在转发到网络接口,在这个过程中,将数据包的属性和规则列表进行比较。规则固定防火墙是允许数据包通过还是阻止
ModSecurity的执行和标准防火墙类似,它不查看数据包,而是在HTTP流量达到服务器时检查它。当HTTP请求到达服务器时,首先通过ModSecurity路由,然后路由到目标应用服务器,比如Apache或Nginx,ModSecurity将入站HTTP请求与规则列表进行比较。这些规则定义了恶意或者有害的请求形式,所以如果请求与规则匹配,则ModSecurity会阻止请求到达目标应用程序,从而起到防护作用。
说了这么多理论,下面实践下:
上面说到ModSecurity主要依赖libModSecurity库,目前来说在大部分的linux发行版中,都可以通过包管理工具来安装libModSecurity库,比如CentOS
but,实际测试中发现,包管理器安装的库,在Nginx添加链接器模块编译的时候,无法编译,缺少头文件,所以建议通过源码编译的方式安装最新版本的libModSecurity库
编译libModSecurity库需要的构建工具和依赖库如下:
gcc-c++ flex bison yajl yajl-devel curl-devel curl GeoIP-devel doxygen zlib-devel pcre-devel
这些可以通过包管理工具安装,对于CentOS来说,需要先安装epel-release源
依赖包安装完成后,开始从git克隆libModSecurity,通常我是放在/opt/目录中
cd /opt/
git clone https://github.com/SpiderLabs/ModSecurity
通过git下载源代码到/opt/后,进入ModSecurity目录,切换到V3分支,并初始化及从远端同步子模块
cd ModSecuritygit checkout v3/mastergit submodule initgit submodule update
提一下git submodule,它是当两个项目是独立的,但是当其中一个项目需要包含其他项目支持时使用的功能,及主项目可以使用另外一个项目的支持,需要在主项目的项目仓库根目录下添加.gitmodules文件,并配置需要的子项目,比如ModSecurity的库
言归正传,现在已经准备好了ModSecurity的构建需要,还是编译老三件套,不过在开始前,需要先通过build.sh生成编译文件
sh build.sh./configuremakemake install
编译安装完成后,会在/usr/local/modsecurity/lib下生成so库文件,在添加Nginx连接器模块前,需要将库动态加载到ldconfig中,在/etc/ld.so.conf中添加上面的路径,并通过ldconfig加载
上面的过程已经安装完libModSecurity库,但要想Nginx使用,还需要安装Nginx链接器。我们都知道,Nginx可以动态加载第三方模块,这也是它的一个优点,我们这里就通过它来编译添加Nginx连接器。
Nginx是在1.11.5之后的版本中,提供动态编译第三方模块的功能的,如果是之前版本的Nginx,首先建议你直接升级,放心,不会有什么问题,目前我升级过很多,直接从1.8升级到1.16我也干过,没有任何问题,可能会有一些配置文件的编写方式修改,但是不会有大问题。如果坚持用低版本的,那也没关系,重新编译nginx文件就可以,在编译时将该模块添加进去就可以。不要make install就可以,编译完,将新生成的nginx文件替换就可以
这里首先需要确认Nginx的版本,通过Nginx -V命令查看
因为我是通过包管理工具安装的,所以我需要确认版本,从官网下载一个nginx的源码包,来编译添加Nginx连接器模块,如果你之前是通过编译安装的,你还保留了之前的源码包,那可以直接使用
确认版本之后,从nginx官网下载nginx对应版本的源码包,放/opt下面,并解压,之后再通过git下载Nginx连接器源码,也放/opt下面。(目录这里无所谓,看个人习惯,不过还是规范一点的好)
git clone https://github.com/SpiderLabs/ModSecurity-nginx
现在都准备好了,可以开始添加模块了,进入nginx源码目录开始添加
./configure --with-compat
↪--add-dynamic-module=/opt/ModSecurity-nginx
make modules
以上命令编译后,会在当前目录下生成一个objs目录,该目录下会生成
ngx_http_modsecurity_module.so文件,然后将该文件复制到/etc/nginx/modules目录下,当然这是包管理工具安装的,如果是自己编译安装的,放相应的modules目录下,就可以开始配置Nginx使用了
在nginx.conf配置文件中,将以下内容添加到nginx的主配置文件中
load_module modules/ngx_http_modsecurity_module.so;
这行要加在配置文件的开头部分,配置pid文件上下的地方,而不是在events或http部分中
接下来,创建一个新目录并将ModSecurity规则和配置加载到其中
mkdir /etc/nginx/modsec
cd /etc/nginx/modsecgit clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git
将从git上下载下来的示例配置文件重命名为正式的配置文件
mv /etc/nginx/modsec/owasp-modsecurity-crs/↪crs-setup.conf.example /etc/nginx/modsec/↪owasp-modsecurity-crs/crs-setup.conf
然后将ModSecurity配置文件,从源码目录复制到/etc/nginx/modsec目录中
cp /opt/ModSecurity/modsecurity.conf-recommended
↪/etc/nginx/modsec/modsecurity.conf
最后,创建一个主配置文件main.conf,用来加载上面两个配置文件和规则文件,该文件在nginx服务器配置块中调用,在main.conf配置文件中添加如下
Include /etc/nginx/modsec/modsecurity.confInclude /etc/nginx/modsec/owasp-modsecurity-crs/crs-setup.confInclude /etc/nginx/modsec/owasp-modsecurity-crs/rules/*.conf
然后在nginx的server配置文件中就可以调用main.conf配置文件了,在server_name下面添加以下内容,开启ModSecurity
modsecurity>
modsecurity_rules_file /etc/nginx/modsec/main.conf;
到这里就配置完成了,然后测试nginx配置(nginx -t),重新加载nginx配置文件(nginx -s reload)。OK,ModSecurity开始工作了
ModSecurity有两种操作模式,默认情况下,它只会记录与禁止规则匹配到的任何请求,但允许它们传递到后端应用,这种模式不会因为误报而阻止请求,只会在/var/log/modsec_audit.log中记录。这种模式是DetectionOnly模式
如果要记录并将恶意请求阻止,需要编辑modsecurity.conf配置文件,修改其中的SecRuleEngine参数为On
SecRuleEngine On
这样对于恶意的请求,会返回403状态码,并且记录也会被记录到/var/log/modsec_audit.log中
相关链接:
https://github.com/SpiderLabs/ModSecurity-nginx
https://github.com/SpiderLabs/ModSecurity
持续更新,欢迎扫码关注,敬请期待!
温馨提示
如果你喜欢本文,请分享到朋友圈,想要获得更多信息,请关注我。