Hexo

Nginx下安装配置WAF Naxsi

2018-08-19

本文主要讲一下如何用第三方Nginx模块Naxsi来构建一个可用的WAF。

关于Naxsi

Naxsi是一个开放源代码、高效、低维护规则的Nginx Web应用防火墙模块,它的主要目标是帮助人们加固Web应用程序,以抵御SQL注入、跨站脚本、跨域伪造请求、本地和远程文件等包含的漏洞。

Naxsi与其它WAF的区别是,它不靠后签名来检测和阻止攻击。它使用一个简单的模型,而不是试图发现已知的攻击,它在HTTP请求/参数检测意外的字符。

同为开源WAF,跟Modsecurity的不同是,它对Nginx的兼容性非常好,而且不依赖现有规则库。单单基于规则库的拦截可能需要经常更新,且容易被绕过,防御起来比较被动,而Naxsi安装定制都非常简单方便,占用系统资源相对较少,对实际业务的适用性更强[方便的白名单设置],有一定的学习能力,不过,实际测试中貌似暂时只能拦截从get或者post过来的数据,这也是个小遗憾。

更详细的信息请见Naxsi官网

安装Naxsi

首先运行

1
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目录:

1
2
3
4
5
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/),命令如下:

1
2
3
4
5
6
7
8
./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二进制文件。

1
2
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 模块。

1
nginx -V

看到有 –add-module=../naxsi-0.55.3/naxsi_src/ 就成功了。

配置Naxsi

首先将naxsi-0.55.3/naxsi_config的naxsi_core.rules拷贝至nginx.conf所在目录。

1
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 logs/foo.log;#naxsi 日志文件
    ...
}
...
location /RequestDenied {
    return 403;
}    

测试Naxsi

检查Nginx配置文件是否正确修改。

1
/path/to/nginx/sbin/nginx -t

结果显示如下,则说明正确修改配置信息。

Nginx配置文件测试

重启Nginx。

1
service nginx reload

浏览器中输入你的网站地址并连接?a=<>‘。如果出现 403 错误,并且在 foo.log 中出现 NAXSI_FMT开头的日志,则Naxsi 启用成功。

参考资料

1.Naxsi Wiki
2.nginx下安装配置naxsi waf防火墙(附完整编译、配置)
3.利用Naxsi在Nginx上构建WAF
4.定制轻量高效的WAF Naxsi (一)