安装NAXSI NGINX WAF 防火墙

logo.png

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变量包含SQLXSS关键字,你可以使用这条规则
这条规则的意思是在URL中包含/admin/mark/1html的请求中禁用拦截规则1001,这个规则是用来检测SQLXSS攻击的。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)

# naxsi  nginx 

本文由:星际难民
实践,测试,整理发布.如需转载请注明地址 本文标题:安装NAXSI NGINX WAF 防火墙
地址:https://530503.xyz/articles/2023/08/23/1692790594389.html

评论

取消