nginx_lua_waf安装笔记

admin 2021年7月25日03:10:04评论112 views字数 5929阅读19分45秒阅读模式

最近vps总是被扫描器扫,扫的不亦乐乎,看了看日志,写了个小脚本统计了一下。


```

#!/usr/bin/python

import re

visiter = {}

row = 0

with open("www.leavesongs.com.log", "r") as fin:

for line in fin:

line = line.strip()

rex = re.match(r"^([d.]+).*$", line)

ip = rex.group(1)

if visiter.has_key(ip):

visiter[ip].append(line)

else:

visiter[ip] = []

visiter[ip].append(line)

row += 1

print "Row: %d" % row

print "Ip: %s" % len(visiter)

with open("stat.log", "w") as f:

for (k, v) in visiter.items():

print "%s : %d" % (k, len(v))

if len(v) <= 2:

f.write("%sn" % v)

```


nginx_lua_waf安装笔记

如上图,计算了究竟有多少IP在请求我的网站,然后每个IP请求的次数。正常情况下,请求次数在5以上,说明是一个浏览器用户在访问我。因为一个页面必然有css、javascript、images等资源同样需要请求。如果你发现一个IP只请求了你一次,很可能以下几种情况:

- 其他网站图片盗链:当请求的是图片的时候

- 蜘蛛在爬取(或者是伪装成蜘蛛的东西)

- rss订阅:请求的通常是/?rss、/rss.php之类的

- 扫描器在扫描,而且每次扫描的IP不同,可能是分布式扫描器


那么如果我发现一个IP访问我几百次,也只有几种情况:

- 我自己

- 我的忠实粉丝

- 爬虫或扫描器在扫

当然,第二种可能性微乎其微了。


为了防御无良扫描器。所以,想在自己的VPS上装一个WAF。以前尝试过一个WAF叫nasxi,但感觉效果一般,自定义性不好。

lua是一个轻量、快速的语言,一门语言的灵活度一定是比一个配置文件要高很多的,这也是我为何会选择用ngx_lua_waf作为WAF的原因。

我选择先在我树莓派上试安装一遍,免得把我虚拟机装坏了。

这是ngx_lua_waf的主页: https://github.com/loveshell/ngx_lua_waf

按照作者说法,我需要先安装lua-nginx-module:https://github.com/openresty/lua-nginx-module

再次按照lua-nginx-module作者的说法,我需要先安装LuaJIT、ngx_devel_kit。那么一步一步来。


## 一、安装luaJIT

luaJIT是一个C语言写的lua解释器,我的树莓派上原本就是有lua5.1.5版本的,但我还是选择用luaJIT,据说是效率较高一些。

通过git下载luajit2.0版本的源码、编译、安装:


git clone http://luajit.org/git/luajit-2.0.git

cd luajit-2.0

make

sudo make install PREFIX=/home/pi/luajit-2.0


没啥特别的,就像所有linux软件一样。

nginx_lua_waf安装笔记


## 二、下载ngx_devel_kit

ngx_devel_kit是nginx的一个模块,用来拓展nginx服务器核心功能。其他模块可以在这个框架下更轻松的进行开发。

首先下载下来:


git clone https://github.com/simpl/ngx_devel_kit.git


不用编译了。



## 三、下载lua-nginx-module

我选择lua-nginx-module v0.9.5版本

wget https://github.com/openresty/lua-nginx-module/archive/v0.9.15.tar.gz

tar -zxvf v0.9.15.tar.gz



## 四、升级、编译nginx

树莓派之前是安装了nginx的,所以首先看看nginx版本以及当时编译的时候的编译选项:


nginx_lua_waf安装笔记

真多呀。。版本也比较低,1.2.1,先在nginx都1.7.10了,我准备把nginx升级到最新版。

先下载并解压1.7.10。


wget http://nginx.org/download/nginx-1.7.10.tar.gz

tar -zxvf nginx-1.7.10.tar.gz

cd nginx-1.7.10/


然后我想整理一下nginx的这些模块,有些模块用不上的可以不用加了。当时安装nginx是通过apt-get进行安装的,所以有些模块的源码不在树莓派里了,直接用上面列出的编译选项肯定编译不通过。


1.nginx-auth-pam

提供pam认证的模块,对于我来说并没有太大意义,可以去掉。

2.nginx-echo

可以在nginx配置文件中使用echo语句,输出一些东西。其实还是比较有意思,但我这里为了不找麻烦,也没必要保留之。

3.nginx-upstream-fair

负载均衡模块,我单独的vps或树莓派也是用不上的。

4.nginx-dav-ext-module

提供nginx没有实现的HTTP方法,比如OPTIONS。因为之前已经加了--with-http_dav_module,这个自带的模块包括了大多数HTTP命令了,RESTful支持的PUT、DELETE在http_dav_module已经实现,所以也没太大必要使用nginx-dav-ext-module。


综上所述,apt-get安装的外带模块实际都不是必要的。然后我需要加自己的了:


--with-ld-opt="-Wl,-rpath,/home/pi/luajit-2.0/lib"

--add-module=/home/pi/ngx_devel_kit

--add-module=/home/pi/lua-nginx-module/lua-nginx-module-0.9.15


分别是luajit的lib,ngx_devel_kit与lua-nginx模块。

最后得到如下配置:


# 先设置环境变量,指定luajit的lib、include目录

export LUAJIT_LIB=/path/to/luajit/lib

export LUAJIT_INC=/path/to/luajit/include/luajit-2.0

