开源nginx_lua_waf部署安装
0x01 前言
ngx_lua_waf实现 WAF一句话描述,就是解析HTTP请求(协议解析模块),规则检测(规则模块),做不同的防御动作(动作模块),并将防御过程(日志模块)记录下来。所以本文中的WAF的实现由五个模块(配置模块、协议解析模块、规则模块、动作模块、错误处理模块)组成。
原版本主要的功能如下:
.防止sql注入,本地包含,部分溢出,fuzzing测试,xss,SSRF等web攻击 .防止svn/备份之类文件泄漏 .防止ApacheBench之类压力测试工具的攻击 .屏蔽常见的扫描黑客工具,扫描器 .屏蔽异常的网络请求 .屏蔽图片附件类目录php执行权限 .防止webshell上传
二次改造后的规则拦截功能:
.支持IP白名单和黑名单功能,直接将黑名单的IP访问拒绝。 .支持URL白名单,将不需要过滤的URL进行定义。 .支持User-Agent的过滤,匹配自定义规则中的条目,然后进行处理(返回403)。 .支持CC攻击防护,单个URL指定时间的访问次数,超过设定值,直接返回403。 .支持Cookie过滤,匹配自定义规则中的条目,然后进行处理(返回403)。 .支持URL过滤,匹配自定义规则中的条目,如果用户请求的URL包含这些,返回403。 .支持URL参数过滤,原理同上。 .支持日志记录,将所有拒绝的操作,记录到日志中去。 .日志记录为JSON格式,便于日志分析,例如使用ELKStack进行攻击日志收集、存储、搜索和展示
0x02 Nginx + Lua部署
系统环境:centos7.0x64
1.进入到/usr/local/src目录下
[root@localhost src]# cd /usr/local/src
2.分别下载Nginx安装必备的Nginx和PCRE软件包以及当前最新的luajit和ngx_devel_kit (NDK)软件包和春哥编写的lua-nginx-module。
[root@localhost src]# wget http://nginx.org/download/nginx-1.9.4.tar.gz [root@localhost src]#wget https://ftp.pcre.org/pub/pcre/pcre-8.37.tar.gz --no-check-certificate
[root@localhost src]#wget http://luajit.org/download/LuaJIT-2.0.4.tar.gz [root@localhost src]# wget https://github.com/openresty/lua-nginx-module/archive/v0.9.16.tar.gz --no-check-certificate [root@localhost src]# wget https://github.com/simpl/ngx_devel_kit/archive/v0.2.19.tar.gz --no-check-certificate
3. 创建Nginx运行的普通用户
[root@nginx-lua src]# useradd -s /sbin/nologin -M www
4.分别在当前目录下解压已下载的软件包
[root@localhost src]# tar zxvf v0.2.19.tar.gz [root@localhost src]# tar zxvf v0.9.16.tar.gz
[root@localhost src]# tar zxvf pcre-8.37.tar.gz
[root@localhost src]# tar zxvf LuaJIT-2.0..tar.gz
5. 安装Luajit以及需要编译的gcc编译环境。
[root@localhost src]# cd LuaJIT-2.0. [root@localhost src]#yum install gcc [root@localhost src]# make && make install
6. 安装Nginx并加载模块以及需要编译的openssl模块和c++模块。
[root@localhost LuaJIT-2.0.]# cd .. [root@localhost src]# tar zxvfnginx-1.9..tar.gz
[root@localhost src]# export LUAJIT_LIB=/usr/local/lib [root@localhost src]# export LUAJIT_INC=/usr/local/include/luajit-2.0
[root@localhost nginx-1.9.]# yum -y install openssl openssl-devel
[root@localhost nginx-1.9.]# ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-http_stub_status_module --with-file-aio --with-http_dav_module --add-module=../ngx_devel_kit-0.2./ --add-module=../lua-nginx-module-0.9./ --with-pcre=/usr/local/src/pcre-8.37/
[root@localhost nginx-1.9.]# yum -y install gcc-c++
[root@localhost nginx-1.9.]# make -j2 && make install
7. 创建软连接动态库连接
[root@localhost nginx-1.9.]# ln -s /usr/local/lib/libluajit-5.1.so. /lib64/libluajit-5.1.so.
8.启动nginx服务
root@localhost nginx-1.9.]# /usr/local/nginx/sbin/nginx-t [root@localhost nginx-1.9.]# /usr/local/nginx/sbin/nginx
9关闭centos7自带的防火墙
[root@localhost nginx-1.9.]# sed -i 7s/enforcing/disabled/ /etc/selinux/config [root@localhost nginx-1.9.]# systemctl stop firewalld.service
10.远程访问http:// 172.16.89.145,显示页面如下,表示已成功安装nginx
11.安装git服务
[root@localhost src]# yum install git
12.克隆下载ngx_lua_waf, nginx安装路径假设为:/usr/local/nginx/conf/
把ngx_lua_waf下载到conf目录下,解压命名为waf
[root@localhost src]# git clone https://github.com/loveshell/ngx_lua_waf.git [root@localhost ngx_lua_waf]# cd /usr/local/nginx/conf/ [root@localhost conf]# mkdir waf
[root@localhost ngx_lua_waf]#cp -R /usr/local/src/ngx_lua_waf/* /usr/local/nginx/conf/waf/
注意,其主要目录信息如下:
├── config.lua #waf的配置文件
├── init.lua #读取waf的规则文件
├── install.sh #waf安装文件,需要做修改
├── README.md #说明文档
├── wafconf #规则库
│ ├── args #get请求的参数过滤规则
│ ├── cookie #cookie过滤规则
│ ├── post #post请求过滤规则
│ ├── url #get请求的URL过滤规则
│ ├── user-agent #user-agent过滤规则
│ └── whiteurl #白名单
└── waf.lua #waf规则执行文件
13.在nginx.conf中的http段进行配置
[root@localhost waf]# vi /usr/local/nginx/conf/nginx.conf
大概的配置信息如下,Nginx.conf:
lua_package_path "/usr/local/nginx/conf/waf/?.lua"; lua_shared_dict limit 10m; init_by_lua_file/usr/local/nginx/conf/waf/init.lua; access_by_lua_file /usr/local/nginx/conf/waf/waf.lua;
14.修改ngx_lua_waf下的config.lua文件
root@localhost waf]# vi /usr/local/nginx/conf/waf/config.lua [root@localhost logs]# mkdir waf
配置详细信息如下,config.lua:
RulePath = "/usr/local/nginx/conf/waf/wafconf/"
--规则存放目录
attacklog = "off"
--是否开启攻击信息记录,需要配置logdir
logdir = "/usr/local/nginx/logs/waf/"
--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~~]]
--警告内容,可在中括号内自定义
备注:不要乱动双引号,区分大小写
15.重启nginx服务
/usr/local/nginx/sbin/nginx -s reload
16.访问带恶意的连接地址,出现如下信息表示ngx_lua_waf已部署成功。
http://172.16.89.145/?s=../etc/passwd
0x03 记录WAF日志拦截记录
1.给logs日志记录添加授权用户www(该用户是nginx运行的用户)。
[root@localhost waf]# chown -R www.www /usr/local/nginx/logs/waf/
2.给logs目录进行添加写入权限。
[root@localhost waf]# chmod /usr/local/nginx/logs/waf/
3.可查看WAF记录的日志信息
[root@localhost waf]# cat localhost_2018--05_sec.log
0x04 其他规则说明
过滤规则在wafconf下,可根据需求自行调整,每条规则需换行,或者用|分割
args里面的规则get参数进行过滤的
url是只在get请求url过滤的规则
post是只在post请求过滤的规则
whitelist是白名单,里面的url匹配到不做过滤
user-agent是对user-agent的过滤规则
默认开启了get和post过滤,需要开启cookie过滤的,编辑waf.lua取消部分--注释即可日志文件名称格式如下:虚拟主机名_sec.log
0x05 总结
1.Nginx_lua_waf
总体来说功能强大,相比其他软件防火墙Modsecurity还稍微简单点。
2.Ngx_lua_waf
的bug主要就是防火墙策略写的不严谨导致的,会造成两种结果:一是部分***通过伪装绕过防火墙;二是防火墙策略配置不当会造成误杀。
3.
另外根据站点的类型需要配置不同的策略,默认配置后全局生效。比如论坛等比较特殊允许很多html插入,这样的策略需要更宽松。
4.
最后生成的hack记录日志可以通过ELK分析,ELK这边需要根据日志格式制作特殊模版,此模版能兼容大部分日志类型,还有少部分完全没有规律的日志分析不了。
5.
最后ELK能展示日志分析结果分类,但是还不能区分各种ruletag类型***属于哪一种直白的表示出来。
6.
最后建议ngx_lua_waf如果真的要用可以考虑在部分源站站点少量试用,前端站点不建议使用,等对该软件理解深入后才可线上使用。
7.
补充:目前对ngx_lua_waf拒绝特定的user agent、拒绝特定后缀文件访问、防止sql注入三大类比较熟悉。
计划大概实施步骤:
1.不要一次性部署上线,先部署后,只记录日志,然后观察和调整规则,保证正常的请求不会被误防。
2.使用SaltStack管理规则库的更新。
3.使用ELKStack进行日志收集和分析,非常方便的可以在Kibana上做出一个漂亮的统计的饼图。(目前也能实现)
开源nginx_lua_waf部署安装的更多相关文章
- jumpserver开源堡垒机部署安装
0x01.前言 Jumpserver 是全球首款完全开源的堡垒机,使用 GNU GPL v2.0 开源协议,是符合 4A 的专业运维审计系统. Jumpserver 使用 Python / Djang ...
- Ubuntu16.04 部署安装Docker容器 & 注意事项
一.部署安装Docker容器 1.1 Ubuntu下安装 crul sudo apt install curl curl是利用URL语法在命令行方式下工作的开源文件传输工具.它被广泛应用在Unix.多 ...
- Docker+Redis镜像的原理以及部署安装(超详解附截图)
文章来源:公众号-智能化IT系统. 一. DOCKER介绍 Docker简介 (1)Docker 是一个开源的应用容器引擎,基于 Go 语言,并遵从Apache2.0协议开源. (2)Docker 可 ...
- kettle开源项目部署文档
kettle开源项目部署文档 1.kettle简介 kettle是一款国外开源的ETL(Extract Transform Load)工具,纯java编写,可以在Windows.Linux.Unix上 ...
- 自动化运维之Cobbler自动化部署安装操作系统
Cobbler概述: Cobbler可以用来快速建立 Linux 网络安装环境,它已将 Linux 网络安装的技术门槛,从大专以上文化水平,成功降低到初中以下,连补鞋匠都能学会. 在生产环境中,经常批 ...
- TriAquae 是一款由国产的基于Python开发的开源批量部署管理工具
怀着鸡动的心情跟大家介绍一款国产开源运维软件TriAquae,轻松帮你搞定大部分运维工作!TriAquae 是一款由国产的基于Python开发的开源批量部署管理工具,可以允许用户通过一台控制端管理上千 ...
- Rancher的部署安装(编排选用K8S)
为什么要使用Rancher Rancher是一个开源的企业级容器管理平台.通过Rancher,企业再也不必自己使用一系列的开源软件去从头搭建容器服务平台.Rancher提供了在生产环境中使用的管理Do ...
- Docker学习笔记_04 Rancher的部署安装(编排选用K8S)
原文地址:http://dbase.cc/2018/01/12/docker/04_rancher的部署安装/ 为什么要使用Rancher Rancher是一个开源的企业级容器管理平台.通过Ranch ...
- Android 开发环境在 Windows7 下的部署安装
Android SDK Android SDK 为 Android 应用的开发.测试和调试提了必要的API库和开发工具. ADT Bundle 下载 如果你是一个android 开发新手,推荐你下载使 ...
随机推荐
- appium 元素定位方法汇总
以上图为例,要定位到右下角的 我的 ,并点击 # appium的webdriver提供了11种元素定位方法,在selenium的基础上扩展了三个,可以在pycharm里面输入driver.find_e ...
- Netty源码分析第4章(pipeline)---->第2节: handler的添加
Netty源码分析第四章: pipeline 第二节: Handler的添加 添加handler, 我们以用户代码为例进行剖析: .childHandler(new ChannelInitialize ...
- Discuz3.3精仿小米风格整站模板制作——1、新建模板方案
术语说明: 模板——模板是一堆按照规定命名方式的html文件,用于指定整个论坛不同页面的外观. 标签——标签和模板共同作用以实现论坛换肤功能,其中标签主要控制页面显示什么数据,显示多少条等. 风格—— ...
- XSS(Cross Site Script)
类型一:反射型XSS 简单地把用户输入的数据“反射”给浏览器.也就是说,黑客需要诱使用户“点击”一个恶意链接,才能攻击成功. 类型二:存储型XSS 把用户输入的数据“存储”在服务器端.这种XSS具有很 ...
- oracle数据update后怎么恢复到以前的数据
http://blog.csdn.net/itdada/article/details/52746392
- vue-router组件状态刷新消失的问题
场景:vue-router实现的单页应用,登录页调用登录接口后,服务器返回用户信息,然后通过router.push({name: 'index', params: res.data})跳转到主页,并在 ...
- Daily Scrum9 11.13
昨天的任务已完成. 今日任务: 姓名 今日任务 时长 徐钧鸿 测试SQL包里的代码 2h 张艺 继续搭建还没搭建完的框架 修复bug 2h 黄可嵩 继续进行搜索响应编写 2h 徐方宇 搭建框架 修改b ...
- 20172319 实验二《Java面向对象程序设计》实验报告
20172319 2018.04.17-30 实验二<Java面向对象程序设计>实验报告 课程名称:<程序设计与数据结构> 学生班级:1723班 学生姓名:唐才铭 学生学号:2 ...
- 使用sqlyog创建数据库的错误
1.错误代码: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL s ...
- 冲刺One之站立会议6 /2015-5-19
2015-5-19 今天把服务器端的界面完善了一下,然后大家查了好多资料,实现了登陆界面实际连接的功能,开始加了一个它和服务器的的跳转,但是分析过后发现这是个没有必要的跳转.登录应该直接转到聊天室的主 ...