ngx_lua_waf是一個基于lua-nginx-module(openresty)的web應(yīng)用防火墻,主要用途是:
防止sql注入憎兽,本地包含冷离,部分溢出,fuzzing測試纯命,xss,SSRF等web攻擊
防止svn/備份之類文件泄漏
防止ApacheBench之類壓力測試工具的攻擊
屏蔽常見的掃描黑客工具西剥,掃描器
屏蔽異常的網(wǎng)絡(luò)請求
屏蔽圖片附件類目錄php執(zhí)行權(quán)限
防止webshell上傳
具體情況可訪問作者的github了解,這里不多說亿汞,本文主要記錄部署實施的操作步驟:
- yum安裝git瞭空、gcc等編譯環(huán)境
# yum -y install git
# yum -y install gcc gcc-c++
- 下載軟件包
# cd /home/soft
# git clone https://github.com/simpl/ngx_devel_kit.git
# git clone https://github.com/openresty/lua-nginx-module.git
# wget -c http://luajit.org/download/LuaJIT-2.0.5.tar.gz
有的地方訪問git被墻,我這里下載好的介質(zhì)用也行:
鏈接:https://pan.baidu.com/s/1XlRaFV1Mlu-0ysrbK5uQGQ 密碼:idsv
- 安裝Luajit
# tar -xzf LuaJIT-2.0.5.tar.gz
# cd LuaJIT-2.0.5
# make && make install
驗證安裝成功:
# luajit -v
驗證luajit安裝
- 導(dǎo)入環(huán)境變量
# vim /etc/profile
#如果按照上面操作留夜,則路徑如下匙铡,如果不是,則可能不一樣
export LUAJIT_LIB=/usr/local/lib
export LUAJIT_INC=/usr/local/include/luajit-2.0
# source /etc/profile
# echo "/usr/local/lib" >> /etc/ld.so.conf
# ldconfig
- 編譯安裝nginx
5.1 查看當(dāng)前nginx版本和編譯參數(shù)
# nginx -V
5.2 編譯安裝lua-nginx-module和ngx_dev_kit模塊
# cd /home/soft/nginx-1.11.3
# ./configuer --with-pcre=../pcre-8.35 --with-zlib=../zlib-1.2.8 --with-openssl=../openssl-fips-2.0.13 --add-module=/home/soft/lua-nginx-module --add-module=/home/soft/ngx_devel_kit
即在原有模塊參數(shù)后增加 lua-nginx-module 和 ngx_devel_kit 模塊
# make
# mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
# cp objs/nginx /usr/local/nginx/sbin/
# nginx -s reload
注意碍粥,生產(chǎn)環(huán)境做任何操作都應(yīng)備份為先鳖眼,因此重新編譯nginx時應(yīng)先對舊的nginx可執(zhí)行文件進(jìn)行備份,以便于如果出問題后進(jìn)行回滾操作嚼摩,基于這個理由钦讳,增加模塊的時候不要直接使用make install矿瘦,而是手動cp過去
5.3 lua-nginx-module模塊的檢驗
在/usr/local/nginx/conf/nginx.conf中加入以下內(nèi)容并保存:
server{
......
location /hello {
default_type 'text/plain';
content_by_lua 'ngx.say("hello, lua")';
}
}
# /usr/local/nginx/sbin/nginx -s reload
訪問 ip/hello,出現(xiàn)如下結(jié)果愿卒,說明安裝成功:
- 安裝并配置ngx_lua_waf
# cd /usr/local/nginx/conf/
# git clone https://github.com/loveshell/ngx_lua_waf.git
# mv ngx_lua_waf/ waf
# mkdir ../logs/hack
# chmod -R 755 ../logs/hack/
修改config.lua的文件路徑
vim waf/config.lua
#config.lua在/usr/local/nginx/conf/waf內(nèi)
#RulePath是存放規(guī)則文件的路徑
RulePath = "/usr/local/nginx/conf/waf/wafconf/"
attacklog = "on"
#日志存放路徑
logdir = "/usr/local/nginx/logs/hack/"
UrlDeny="on"
Redirect="on"
CookieMatch="on"
postMatch="on"
whiteModule="on"
black_fileExt={"php","jsp"}
ipWhitelist={"127.0.0.1"}
ipBlocklist={"1.0.0.1"}
CCDeny="off"
CCrate="100/60"
html=[[
<html xmlns="http://www.w3.org/1999/xhtml"><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>網(wǎng)站防火墻</title>
<style>
p {
line-height:20px;
}
ul{ list-style-type:none;}
li{ list-style-type:none;}
</style>
在nginx.conf的http段中添加配置
# vim nginx.conf
lua_need_request_body on;
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;
重新加載nginx缚去,ok
# nginx -t
# nginx -s reload
嘗試訪問ip/.svn,得到如下結(jié)果即可認(rèn)為配置成功:
- 日志的定時刪除
由于日志是每天都在按照日期增加的琼开,所以為了便于管理易结,這里增加了防護(hù)日志的清理功能:
# vim /home/trs/clean_ngx_waf_lua.sh
#!/bin/bash
#LOGS_PATH 是ngx_lua_waf的日志存放目錄
#這里只保留最近3天的日志
LOGS_PATH=/usr/local/nginx/logs/hack/
cd ${LOGS_PATH}
find . -mtime +3 -name "*sec.log" | xargs rm -f
exit 0
# chmod +x clean_ngx_waf_lua.sh
將以上的日志做一個定時執(zhí)行:
#crontab -e
### clean ngx_waf_lua logs
1 0 * * * /home/trs/clean_ngx_waf_lua.sh
- 關(guān)于config.lua的配置說明
#規(guī)則存放目錄
RulePath = "/usr/local/nginx/conf/waf/wafconf/"
#是否開啟攻擊信息記錄,需要配置logdir
attacklog = "off"
#log存儲目錄柜候,該目錄需要用戶自己新建搞动,切需要nginx用戶的可寫權(quán)限
logdir = "/usr/local/nginx/logs/hack/"
#是否攔截url訪問
UrlDeny="on"
#是否攔截后重定向
Redirect="on"
#是否攔截cookie攻擊
CookieMatch = "on"
#是否攔截post攻擊
postMatch = "on"
#是否開啟URL白名單
whiteModule = "on"
#填寫不允許上傳文件后綴類型
black_fileExt={"php","jsp"}
#ip白名單,多個ip用逗號分隔
ipWhitelist={"127.0.0.1"}
#ip黑名單渣刷,多個ip用逗號分隔
ipBlocklist={"1.0.0.1"}
#是否開啟攔截cc攻擊(需要nginx.conf的http段增加lua_shared_dict limit 10m;)
CCDeny="on"
#設(shè)置cc攻擊頻率鹦肿,單位為秒.
#默認(rèn)1分鐘(60秒)同一個IP只能請求同一個地址100次
CCrate = "100/60"
#警告內(nèi)容,可在中括號內(nèi)自定義
html=[[Please go away~~]]
# 備注:不要亂動雙引號,區(qū)分大小寫