Ngx_lua_waf是一个web防火墙,主要通过lua实现,安装简单,性能优异,由国人loveshell开发。

ngx_lua_waf是我刚入职趣游时候开发的一个基于ngx_lua的web应用防火墙。

代码很简单,开发初衷主要是使用简单,高性能和轻量级。

现在开源出来,遵从MIT许可协议。其中包含我们的过滤规则。如果大家有什么建议和想法,欢迎和我一起完善。

主页上介绍的安装流程不是很详细,我这里详细记录了一下。

安装openresty平台

OpenResty 是一个基于 NGINX 和 LuaJIT 的 Web 平台,相当于集成了lua的Nginx,比自己编译安装Nginx+Lua要方便很多。步骤如下:


su

# 预装环境
yum install readline-devel pcre-devel openssl-devel gcc

# 下载安装包
wget https://openresty.org/download/openresty-1.9.7.4.tar.gz
tar zxvf openresty-1.9.7.4.tar.gz
cd openresty-1.9.7.4.tar.gz
./configure
make && make install

安装如果出现问题,可以参考 http://openresty.org/cn/installation.html

默认安装位置在/usr/local/openresty/nginx,修改conf/nginx.conf指定运行nginx worker的用户:

user nginx;
worker_processes 1;

#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

#pid logs/nginx.pid;

如果没有nginx用户,在root权限下运行useradd nginx即可添加。

如果是用systemctl管理服务,创建/lib/systemd/system/nginx.service文件,填写如下内容:

[Unit]
Description=nginx
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/openresty/nginx/sbin/nginx
ExecReload=/usr/local/openresty/nginx/sbin/nginx -s reload
ExecStop=/usr/local/openresty/nginx/sbin/nginx -s stop
PrivateTmp=true

[Install]
WantedBy=multi-user.target

即可使用systemctl命令管理nginx服务:

  • 启动 systemctl start nginx

  • 关闭 systemctl stop nginx

  • 重启 systemctl restart nginx

  • 开启自启动 systemctl enable nginx

部署Ngx_lua_waf

下载安装包到nginx配置目录,重命名为waf:

cd /usr/local/openresty/nginx/conf
git clone https://github.com/loveshell/ngx_lua_waf.git waf

然后修改Nginx.conf,在http下面增加以下waf配置:

http {
include mime.types;
default_type application/octet-stream;

# Lua包的路径
lua_package_path "/usr/local/openresty/nginx/conf/waf/?.lua";

# Lua运行时最大内存
lua_shared_dict limit 10m;

# Waf启动脚本
init_by_lua_file /usr/local/openresty/nginx/conf/waf/init.lua;

# Waf过滤逻辑脚本
access_by_lua_file /usr/local/openresty/nginx/conf/waf/waf.lua;

···

然后配置waf下的config.lua文件,主要是waf规则目录(RulePath)和日志目录(logdir):

RulePath = "/usr/local/openresty/nginx/conf/waf/wafconf"
--规则存放目录
attacklog = "off"
--是否开启攻击信息记录,需要配置logdir
logdir = "/usr/local/openresty/nginx/logs/hack/"
--log存储目录,该目录需要用户自己新建,且需要nginx用户的可写权限
UrlDeny="on"
--是否拦截url访问
Redirect="on"
--是否拦截后重定向
CookieMatch = "on"
--是否拦截cookie攻击
postMatch = "on"
--是否拦截post攻击
whiteModule = "on"
--是否开启URL白名单
black_fileExt={"php","jsp"}
--填写不允许上传文件后缀类型
ipWhitelist={"127.0.0.1"}
--ip白名单,多个ip用逗号分隔
ipBlocklist={"1.0.0.1"}
--ip黑名单,多个ip用逗号分隔
CCDeny="on"
--是否开启拦截cc攻击(需要nginx.conf的http段增加lua_shared_dict limit 10m;)
CCrate = "100/60"
--设置cc攻击频率,单位为秒.
--默认1分钟同一个IP只能请求同一个地址100次
html=[[Please go away~~]]
--警告内容,可在中括号内自定义
备注:不要乱动双引号,区分大小写

logdir目录尤其注意,需要用户自行创建,并且设置nginx用户可写,否则不会生成拦截日志也不会报错。

规则

规则文件在wafconf下面,分为:

  • args

  • cookie

  • post

  • url

  • user-agent

  • whiteurl

文件一行一条规则,基于正则表达式编写,你可以根据你的需要进行修改。

效果

在部署配置完成之后,执行命令systemctl restart nginx重启nginx服务,即可看到WAF效果:

waf-example

拦截页面内容配置在config.lua的html字段中,你可以自定义更美观的样式。