40、Nginx 配置支持 WAF
40.1 waf说明
1 WAF(Web Application Firewall),中文名叫做“Web应用防火墙”。
2 WAF的定义是这样的:Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品。
3 通过从上面对WAF的定义中,我们可以很清晰地了解到:WAF是一种工作在应用层的、通过特定的安全策略来专门为Web应用
提供安全防护的产品。
4 ngx_lua_waf 是一个基于ngx_lua的web应用防火墙。
5 ngx_lua_waf用途:
(1) 防止sql注入,本地包含,部分溢出,fuzzing测试,xss,SSRF等web攻击
(2) 防止svn/备份之类文件泄露
(3) 防止ApacheBench之类的压力测试工具的攻击
(4) 屏蔽常见的黑客扫描工具,扫描器
(5) 屏蔽异常的网络请求
(6) 屏蔽图片附件类目录PHP执行权限
(7) 防止webshell上传
6 什么是lua
Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序
提供灵活的扩展和定制功能。
7 部署环境
# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
# uname -r
3.10.0-862.el7.x86_64
40.2 安装waf
1 安装依赖包
# yum -y install gcc gcc-c++ autoconf automake make unzip
# yum -y install zlib zlib-devel openssl openssl-devel pcre pcre-devel
2 安装LuaJIT2.0
LuaJIT是采用C语言写的Lua代码的解释器 这里推荐使用lujit2.1做lua支持。
# wget http://luajit.org/download/LuaJIT-2.0.5.tar.gz
# tar -xzf LuaJIT-2.0.5.tar.gz
# cd LuaJIT-2.0.5/
# make && make install
3 安装ngx_devel_kit
NDK(nginx development kit)模块是一个拓展nginx服务器核心功能的模块,第三方模块开发可以基于它来快速实现。
# wget https://github.com/simplresty/ngx_devel_kit/archive/v0.3.0.tar.gz
# tar -xzf v0.3.0.tar.gz
# mv ngx_devel_kit-0.3.0/ /usr/local/src/
4 安装nginx_lua_module
# wget https://github.com/openresty/lua-nginx-module/archive/v0.10.13.tar.gz
# tar -xzf v0.10.13.tar.gz
# mv lua-nginx-module-0.10.13/ /usr/local/src/
5 导入环境变量
# echo "export LUAJIT_LIB=/usr/local/lib" >> /etc/profile
# echo "export LUAJIT_INC=/usr/local/include/luajit-2.0" >> /etc/profile
# source /etc/profile
6 编译安装nginx
# wget http://nginx.org/download/nginx-1.14.0.tar.gz
# tar -xzf nginx-1.14.0.tar.gz
# cd nginx-1.14.0/
# useradd -s /sbin/nologin -M nginx
# ./configure --user=nginx --group=nginx \
--prefix=/usr/local/nginx-1.14.0 \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-http_gzip_static_module \
--pid-path=/usr/local/nginx-1.14.0/nginx.pid \
--with-http_realip_module \
--add-module=/usr/local/src/ngx_devel_kit-0.3.0 \
--add-module=/usr/local/src/lua-nginx-module-0.10.13 \
--with-ld-opt="-Wl,-rpath,$LUAJIT_LIB"
# make -j2 && make install
# ln -s /usr/local/nginx-1.14.0 /usr/local/nginx
# ln -s /usr/local/lib/libluajit-5.1.so.2 /lib64/libluajit-5.1.so.2
7 新建/usr/local/nginx/logs/hack/攻击日志目录,并赋予nginx用户对该目录的写入权限
# mkdir -p /usr/local/nginx/logs/hack/
# chown -R nginx.nginx /usr/local/nginx/logs/hack/
8 配置ngx_lun_waf
把ngx_lua_waf下载到nginx的conf目录下,解压命名为waf
# wget https://github.com/loveshell/ngx_lua_waf/archive/master.zip
# unzip master.zip -d /usr/local/nginx/conf/
# mv /usr/local/nginx/conf/ngx_lua_waf-master /usr/local/nginx/conf/waf
9 在nginx.conf的http段添加如下内容
# vim /usr/local/nginx/conf/nginx.conf
http {
......
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;
......
}
# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx-1.14.0/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx-1.14.0/conf/nginx.conf test is successful
40.3 测试
1 启动nginx
# /usr/local/nginx/sbin/nginx
2 访问url地址出现如下结果则说明规则生效
http://172.16.1.122/test.tex?id=../etc/passwd
40.4 waf配置文件说明
# cat /usr/local/nginx/conf/waf/config.lua
RulePath = "/usr/local/nginx/conf/waf/wafconf/"
--规则存放目录,绝对路径如有变动,需对应修改
attacklog = "on"
--是否开启攻击信息记录,需要配置logdir
logdir = "/usr/local/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=[[
<html xmlns="http://www.w3.org/1999/xhtml"><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>网站防火墙</title>
......
]]
--警告内容,可在中括号内自定义
备注:
(1) 不要乱动双引号,配置文件区分大小写。
(2) 默认开启了get、post、cookie过滤。
(3) 日志文件名称格式为"虚拟主机名_日期_sec.log"。
(4) 默认,黑白名单不过滤,可自行调整config.lun配置,使用"--"注释其中一个,另一个
起作用。
40.5 过滤规则
# ls /usr/local/nginx/conf/waf/
config.lua init.lua install.sh README.md wafconf waf.lua
(1) config.lua # 配置文件
(2) init.lua # 规则函数
(3) waf.lua # 逻辑关系
过滤规则在/usr/local/nginx/conf/waf/wafconf/下,可根据需求自行调整,每条规则需换行,或者用|分割
# ls /usr/local/nginx/conf/waf/wafconf/
args cookie post url user-agent whiteurl
(1) args # 里面的规则get参数进行过滤的
(2) url # 是只在get请求url过滤的规则
(3) post # 是只在post请求过滤的规则
(4) whiteurl # 是白名单,里面的url匹配到不做过滤
(5) user-agent # 是对user-agent的过滤规则
(6) cookie # cookie过滤
40、Nginx 配置支持 WAF的更多相关文章
- Nginx 配置支持 WAF
WAF(Web Application Firewall),中文名叫做“Web应用防火墙” WAF的定义是这样的:Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提 ...
- 安装nginx+ngx_lua支持WAF防护功能
安装nginx+ngx_lua支持WAF防护功能 nginx lua模块淘宝开发的nginx第三方模块,它能将lua语言嵌入到nginx配置中,从而使用lua就极大增强了nginx的能力.nginx以 ...
- nginx配置支持http2
1.简介 nginx 配置支持http2.目前大多数网站都是http1.1(如果你没有特别配置过的话) 一切都是为了访问更快. 2.如何查看自己网站的http版本 最简单的方法就F12啊,我这里是火狐 ...
- Nginx配置支持https协议-应用实践
Nginx配置支持https协议-应用实践 https简介 HTTPS 是运行在 TLS/SSL 之上的 HTTP,与普通的 HTTP 相比,在数据传输的安全性上有很大的提升. TLS是传输层安全协议 ...
- nginx 配置支持URL HTML5 History 模式 与 设置代理
拾人牙慧:https://segmentfault.com/q/1010000007140360 nginx 配置支持URL HTML5 History 模式 location / { try_fil ...
- Apache和Nginx配置支持苹果ATS方法
什么是ATS功能? ATS是iOS9和OS X El Capitan的一个新特性.开启该功能后,ATS对使用NSURLConnection, CFURL或NSURLSession 等APIs 进行的网 ...
- nginx配置:支持phpfastcgi,nginx和php-cgi通信,部分nginx常量解释
支持phpfastcgi的配置如下: server { listen 8000; server_name localhost; root F:/home/projects/test; i ...
- nginx配置:支持phpfastcgi,nginx和php-cgi通信,部分nginx常量解释
支持phpfastcgi的配置如下: server { listen 8000; server_name localhost; root F:/home/projects/test; index in ...
- Nginx 配置支持 WebSocket
找到nginx的配置文件:nginx.conf,增加以下三行配置. 示例: server { listen 80; server_name www.test.com; location / { pro ...
随机推荐
- golang:Channel协程间通信
channel是Go语言中的一个核心数据类型,channel是一个数据类型,主要用来解决协程的同步问题以及协程之间数据共享(数据传递)的问题.在并发核心单元通过它就可以发送或者接收数据进行通讯,这在一 ...
- Linux 系统运行着许多子系统和应用程序。您可以使用系统日志记录从启动时就收集有关运行中系统的数据。有时
概述 在本教程中,您将学习以下内容: 配置 syslog 守护程序 了解标准设施.优先级和操作 配置日志轮换 了解 rsyslog 和 syslog-ng 系统内部发生了什么 Linux 系统运行着许 ...
- Linux下获取当前的目录,需执行以下命令: $(cd `dirname $0`;pwd)
Linux下获取当前的目录,需执行以下命令: $(cd `dirname $0`;pwd) 其中, dirname $0,取得当前执行的脚本文件的父目录 cd `dirname $0` ...
- 分析Red Hat sosreport输出的方法
分析Red Hat sosreport输出的方法? Modified on: Fri, 31 May 2019 20:20:02 +0800 有一段时间(自EL 4.6以来),Red Hat嵌入了sy ...
- canal 环境搭建 canal 与kafka通信(三)
canal 占用了生产者 .net core端 使用消费者获取canal 消息 安装 Confluent.Kafka demo使用 1.3.0 public static void Consumer ...
- 《SystemVerilog验证-测试平台编写指南》学习 - 第1章 验证导论
<SystemVerilog验证-测试平台编写指南>学习 - 第1章 验证导论 测试平台(testbench)的功能 方法学基础 1. 受约束的随机激励 2. 功能覆盖率 3. 分层的测试 ...
- vue项目使用百度地图API获取经纬度
一.首先在百度api注册获得ak密钥 二.进行引入 (1).第一种方式: 直接在vue中index.html中用script标签引入. //你的ak密钥需要替换真实的你的ak码 <script ...
- 【玩转PDF】贼稳,产品要做一个三方合同签署,我方了!
一.前言 事情是这个样子的,小农的公司,之前有个功能需要签署来进行一系列的操作,于是我们引入了一个三方平台的签署--上上签,但是有一个比较尴尬的点就是,它不支持合同在浏览器上和附件一起预览的,我们想要 ...
- 聊聊 Spring 的 XML Schema 扩展机制的使用方式
前言 在当前Java生态,Spring算的上是最核心的框架,所有的开发组件想要得到大范围更便捷的使用,都要和Spring进行整合,比如我们熟知的Mybatis.Dubbo等,以及内部封装的各类组件包括 ...
- systemverilog数组类型