一個基于 lua-nginx-module 的 Web 應用防火墻:ngx_lua_waf

jopen 9年前發布 | 91K 次閱讀 路由器/防火墻 ngx_lua_waf

ngx_lua_waf是我剛入職趣游時候開發的一個基于ngx_lua的web應用防火墻。

代碼很簡單,開發初衷主要是使用簡單,高性能和輕量級。

現在開源出來,遵從MIT許可協議。其中包含我們的過濾規則。如果大家有什么建議和想fa,歡迎和我一起完善。

防止sql注入,本地包含,部分溢出,fuzzing測試,xss,SSRF等web攻擊
防止svn/備份之類文件泄漏
防止ApacheBench之類壓力測試工具的攻擊
屏蔽常見的掃描黑客工具,掃描器
屏蔽異常的網絡請求
屏蔽圖片附件類目錄php執行權限
防止webshell上傳

推薦安裝:

推薦使用lujit2.1做lua支持

ngx_lua如果是0.9.2以上版本,建議正則過濾函數改為ngx.re.find,匹配效率會提高三倍左右。

使用說明:

nginx安裝路徑假設為:/usr/local/nginx/conf/

把ngx_lua_waf下載到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白名單
    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~~]]
    --警告內容,可在中括號內自定義
    備注:不要亂動雙引號,區分大小寫

檢查規則是否生效

部署完畢可以嘗試如下命令:

curl http://xxxx/test.php?id=../etc/passwd 返回"Please go away~~"字樣,說明規則生效。

注意:默認,本機在白名單不過濾,可自行調整config.lua配置

效果圖如下:

一個基于 lua-nginx-module 的 Web 應用防火墻:ngx_lua_waf

一個基于 lua-nginx-module 的 Web 應用防火墻:ngx_lua_waf

規則更新:

考慮到正則的緩存問題,動態規則會影響性能,所以暫沒用共享內存字典和redis之類東西做動態管理。

規則更新可以把規則文件放置到其他服務器,通過crontab任務定時下載來更新規則,nginx reload即可生效。以保障ngx lua waf的高性能。

只記錄過濾日志,不開啟過濾,在代碼里在check前面加上--注釋即可,如果需要過濾,反之

一些說明:

過濾規則在wafconf下,可根據需求自行調整,每條規則需換行,或者用|分割

    global是全局過濾文件,里面的規則對post和get都過濾     
    get是只在get請求過濾的規則        
    post是只在post請求過濾的規則      
    whitelist是白名單,里面的url匹配到不做過濾       
    user-agent是對user-agent的過濾規則


默認開啟了get和post過濾,需要開啟cookie過濾的,編輯waf.lua取消部分--注釋即可

日志文件名稱格式如下:虛擬主機名_sec.log

項目主頁:http://www.baiduhome.net/lib/view/home/1423472640076

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!