本文主要讲一下如何用第三方Nginx模块Naxsi来构建一个可用的WAF。
关于Naxsi
Naxsi是一个开放源代码、高效、低维护规则的Nginx Web应用防火墙模块,它的主要目标是帮助人们加固Web应用程序,以抵御SQL注入、跨站脚本、跨域伪造请求、本地和远程文件等包含的漏洞。
Naxsi与其它WAF的区别是,它不靠后签名来检测和阻止攻击。它使用一个简单的模型,而不是试图发现已知的攻击,它在HTTP请求/参数检测意外的字符。
同为开源WAF,跟Modsecurity的不同是,它对Nginx的兼容性非常好,而且不依赖现有规则库。单单基于规则库的拦截可能需要经常更新,且容易被绕过,防御起来比较被动,而Naxsi安装定制都非常简单方便,占用系统资源相对较少,对实际业务的适用性更强[方便的白名单设置],有一定的学习能力,不过,实际测试中貌似暂时只能拦截从get或者post过来的数据,这也是个小遗憾。
更详细的信息请见Naxsi官网。
安装Naxsi
首先运行
nginx -V
可以看到现有的模块,复制保存一下备用。
configure arguments: --prefix=/usr/local/nginx --user=www --group=www \
--with-http_stub_status_module --with-http_v2_module \
--with-http_ssl_module --with-http_gzip_static_module --with-\
http_realip_module --with-http_flv_module --with-http_mp4_module \
--with-openssl=../openssl-1.0.2l --with-pcre=../pcre-8.40 \
--with-pcre-jit --with-ld-opt=-ljemalloc
Naxsi应该使用所有高于0.8.X的Nginx版本。Naxsi版本可以在https://github.com/nbs-system/naxsi这里,选择releases –> Tags查看版本号。
假设服务器现有Nginx版本为1.12.1,下载Nginx和Naxsi并解压,然后进入Nginx目录:
wget http://nginx.org/download/nginx-1.12.1.tar.gz
wget https://github.com/nbs-system/naxsi/archive/0.55.3.tar.gz
tar xvzf nginx-1.12.1.tar.gz
tar xvzf 0.55.3.tar.gz
cd nginx-1.12.1/
Naxsi不要求任何特定的依赖,前提是它需要的 libpcre,libssl,zlib,gzip这些Nginx已经集成了。
然后进行编译(记得在 ./configure 后面加上你之前备份的模块和--add-module=../naxsi-0.55.3/naxsi_src/),命令如下:
./configure --prefix=/usr/local/nginx --user=www --group=www \
--add-module=../naxsi-0.55.3/naxsi_src/ \
--with-http_stub_status_module --with-http_v2_module \
--with-http_ssl_module --with-http_gzip_static_module \
--with-http_realip_module --with-http_flv_module \
--with-http_mp4_module --with-openssl=../openssl-1.0.2l \
--with-pcre=../pcre-8.40 --with-pcre-jit --with-ld-opt=-ljemalloc
make #不要make install,否则会覆盖原来的文件
等待编译完成。此时,Naxsi 安装完成。
然后替换nginx二进制文件。
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
cp ./sbin/nginx /usr/local/nginx/sbin/
如果提示 cp: cannot create regular file ‘/usr/local/nginx/sbin/nginx’: Text file busy ,请先 service nginx stop。
最后检查 nginx 模块。
nginx -V
看到有 –add-module=../naxsi-0.55.3/naxsi_src/ 就成功了。
配置Naxsi
首先将naxsi-0.55.3/naxsi_config的naxsi_core.rules拷贝至nginx.conf所在目录。
cp /path/to/naxsi-0.55.3/naxsi_config/naxsi_core.rules /usr/local/nginx/conf/
修改Nginx主配置文件nginx.conf,在http部分插入以下内容。
http {
include naxsi_core.rules; #导入Naxsi核心规则
...
}
同样,在nginx.conf的server部分进行如下配置。
location / {
SecRulesEnabled; #开启 naxsi
#LearningMode; #学习模式,只记录,不拦截,方便自己设置白名单,生产环境则需要关闭
DeniedUrl "/RequestDenied"; #定义阻止请求的位置
#CheckRules, 确定 naxsi 何时采取行动
CheckRule "$SQL >= 8" BLOCK;
CheckRule "$RFI >= 8" BLOCK;
CheckRule "$TRAVERSAL >= 4" BLOCK;
CheckRule "$EVADE >= 4" BLOCK;
CheckRule "$XSS >= 8" BLOCK;
error_log /path/to/foo.log;#naxsi 日志文件
...
}
...
location /RequestDenied {
return 403;
}
测试Naxsi
检查Nginx配置文件是否正确修改。
/path/to/nginx/sbin/nginx -t
结果显示如下,则说明正确修改配置信息。
重启Nginx。
service nginx reload
浏览器中输入你的网站地址并连接?a=<>‘。如果出现 403 错误,并且在 foo.log 中出现 NAXSI_FMT开头的日志,则Naxsi 启用成功。
参考链接
1.Naxsi Wiki
2.nginx下安装配置naxsi waf防火墙(附完整编译、配置)
3.利用Naxsi在Nginx上构建WAF
4.定制轻量高效的WAF Naxsi (一)