因为工作需要,我们要在用Nginx的负载均衡主机做简单的WAF。需要实现防御XSS、SQL注入或者其它安全问题。

最后,我们找到了Naxsi这个开源的项目。

Naxsi的意思是 ==Nginx Anti XSS & SQL Injection==。 所以它主要是防御XSS和SQL注入的。

还有,要注意Naxsi的过滤器只能处理GETPOST的请求,如果是其他类型的请求请选择其他模块。

Naxsi好处都有啥?

Naxsi 依赖一个值得肯定的模型, 有多个优点, 但受一些限制束缚 :

专业的 :

  • 快速 : 简约,轻量级运行
  • 弹性 : Signature-less的设计允许提高对付混淆/复杂的攻击的弹性
  • 独立更新 : Signature-less的设计允许可持续的安全, 即使没有更新

配置 :

  • 积极的做法需要一个更重要的白名单机制而不是单靠模型
  • 由于Naxsi就像一个网络防火墙, 如果您设置更多安全松散的规则, 您的web应用程序将无法正常保护

怎么安装?

下载最新版

请前往Naxsi在Github上的项目页,用Git下载吧。

当然,可以选择下载不同版本的Naxsi。到TAGS浏览各种你想要的版本。

1
2
wget http://nginx.org/download/nginx-x.x.xx.tar.gz
wget https://github.com/nbs-system/naxsi/archive/TAG_NAME.tar.gz

编译

请先用你喜欢的包管理器安装 libpcre, Naxsi依赖它处理正则表达式.

如果你希望处理https的页面则需要 libssl, 希望支持gzip则需要 zlib.

接下来需要configure脚本配置Nginx的安装。注意加上--add-module={Naxsi的目录}确保Naxsi模块可以被编译。

1
2
3
4
cd nginx-*
./configure --add-module=../naxsi-x.xx/naxsi_src/
make
make install

我的小站的配置是这样的:

1
./configure --add-module=../naxsi-master/naxsi_src --with-http_stub_status_module --with-http_ssl_module 

反正根据你的实际状况进行配置。

注意!

你需要记住: NGINX 运行模块的顺序 是 根据模块指令在 Nginx 的 ./configure的顺序。 所以, 无论如何 (除非你知道你在做什么) 把 Naxsi 放在 ./configure 的第一位上。

如果不这么做, 你可能引发一些奇怪的问题, 随机性地无法正常启用WAF。

怎么使用?

引用核心规则

初始化安装需要引用Naxsi的核心规则文件 - naxsi_core.rules(在项目的 /naxsi_config/ 目录下)

下面是一个简单的 /etc/nginx/nginx.conf 配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
user                www-data;
worker_processes 1;
worker_rlimit_core 500M;
working_directory /tmp/;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
use epoll;
# multi_accept on;
}
http {
include /etc/nginx/naxsi_core.rules; #引用核心规则
include /etc/nginx/mime.types;
server_names_hash_bucket_size 128;
access_log /var/log/nginx/access.log;
sendfile on;
keepalive_timeout 65;
tcp_nodelay on;
gzip on;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";
include /etc/nginx/sites-enabled/*;
}

注意到/etc/nginx/naxsi_core.rules在哪里被引用了吗?

你需要做的唯一事情就是把 naxsi_core.rules 放在 http {} 里面(==不要放入**server {}**里面!!!==)

这样就大功告成了! 以后不再需要动 naxsi_core.rules 这个核心规则。

引用子规则

子规则是配置在Server中的,更多是起到配置 过滤等级 还有 白名单 的作用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
server {
proxy_set_header Proxy-Connection "";
listen *:80;
access_log /tmp/nginx_access.log;
error_log /tmp/nginx_error.log debug;
location / {
include /etc/nginx/naxsi.rules; #引用子规则
proxy_pass http://x.x.x.x/;
proxy_set_header Host www.mysite.com;
}
location /RequestDenied { #配置拦截后拒绝访问时展示的页面
return 418;
}
}

例子中 /etc/nginx/naxsi.rules 的配置是这样的:

1
2
3
4
5
6
7
8
9
10
LearningMode; #启用学习模式,即拦截请求后不拒绝访问,只将触发规则的请求写入日志
SecRulesEnabled; #
#SecRulesDisabled;
DeniedUrl "/RequestDenied"; #拒绝访问时展示的页面
## 检查规则
CheckRule "$SQL >= 8" BLOCK;
CheckRule "$RFI >= 8" BLOCK;
CheckRule "$TRAVERSAL >= 4" BLOCK;
CheckRule "$EVADE >= 4" BLOCK;
CheckRule "$XSS >= 8" BLOCK;

如果你按照以上配置,会产生以下效果:

  • Naxsi 将被启用
  • Naxsi 不会拒绝被拦截的请求 (因为开启了学习模式)
  • 被拦截的请求会被写入本地的 error.log 文件中

例如访问 http://127.0.0.1/?a=%3C, 你会看到error.log 文件中会有一条记录。

1
2015/07/19 10:09:15 [error] 8402#0:*3 NAXSI_FMT: ip=127.0.0.1&server=127.0.0.1&uri=/&learning=0&vers=0.50&total_processed=3&total_blocked=1&zone0=ARGS&id0=1302&var_name0=a, client: 127.0.0.1, server: , request: "GET /?a=< HTTP/1.0", host: "127.0.0.1"

如果看到以上日志,则说明Naxsi已经成功安装到你的服务器中啦!

注意在最后生产环境一定要把 学习模式 关闭,不然是没有拒绝访问 防御的效果。

==学习模式只是用来帮助你在不影响正常访问的情况下找到触发安全规则的合法请求,然后方便你配置白名单。==

下一篇文章将会介绍 **Naxsi的 白名单配置 方法**。

除非注明,麦麦小家文章均为原创,转载请以链接形式标明本文地址。

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)

本文地址:https://blog.micblo.com/2015/07/19/NGINX%E7%9A%84WAF%E6%A8%A1%E5%9D%97-Naxsi%E7%9A%84%E7%AE%80%E4%BB%8B%E4%B8%8E%E5%AE%89%E8%A3%85-1/