原文地址: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

首先先运行:

# 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
下载 Nginx 和 Naxsi

Naxsi 应该使用所有高于 0.8.X 的 Nginx 版本。 Naxsi 版本可以在 https://github.com/nbs-system/naxsi 这里,选择 Branch –> Tags 查看版本号。

下载 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 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/ 和你之前备份的模块):

./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 ./objs/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/ 就成功了。

nginx/naxsi 基本配置

首先将 naxsi 目录下的 naxsi_core.rules 拷贝至 nginx.conf 所在目录。

http 部分配置

打开 nginx.conf 在 http 部分配置:

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 完整示例配置
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 配置

/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

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

【转】Nginx 学习笔记(十一)nginx下安装配置naxsi waf防火墙(附完整编译、配置)的更多相关文章

  1. 学习笔记(1)centos7 下安装nginx

    学习笔记(1)centos7 下安装nginx 这里我是通过来自nginx.org的nginx软件包进行安装的. 1.首先为centos设置添加nginx的yum存储库 1.通过vi命令创建一个rep ...

  2. nginx 学习笔记(2) nginx新手入门

    这篇手册简单介绍了nginx,并提供了一些可以操作的简单的工作.前提是nginx已经被安装到你的服务器上.如果没有安装,请阅读上篇:nginx 学习笔记(1) nginx安装.这篇手册主要内容:1. ...

  3. nginx 学习笔记(1) nginx安装

    1.nginx安装 根据操作系统的不同,nginx的安装方式也不相同. 1.1 对linux系统来说,nginx.org提供了nginx安装包.http://nginx.org/en/linux_pa ...

  4. nginx 学习笔记(3) nginx管理

    nginx可以通过向其发送信号来进行管理.默认情况下主进程的进程ID写到文件/usr/local/nginx/logs/nginx.pid中.当然也可以在配置文件中自定义该pid文件,自定义使用pid ...

  5. nginx学习之——CentOS6.0下安装nginx

    1.下载对应nginx版本 #注:下载地址:http://nginx.org/download/ wget -c http://nginx.org/download/nginx-1.10.3.tar. ...

  6. 七、Nginx学习笔记七Nginx的Web缓存服务

    user www; worker_processes 1; error_log /usr/local/nginx/logs/error.log crit; pid /usr/local/nginx/l ...

  7. Nginx学习之十一-Nginx启动框架处理流程

    Nginx启动过程流程图 下面首先给出Nginx启动过程的流程图: ngx_cycle_t结构体 Nginx的启动初始化在src/core/nginx.c的main函数中完成,当然main函数是整个N ...

  8. Nginx学习笔记六Nginx的模块开发

    1.Nginx配置文件主要组成:main(全局配置)这部分的指令将影响其他所有部分.server(虚拟主机配置)这部分指令主要用于指定虚拟主机域名,IP和端口.upstream(主要为反向代理,负载均 ...

  9. nodejs学习笔记(2)--Express下安装模版引擎ejs

    成功安装完express后,输入express -help,根据提示安装ejs(如下图): 根据提示-e实现安装ejs,注意此处有坑:之前安装的时候根据教程(node.js开发指南第五章5.2.2节) ...

随机推荐

  1. CentOS7 升级 gvim 到 8.x 版本

    因为 CentOS7 在默认情况下,通过 yum 安装的 vim-X11.x86_64 版本为 7.x 版本,对 Youcompleteme 支持不好.故需要升级到 8.x 版本. 以下记录 gvim ...

  2. 我们为什么要使用RabbitMQ?

     一.前言        这篇文章就是讲RabbitMQ的好处,你可能要说RocketMQ很好呀,我们主要看上的就是RabbitMQ支持多语言的客户端,很符合我们公司的现状,不要我们花费功夫去搞一个客 ...

  3. 基于令牌桶算法实现的SpringBoot分布式无锁限流插件

    本文档不会是最新的,最新的请看Github! 1.简介 基于令牌桶算法和漏桶算法实现的纳秒级分布式无锁限流插件,完美嵌入SpringBoot.SpringCloud应用,支持接口限流.方法限流.系统限 ...

  4. C# .NET 0命令行安装Windows服务程序

    设计原则:万物皆对象 背景:在我的项目中,即需要与硬件通过Socket连接通讯,又需要给App提供Wcf服务操作接口,虽然都完成了,但是却是一个控制台(虽然我很喜欢控制台,因为它简单易用),把它放到服 ...

  5. 类 Calendar

    简介 Java.util.Calendar是日历类,在Date后出现,替换掉了许多Date的方法.该类将所有可能用到的时间信息封装为静态成员变量,方便获取.日历类就是方便获取各个时间属性的.注意Cal ...

  6. codeforces#1139F. Dish Shopping (离散化数组数组+ 扫描线)

    膜拜大佬:https://blog.csdn.net/xyz32768/article/details/88831233 题目链接: http://codeforces.com/contest/113 ...

  7. Scrapy:腾讯招聘整站数据爬取

    项目地址:https://hr.tencent.com/ 步骤一.分析网站结构和待爬取内容 以下省略一万字 步骤二.上代码(不能略了) 1.配置items.py import scrapy class ...

  8. CSS3旋转缩放移动倾斜等效果——transform

    1.transform浏览器支持情况 也就是说目前不考虑老浏览器的话是不用加前缀的,感谢菜鸟教程:https://www.runoob.com/cssref/css3-pr-transform.htm ...

  9. Ubuntu常用软件

    //latex公式识别 sudo snap install mathpix-snipping-tool //markdown # or run: # sudo apt-key adv --keyser ...

  10. Tomcat不需要输入项目名便可访问项目(直接用域名或者ip)

    一般需要输入项目名访问项目是怎么个方法呢? 直接将项目放在 tomcat 安装目录的 webapps 目录下, 然后在域名或者ip后面 域名(ip)/项目目录, 这样会显得比较麻烦. 那么应该怎么才可 ...