github 地址
https://github.com/nbs-system/naxsi
NAXSI 是 NGINX 的开源、高性能、低规则维护 WAF
1.安装
Naxsi依赖于PCRE 库。PCRE 是一个用于处理正则表达式的库。
软件源安装的nginx -V
没有--with-pcre --with-pcre-jit
这两个参数
所以只能用编译安装
下载最新版Naxsi
wget https://github.com/nbs-system/naxsi/archive/1.3.tar.gz
tar -xf 1.3.tar.gz
这边只需要naxsi
的模块,需要完全静态编译nginx + naxsi 可以参考Debian编译安装 编译时加上 --add-module=../naxsi-1.3/naxsi_src
./configure --with-compat --add-dynamic-module=../naxsi-1.3/naxsi_src
make modules
2.配置
将源码包下的naxsi-1.3/naxsi_config/naxsi_core.rules
规则
naxsi_core.rules
复制到 /etc/nginx/
编辑 nginx配置文件
vim /etc/nginx/nginx.conf
添加 naxsi 模块
放在pid 下面
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
load_module modules/ngx_http_naxsi_module.so;
在http块内添加规则
http {
# 包含NAXSI规则
include naxsi_core.rules;
...
}
在网站的 server部分进行如下配置
location / {
#启用 naxsi
SecRulesEnabled;
#学习模式,只记录,不拦截,方便自己设置白名单,生产环境则需要关闭
#LearningMode;
#定义阻止请求的位置
DeniedUrl "/RequestDenied";
#检查规则,确定 naxsi 何时需要采取行动
CheckRule "$SQL >= 8" BLOCK;
CheckRule "$RFI >= 8" BLOCK;
CheckRule "$TRAVERSAL >= 4" BLOCK;
CheckRule "$EVADE >= 4" BLOCK;
CheckRule "$XSS >= 8" BLOCK;
#naxsi 日志
error_log /var/log/foo.log;
}
location /RequestDenied {
return 403;
}
重启Nginx
systemctl restart nginx
浏览器中输入你的网站地址并连接?a=<>‘。如果出现 403 错误,并且在 foo.log 中出现 NAXSI_FMT开头的日志,则Naxsi 启用成功。
3.添加白名单
naxsi启用后默认的规则会造成很多误拦截,我网站启用后直接整个403了,所以需要添加下白名单。
首先添加以下两条后网站可以打开了
BasicRule wl:1010,1011 "mz:$ARGS_VAR:rd";
BasicRule wl:1015,1315 "mz:$HEADERS_VAR:cookie";
- BasicRule wl:1010,1011 “mz:$ARGS_VAR:rd”; 这条规则是将id为1010和1011的MainRule加入白名单,但只针对GET参数中名为rd的变量。也就是说,如果请求中包含类似于?rd=xxx的参数,那么naxsi不会对这个参数的值进行id为1010和1011的规则检测。
- BasicRule wl:1015,1315 “mz:$HEADERS_VAR:cookie”; 这条规则是将id为1015和1315的MainRule加入白名单,但只针对HTTP头部中名为cookie的变量。也就是说,如果请求中包含cookie头部,那么naxsi不会对这个头部的值进行id为1015和1315的规则检测。
后台无法发布修改文章
naxsi启用后网站的管理后台无法修改发布文章,因为naxsi把POST请求都拦截了。
我们先提交发布几次文章,然后打开日志文件我的定义/var/log/foot.log
查看拦截日志
一条日志看其中几个参数就可以了
参数说明可以看下面文章
https://www.yisu.com/zixun/150977.html
uri
zone
id
var
比如我的日志里这几个参数分别是
uri=/admin/mark/1html
zone0=BODY
id0=1001
var_name0=marktxt
那么我就可以添加规则
BasicRule wl:1001 "mz:$URL:/admin/mark/1html|$BODY_VAR:marktxt";
如果你想允许URL
中包含/admin/mark/1html
这个URI
,并且允许BODY
中的marktxt
变量包含SQL
和XSS
关键字,你可以使用这条规则
这条规则的意思是在URL
中包含/admin/mark/1html
的请求中禁用拦截规则1001
,这个规则是用来检测SQL
和XSS
攻击的。wl
表示白名单,mz
表示匹配区域。
如果日志里var
=为空可以这样写
BasicRule wl:1001 "mz:$URL:/admin/mark/1html|BODY";
以上只是示例,实际情况需要根据日志情况来写白名单
更多白名单规则维基:
https://github.com/nbs-system/naxsi/wiki/matchzones-bnf
https://github.com/nbs-system/naxsi/wiki/whitelists-examples
https://www.yisu.com/zixun/150977.html
https://www.jianshu.com/p/0044c1131b48
社区提供的naxsi规则
https://github.com/nbs-system/naxsi-rules
参考:
Nginx下安装配置WAF Naxsi - 简书 (jianshu.com)
利用 Naxsi 在 Nginx 上构建 WAF - 奇妙的 Linux 世界 (hi-linux.com)