WAF(Web Application Firewall),中文名叫做“Web應用防火牆”
WAF的定義是這樣的:Web應用防火牆是通過執行一系列針對HTTP/HTTPS的安全策略來專門為Web應用提供保護的一款產品,通過從上面對WAF的定義中,
我們可以很清晰地了解到:WAF是一種工作在應用層的、通過特定的安全策略來專門為Web應用提供安全防護的產品。
ngx_lua_waf是一個基於ngx_lua的web應用防火牆。
# ngx_lua_waf用途:
防止sql注入,本地包含,部分溢出,fuzzing測試,xss,SSRF等web攻擊
防止svn/備份之類文件泄露
防止ApacheBench之類的壓力測試工具的攻擊
屏蔽常見的黑客掃描工具,掃描器
屏蔽異常的網絡請求
屏蔽圖片附件類目錄PHP執行權限
防止webshell上傳
# 安裝
1、部署環境說明:
[root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core)
[root@localhost ~]# uname -r
3.10.0-862.el7.x86_64
2、安裝依賴包:
yum -y install gcc gcc-c++ autoconf automake make unzip yum -y install zlib zlib-devel openssl openssl-devel pcre pcre-devel
3、安裝LuaJIT2.0(LuaJIT是采用C語言寫的Lua代碼的解釋器 這里推薦使用lujit2.1做lua支持)
下載luajit 2.0並安裝 [root@localhost ~]# cd /usr/local/src/ [root@localhost src]# wget http://luajit.org/download/LuaJIT-2.0.5.tar.gz [root@localhost src]# tar xf LuaJIT-2.0.5.tar.gz [root@localhost src]# cd LuaJIT-2.0.5 [root@localhost LuaJIT-2.0.5]# make && make install
4、安裝ngx_devel_kit(NDK(nginx development kit)模塊是一個拓展nginx服務器核心功能的模塊,第三方模塊開發可以基於它來快速實現。)
[root@localhost src]# wget https://github.com/simplresty/ngx_devel_kit/archive/v0.3.0.tar.gz [root@localhost src]# tar xf v0.3.0.tar.gz
5、安裝nginx_lua_module
[root@localhost src]# wget https://github.com/openresty/lua-nginx-module/archive/v0.10.13.tar.gz [root@localhost src]# tar xf v0.10.13.tar.gz
6、導入環境變量:
echo "export LUAJIT_LIB=/usr/local/lib" >> /etc/profile echo "export LUAJIT_INC=/usr/local/include/luajit-2.0" >> /etc/profile
source /etc/profile
7、編譯安裝Nginx
[root@localhost ~]# cd /usr/local/src/ [root@localhost src]# wget http://nginx.org/download/nginx-1.14.0.tar.gz [root@localhost src]# tar xf nginx-1.14.0.tar.gz [root@localhost src]# cd nginx-1.14.0
[root@localhost src]# useradd -s /sbin/nologin -M www
[root@localhost nginx-1.14.0]# ./configure --user=www --group=www \
--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"
[root@localhost nginx-1.14.0]#make -j2
[root@localhost nginx-1.14.0]# make install
[root@localhost nginx-1.14.0]#ln -s /usr/local/nginx-1.14.0 /usr/local/nginx
8、新建/usr/local/nginx/logs/hack/攻擊日志目錄,並賦予nginx用戶對該目錄的寫入權限。
mkdir -p /usr/local/nginx/logs/hack/chown -R www.www /usr/local/nginx/logs/hack/
chmod -R 755 /usr/local/nginx/logs/hack/
至此nginx支持WAF防護功能已經搭建完成!
#使用說明:
nginx配置文件路徑為:/usr/local/nginx/conf/
把ngx_lua_waf下載到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
在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;
配置config.lua里的waf規則目錄(一般在waf/conf/目錄下):
RulePath = "/usr/local/nginx/conf/waf/wafconf/" #絕對路徑如有變動,需對應修改
然后重啟nginx即可
###配置文件詳細說明:
RulePath = "/usr/local/nginx/conf/waf/wafconf/" --規則存放目錄 attacklog = "off" --是否開啟攻擊信息記錄,需要配置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=[[Please go away~~]] --警告內容,可在中括號內自定義 備注:不要亂動雙引號,區分大小寫
啟動nginx:
/usr/local/nginx/sbin/nginx
###檢查規則是否生效:
部署完畢可以嘗試如下命令:
curl http://your_ip/test.php?id=../etc/passwd
結果如下則說明規則生效(頁面修改地址:/usr/local/nginx/conf/waf/config.lua):
注意:默認,本機在白名單不過濾,可自行調整config.lua配置
###一些說明:
過濾規則在wafconf下,可根據需求自行調整,每條規則需換行,或者用|分割 args里面的規則get參數進行過濾的 url是只在get請求url過濾的規則 post是只在post請求過濾的規則 whitelist是白名單,里面的url匹配到不做過濾 user-agent是對user-agent的過濾規則 默認開啟了get和post過濾,需要開啟cookie過濾的,編輯waf.lua取消部分--注釋即可 日志文件名稱格式如下:虛擬主機名_sec.log
一鍵腳本:
#!/bin/bash #Author: Template yum -y install gcc gcc-c++ autoconf automake make unzip wget yum -y install zlib zlib-devel openssl openssl-devel pcre pcre-devel cd /usr/local/src/ [ ! -f "LuaJIT-2.0.5.tar.gz" ] && wget http://luajit.org/download/LuaJIT-2.0.5.tar.gz [ ! -f "nginx-1.14.0.tar.gz" ] && wget http://nginx.org/download/nginx-1.14.0.tar.gz && [ ! -f "v0.3.0.tar.gz" ] && wget https://github.com/simplresty/ngx_devel_kit/archive/v0.3.0.tar.gz [ ! -f "v0.10.13.tar.gz" ] && wget https://github.com/openresty/lua-nginx-module/archive/v0.10.13.tar.gz [ ! -f "master.zip" ] && wget https://github.com/loveshell/ngx_lua_waf/archive/master.zip --no-check-certificate ls *.tar.gz | xargs -n 1 tar xf cd LuaJIT-2.0.5 && make && make install && cd .. echo "export LUAJIT_LIB=/usr/local/lib" >> /etc/profile && \ echo "export LUAJIT_INC=/usr/local/include/luajit-2.0" >> /etc/profile source /etc/profile cd nginx-1.14.0 && useradd -s /sbin/nologin -M www ./configure --user=www --group=www \ --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 -j8 && make install && ln -s /usr/local/nginx-1.14.0 /usr/local/nginx mkdir -p /usr/local/nginx/logs/hack/ && chown -R www.www /usr/local/nginx/logs/hack/ && chmod -R 755 /usr/local/nginx/logs/hack/ sed -i '25 a lua_package_path \"/usr/local/nginx/conf/waf/?.lua\";\nlua_shared_dict limit 10m;\ninit_by_lua_file /usr/local/nginx/conf/waf/init.lua;\naccess_by_lua_file /usr/local/nginx/conf/waf/waf.lua;' /usr/local/nginx/conf/nginx.conf cd /usr/local/src/ && unzip master.zip -d /usr/local/nginx/conf/ && mv /usr/local/nginx/conf/ngx_lua_waf-master /usr/local/nginx/conf/waf /usr/local/nginx/sbin/nginx
參考地址:https://github.com/loveshell/ngx_lua_waf