朋友的一個(gè) wordPress/ target=_blank class=infotextkey>WordPress 站經(jīng)常訪問慢??戳艘幌氯罩荆l(fā)現(xiàn)整天被掃描網(wǎng)站目錄,如phpmyadmin 或者 SQL 文件,和被 CC攻擊。
找了一下,發(fā)現(xiàn) ngx_lua_waf 是個(gè)不錯(cuò)的方案,但是太久不更新了,而且代碼我看不懂,猝
最后找到 oneinstack 一鍵包內(nèi)置的 ngx_lua_waf,基于之前的代碼,不過重構(gòu) 了,這下我能看懂了,以后要修改也能簡單一些
介紹
ngx_lua_waf 是一個(gè)高性能的輕量級 web 應(yīng)用防火墻,基于 lua-Nginx-module。
它具有以下功能:
防止sql注入,本地包含,部分溢出,fuzzing測試,xss,SSRF等web攻擊
防止svn/備份之類文件泄漏
防止ApacheBench之類壓力測試工具的攻擊
屏蔽常見的掃描黑客工具,掃描器
屏蔽異常的網(wǎng)絡(luò)請求
屏蔽圖片附件類目錄php執(zhí)行權(quán)限
防止webshell上傳
經(jīng)過 unixhot 的修改和重構(gòu),擁有了以下功能:
支持IP白名單和黑名單功能,直接將黑名單的IP訪問拒絕
支持URL白名單,將不需要過濾的URL進(jìn)行定義
支持User-Agent的過濾,匹配自定義規(guī)則中的條目,然后進(jìn)行處理(返回403)
支持CC攻擊防護(hù),單個(gè)URL指定時(shí)間的訪問次數(shù),超過設(shè)定值,直接返回403
支持Cookie過濾,匹配自定義規(guī)則中的條目,然后進(jìn)行處理(返回403)
支持URL過濾,匹配自定義規(guī)則中的條目,如果用戶請求的URL包含這些,返回403
支持URL參數(shù)過濾,原理同上
支持日志記錄,將所有拒絕的操作,記錄到日志中去
日志記錄為JSON格式,便于日志分析,例如使用ELKStack進(jìn)行攻擊日志收集、存儲、搜索和展示
這些功能剛好能滿足我朋友的需求
安裝
安裝起來也是相當(dāng)容易,說白了就是給 nginx 增加 ngx_devel_kit、lua-nginx-module 這兩個(gè)模塊,然后再修改 nginx 配置來運(yùn)行 ngx_lua_waf。
一鍵安裝
一鍵命令我已經(jīng)給你們準(zhǔn)備好了,一鍵命令會編譯 nginx-1.15.6,編譯的詳細(xì)模塊可以看我的這篇帖子 https://zhih.me/make-your-website-support-tls1-3 ,當(dāng)然你也可以直接看腳本的代碼
sh -c "$(curl -kfsSl https://raw.githubusercontent.com/xzhih/nginx-compile/master/install.sh)"
手動安裝
下載 ngx_lua_waf 防火墻的各種依賴及模塊
cd /usr/src/
wget https://github.com/openresty/luajit2/archive/v2.1-20181029.tar.gz
tar xzvf v2.1-20181029.tar.gz
mv luajit2-2.1-20181029 luajit-2.1
wget https://github.com/openresty/lua-cjson/archive/2.1.0.6.tar.gz
tar xzvf 2.1.0.6.tar.gz
mv lua-cjson-2.1.0.6 lua-cjson
wget https://github.com/simplresty/ngx_devel_kit/archive/v0.3.1rc1.tar.gz
tar xzvf v0.3.1rc1.tar.gz
mv ngx_devel_kit-0.3.1rc1 ngx_devel_kit
wget https://github.com/openresty/lua-nginx-module/archive/v0.10.13.tar.gz
tar xzvf v0.10.13.tar.gz
mv lua-nginx-module-0.10.13 lua-nginx-module
編譯安裝 luajit
cd luajit-2.1
make -j2 && make install
echo '/usr/local/lib' >> /etc/ld.so.conf.d/local.conf
ldconfig
編譯安裝 lua-cjson
cd /usr/src/lua-cjson
export LUA_INCLUDE_DIR=/usr/local/include/luajit-2.1
make -j2 && make install
設(shè)置 LUAJIT 環(huán)境變量
export LUAJIT_LIB=/usr/local/lib
export LUAJIT_INC=/usr/local/include/luajit-2.1
編譯 nginx 的時(shí)候加上以下兩個(gè)模塊
--add-module=../lua-nginx-module
--add-module=../ngx_devel_kit
下載配置 ngx_lua_waf
cd /usr/local/nginx/conf/
git clone https://github.com/xzhih/ngx_lua_waf.git waf
cat > /usr/local/nginx/conf/waf.conf << EOF
lua_shared_dict limit 20m;
lua_package_path "/usr/local/nginx/conf/waf/?.lua";
init_by_lua_file "/usr/local/nginx/conf/waf/init.lua";
access_by_lua_file "/usr/local/nginx/conf/waf/access.lua";
EOF
mkdir -p /usr/local/nginx/logs/waf
chown www-data:www-data /usr/local/nginx/logs/waf
你可以在 /usr/local/nginx/logs/waf 找到防火墻日志
在 nginx.conf 里 include waf.conf
include waf.conf;
啟動 nginx 并訪問 http://你的IP/?a=a.sql
就可以看到防火墻提示了
Copyright
https://github.com/lj2007331/ngx_lua_waf
https://github.com/loveshell/ngx_lua_waf
https://github.com/unixhot/waf