./configure --prefix=/etc/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-log-path=/var/log/nginx/access.log --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --lock-path=/var/lock/nginx.lock --pid-path=/var/run/nginx.pid --with-pcre-jit --with-debug --with-http_addition_module --with-http_dav_module --with-http_geoip_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_realip_module --with-http_stub_status_module --with-http_ssl_module --with-http_sub_module --with-http_xslt_module --with-ipv6 --with-sha1=/usr/include/openssl --with-md5=/usr/include/openssl --with-mail --with-mail_ssl_module --with-ld-opt="-Wl,-rpath,/home/pi/luajit-2.0/lib" --add-module=/home/pi/ngx_devel_kit --add-module=/home/pi/lua-nginx-module/lua-nginx-module-0.9.15


来到nginx目录/home/pi/nginx-1.7.10/执行之。

树莓派性能不行,check、make都挺慢的,过程中可以喝杯茶。

运行到一半时还是出错了:

nginx_lua_waf安装笔记


出错不可怕,可怕的是不知道出了什么错。这里,错误被说得很明白,所以解决起来也不是什么难题。

在stackoverflow很快找到安装pcre library的方法:

nginx_lua_waf安装笔记


所以执行一下:


sudo apt-get update

sudo apt-get install libpcre3 libpcre3-dev


就可以了。还是得喝茶,因为太慢。不光树莓派慢,网速也慢。

好吧,还有依赖没装:

nginx_lua_waf安装笔记


继续装。


sudo apt-get install libxml2 libxml2-dev libxslt-dev


继续有依赖没装:

nginx_lua_waf安装笔记

继续装:


sudo apt-get install libgd2-xpm libgd2-xpm-dev


继续出错:

nginx_lua_waf安装笔记


继续装:


sudo apt-get install geoip-database libgeoip-dev


继续装的过程中,发现这样一个博客:http://www.cnblogs.com/terrysun/archive/2012/11/22/2782472.html

我只能说,知我者,君也。

不过在装goeip的时候,树莓派的源似乎连不上了。

nginx_lua_waf安装笔记

我们看看geoip是什么module:

http://nginx.org/en/docs/http/ngx_http_geoip_module.html

其实是一个根据IP来定位的module,在我这是用不上的。所以我也不自找麻烦,直接将--with-http_geoip_module去掉就OK了。

OK 完毕,开始编译:


make


再次喝茶。茶都喝穿了。

好了,将之前的nginx可执行文件备份一遍,把新的复制过去


sudo mv /usr/sbin/nginx /usr/sbin/nginx-1.2

sudo cp objs/nginx /usr/sbin/nginx

sudo /usr/sbin/nginx -t


测试OK:

nginx_lua_waf安装笔记

将Makefile文件中upgrade节点中的/etc/nginx/sbin/nginx -t改为/usr/sbin/nginx -t

就开始平滑升级:


sudo make upgrade


nginx_lua_waf安装笔记
nginx_lua_waf安装笔记

OK,已经升级成功,而且lua-nginx-module,我们主要的任务已经编译进去了。

可以开始加载我们的ngx_lua_waf了。


## 五、下载并配置ngx_lua_waf

首先用git从github将ngx_lua_waf下载下来,并拷贝到nginx目录下


git clone https://github.com/loveshell/ngx_lua_waf.git

cp -R ngx_lua_waf /etc/nginx/waf/


然后编辑nginx的主配置文件nginx.conf,在http段中加入如下配置:


##

# ngx_lua_waf config

##

lua_package_path "/etc/nginx/waf/?.lua";

lua_shared_dict limit 10m;

init_by_lua_file /etc/nginx/waf/init.lua;

access_by_lua_file /etc/nginx/waf/waf.lua;


再把/etc/nginx/waf/config.lua中,按照自己的情况修改一下路径:


RulePath = "/etc/nginx/waf/wafconf/"

logdir = "/var/log/ngx_lua_waf/"


OK。大功告成。重启nginx:


sudo service nginx reload


测试一下:

nginx_lua_waf安装笔记


可见已经让我go away了,赶紧滚蛋~

确实要滚去睡觉了。


--


以下是第二天

昨晚把树莓派装好了,今天开始装vps。这才是我最终目的。

自己的vps就是快,很快就按步骤基本做好了,结果卧槽最后重启nginx的时候报错了:


Reload service nginx... nginx: [emerg] unknown directive "lua_package_path" in /usr/local/nginx/conf/nginx.conf:114


为毛换个机子就出错呀。而且错误是说不认得lua_package_path这个配置项,可是我明明把lua-nginx-module编译进去了呀?

执行nginx -V 发现一切正常:

nginx version: nginx/1.7.10

built by gcc 4.7.2 (Debian 4.7.2-5)

TLS SNI support enabled

configure arguments: --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-ipv6 --with-ld-opt=-Wl,-rpath,/root/luajit-2.0/lib --add-module=/root/ngx_devel_kit --add-module=/root/lua-nginx-module-0.9.15


最后确实有/root/lua-nginx-module-0.9.15的。

于是想了很久,干脆重新编译了一次,这次用的是:


make -j2

make install


不再用upgrade,这时候nginx -t就OK了。

重启用service nginx restart不要用reload,否则waf功能加载不上。

基本就是这些笔记了,以后还需要对lua规则进行一些折腾,希望做成一个最适合我的防火墙。

本文始发于微信公众号(代码审计):nginx_lua_waf安装笔记

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年7月25日03:10:04
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   nginx_lua_waf安装笔记https://cn-sec.com/archives/360072.html

发表评论

匿名网友 填写信息