Skip to content

Latest commit

 

History

History
129 lines (107 loc) · 5.66 KB

README.md

File metadata and controls

129 lines (107 loc) · 5.66 KB

这是一个基于lua和nginx的waf

nginx的配置文件开发起来很麻烦也不优雅,这里用lua进行扩充,本项目借鉴loveshell,部分函数重写优化, 并感谢openresty的ngx_lua开源集成。本waf有更清晰、精简的实现方法和供理解的注释,并大量扩充了规则库。顺便学习lua语言,实践证明学起来很快,非常好上手。

环境部署改为采用openresty1.9.3.2和兼容性强的ubuntu14.04。

原理:

1. 每个worker(工作进程)创建一个Lua VM,worker内所有协程共享VM;
2. 将Nginx I/O原语封装后注入 Lua VM,允许Lua代码直接访问;
3. 每个外部请求都由一个Lua协程处理,协程之间数据隔离;
4. Lua代码调用I/O操作等异步接口时,会挂起当前协程(并保护上下文数据),而不阻塞worker;
5. I/O等异步操作完成时还原相关协程上下文数据,并继续运行;

ngx_lua的API以及介绍:

功能及优点:

总结起来就是全功能的http头检查:

  • 防止sql注入,本地包含,部分溢出,fuzzing测试,命令执行,xss等web攻击 (通过检查url参数、post等参数实现)
  • 防止数据库备份之类文件泄漏(通过检查用户url实现)
  • 防止常见的测压攻击、cc攻击 (通过检查请求频率实现)
  • 屏蔽常见的扫描黑客工具,扫描器 (通过检查UA实现)
  • 屏蔽异常的网络请求 (通过请求频率、黑白名单实现)
  • 防止webshell上传 (通过检查post敏感内容实现)

文件说明:

  • process.lua waf功能检查顺序文件
  • config.lua waf开关以及配置,注释英语很好懂,on为开,off为关
  • fuctions.lua waf的各项参数的检查函数
  • load.lua waf的功能流程以及用户参数获取
  • nginx.conf openresty自带nginx的配置文件,这里拿出来供配置不成功的朋友做个参考

不足之处:

  • 要合理把握好log文件目录权限,否则用户故意构造含webshell的请求,容易文件包含从logs提权
  • 规则是静态的,除非实时更新,否则迟早被绕过
  • 维护用正则表达式构成的规则比较繁琐,后面参看我机器学习实现的waf,对,就是这么膨胀,先立下flag,部署有想法了,日后实现。除了数据打标繁琐外、每次更新功能时,再次训练一下模型,让机器自己识别,岂不美哉?

部署(我用的是ubuntu14.04,其他的自测):

比较繁琐,花了两天时间终于摸索出来了,很开心🌝 既然这里面安装openresty,之前先要彻底删除nginx,因为openresty自带nginx。

sudo apt-get--purge remove nginx
sudo apt-get autoremove
ps -ef|grep nginx
dpkg --get-selections|grep nginx 
sudo apt-get --purge remove nginx//查询上一步操作与nginx有关的软件,删掉
sudo apt-get --purge remove nginx-common
sudo apt-get --purge remove nginx-core
ps -ef |grep nginx//看一下进程,还有就删掉

安装依赖包

apt-cache serach readline
apt-get install libpcre-dev  libpcrecpp0 libpcre3   //nginx要用它做正则引擎
apt-get install libreadline-dev libreadline6-dev libtinfo-dev
apt-get install openssl libssl-dev perl make build-essential curl   
//openssl做安全引擎

下载并编译安装openresty(ngx_openresty-1.9.3.2.tar.gz)

 cd /usr/local/src/
 wget https://openresty.org/download/ngx_openresty-1.9.3.2.tar.gz
 tar -zxf ngx_openresty-1.9.3.2.tar.gz
 cd ngx_openresty-1.9.3.2
[root@ ngx_openresty-1.9.3.2] ./configure --prefix=/usr/local/openresty-1.9.3.2 --with-luajit --with-http_stub_status_module --with-pcre --with-pcre-jit
[root@ ngx_openresty-1.9.3.2] make, make install
[root@ ngx_openresty-1.9.3.2]ln -s /usr/local/openresty-1.9.3.2/ /usr/local/openresty

测试openresty安装

//在/usr/local/openresty/nginx/nginx.conf添加
location /hi {
default_type text/html;
content_by_lua_block{
ngx.say('hello fuckopenrastry')
}
}

测试并启动openrestry下的nginx

[root@ ngx_openresty-1.9.3.2] /usr/local/openresty/nginx/sbin/nginx -t //文本模式详细信息
nginx: the configuration file /usr/local/openresty-1.9.3.2/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/openresty-1.9.3.2/nginx/conf/nginx.conf test is successful

[root@ ngx_openresty-1.9.3.2] pkill nginx //杀死进程
[root@ ngx_openresty-1.9.3.2] /usr/local/openresty/nginx/sbin/nginx   //重新启动

在github上克隆下代码

[root@ ~] git clone https://github.com/aviraonepiece/waf
Cloning into 'waf'...
remote: Counting objects: 75, done.
remote: Total 75 (delta 0), reused 0 (delta 0), pack-reused 75
Unpacking objects: 100% (75/75), done.
[root@ ~]# cp -a ./waf/waf /usr/local/openresty/nginx/conf/

修改Nginx的配置文件,加入(http字段)以下配置。注意路径,同时WAF日志默认存放在/tmp/日期_waf.log

[root@ ~] vim /usr/local/openresty/nginx/conf/nginx.conf
#WAF
lua_shared_dict limit 50m; #防cc使用字典,大小50M
lua_package_path /usr/local/openresty/nginx/conf/waf/?.lua; //waf规则
init_by_lua_file /usr/local/openresty/nginx/conf/waf/fuctions.lua; //初始化规则
access_by_lua_file /usr/local/openresty/nginx/conf/waf/process.lua;

[root@ ~] /usr/local/openresty/nginx/sbin/nginx -t
[root@ ~]/usr/local/openresty/nginx/sbin/nginx -s reload  //重新载入更新配置

根据日志记录位置,创建日志目录

[root@ ~] mkdir /tmp/waf_logs
[root@ ~] chown -R www.www /tmp/waf_logs 
//这里要给此文件夹存放权限,可以暂时使用777权限,原则上要使用nginx的用户组