【转】Nginx 学习笔记(十一)nginx下安装配置naxsi waf防火墙(附完整编译、配置)
原文地址:http://f2ex.cn/nginx-installed-configuration-naxsi-waf/
Naxsi 是第三方 nginx 模块 ,它和 Modsecurity 都是开源 WAF ,但是它们的防御模式不同。 Naxsi 不依赖像防病毒软件这样的签名库,因此不会被“未知”攻击模式所规避,它就像是 windows 下默认的防火墙。Naxsi 和其他 WAF 之间的另一个主要区别就是仅过滤 GET 和 POST 请求。
我之前一直在用 modsecurity ,效果还不错,但是它对 nginx 支持真的不太好~.~ 。经常会产生大量错误日志,不过这个并不影响它的正常功能,只是看着揪心。让我想更换它的主要原因是 Modsecurity 经常在处理某个请求(正常或不正常)时,会突然导致 CPU 99.9% 以上,这是最不能忍受的。
我们先来简单对比下 Naxsi 和 Modsecurity :
WAF | Naxsi | Modsecurity |
---|---|---|
Nginx 兼容性 | 好(第三方 nginx 模块) | 不好(原 Apache 下的模块,Nginx 下bug较多) |
防御模式 | 简单(不依赖签名库) | 复杂(依赖更新规则) |
白名单规则 | 支持 | 支持 |
安装难度 | 容易 | 一般(需要安装依赖库) |
社区支持 | 一般 | 较好 |
内存占用 | 小 | 大?不到哪去 |
特色 | 支持学习模式,可借助 nxapi/nxtool 自动分析白名单 | 可开启只记录不阻止,但是官方没有提供分析工具。 |
总结 | Naxsi 比较灵活,所以学习成本较大,白名单规则需要自己完成。对 Nginx 支持良好,快速轻便。 | Modsecurity 操作简单,规则更新较快,比较占用服务器资源,对于生产环境下的 Nginx 来说是个噩梦 |
在日常使用中,可以发现 Modsecurity 具有非常严格的防御规则(误报挺多的),并且规则支持较好(有强大的后台?)。如果你使用 Apache 服务器,推荐使用 Modsecurity WAF。如果你使用的是 Nginx 服务器,建议先尝试使用 Naxsi 。
下面就来在 Centos 下编译安装 Nginx + Naxsi WAF 。Modsecurity 的编译安装在这里。
编译 Nginx + Naxsi
首先先运行:
1 | # nginx -V |
然后可以看到现有的模块,复制保存一下备用。
1 | 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 |
下载 Nginx 和 Naxsi
Naxsi 应该使用所有高于 0.8.X 的 Nginx 版本。 Naxsi 版本可以在 https://github.com/nbs-system/naxsi 这里,选择 Branch –> Tags 查看版本号。
下载 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 naxsi-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 | . /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 ./objs/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/ 就成功了。
nginx/naxsi 基本配置
首先将 naxsi 目录下的 naxsi_core.rules 拷贝至 nginx.conf 所在目录。
http 部分配置
打开 nginx.conf 在 http 部分配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | http { include naxsi_core.rules; #导入 naxsi 核心规则 ... } server 部分配置 在 nginx.conf 的 server 部分配置: location / { #开启 naxsi SecRulesEnabled; #开启学习模式 LearningMode; #定义阻止请求的位置 DeniedUrl "/50x.html" ; #CheckRules, 确定 naxsi 何时采取行动 CheckRule "$SQL >= 8" BLOCK; CheckRule "$RFI >= 8" BLOCK; CheckRule "$TRAVERSAL >= 4" BLOCK; CheckRule "$EVADE >= 4" BLOCK; CheckRule "$XSS >= 8" BLOCK; #naxsi 日志文件 error_log /... /foo .log; ... } error_page 500 502 503 504 /50x .html; #This is where the blocked requests are going location = /50x .html { return 418; #I'm a teapot \o/ } |
server 完整示例配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | server { listen 80 default; access_log /wwwlogs/access_nginx .log combined; root /www/site ; index index.html index.htm index.php; location ~ [^/]\.php(/|$) { SecRulesEnabled; #LearningMode; DeniedUrl "/RequestDenied" ; CheckRule "$SQL >= 8" BLOCK; CheckRule "$RFI >= 8" BLOCK; CheckRule "$TRAVERSAL >= 4" BLOCK; CheckRule "$EVADE >= 4" BLOCK; CheckRule "$XSS >= 8" BLOCK; error_log /wwwlogs/foo .log; fastcgi_pass unix: /dev/shm/php-cgi .sock; fastcgi_index index.php; include fastcgi.conf; } location /RequestDenied { return 403; } location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|ico)$ { expires 30d; access_log off; } location ~ .*\.(js|css)?$ { expires 7d; access_log off; } } |
测试
测试 nginx 配置
1 2 3 | /nginx/sbin/nginx -t nginx: the configuration file /nginx/conf/nginx .conf syntax is ok nginx: configuration file /nginx/conf/nginx .conf test is successful |
重启 nginx
1 | service nginx reload |
防御测试
浏览器中打开 http://www.test.com/?a=<>‘ ,出现 403 错误,并且在 foo.log 中出现 NAXSI_FMT 开头的日志。恭喜你 Naxsi 启用成功。
白名单规则
Naxsi 社区提供了一些常用的白名单规则,例如 wordpress 。可以在 https://github.com/nbs-system/naxsi-rules下载白名单规则。
然后将规则 include 到 server 内的 location 中。重启 nginx 即可。不过目前这些白名单最近的修改日期显示是1年前~.~ ,可根据自身需要添加白名单规则。
详细的白名单规则以及 Naxsi 其他支持,可参考 Naxsi WIKI。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2017-11-23 Web 学习笔记(一)百度统计
2017-11-23 Nginx 学习笔记(六)引入线程池 性能提升9倍