讓 Nginx 支持 WAF 防護功能實戰


ngx_lua_waf 安裝說明文檔

作者github地址:

https://github.com/loveshell/ngx_lua_waf

———————————————————————————————————————————————————-
轉自作者說明文檔:

ngx_lua_waf是我一個基於ngx_lua的web應用防火牆。
代碼很簡單,開發初衷主要是使用簡單,高性能和輕量級。
現在開源出來.其中包含我們的過濾規則。如果大家有什么建議和想fa,歡迎和我一起完善。

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

推薦安裝:
請自行給nginx安裝ngx_lua模塊,推薦lujit2.0做lua支持
請提前新建/data/logs/hack/目錄攻擊日志,並賦予nginx用戶對該目錄的寫入權限。

配置文件添加:
在http段添加
lua_need_request_body on;(開啟post請求)
access_by_lua_file /usr/local/nginx/conf/waf.lua;

規則更新:
考慮到正則的緩存問題,動態規則會影響性能,所以暫沒用共享內存字典和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://bbs.linuxtone.org多多交流
weibo: [@ppla](http://weibo.com/opscode)
感謝ngx_lua模塊的開發者[@agentzh](https://github.com/agentzh/),春哥是我見過開源精神最好的人之一

本文記錄如何安裝ngx_lua模塊
nginx_lua_module是由淘寶的工程師清無(王曉哲)和春來(章亦春)所開發的nginx第三方模塊,它能將lua語言嵌入到nginx配置中,從而使用lua就極大增強了nginx的能力

http://wiki.nginx.org/HttpLuaModule

———————————————————————————————————————————————————-

正文:
1 下載luajit 2.0並安裝

http://luajit.org/download.html

直接使用源碼make && make install
所以lib和include是直接放在/usr/local/lib和usr/local/include

2 下載nginx源碼解壓
wget  http://nginx.org/download/nginx-1.2.7.tar.gz
注意版本號,如果機子上已經裝了nginx,不想升級的話,請使用/to/nginx/sbin/nginx -v 來查看版本號
tar -zxvf  nginx-1.2.7.tar.gz

3  下載ngx_devel_kit解壓

https://github.com/simpl/ngx_devel_kit/tags

wget https://github.com/simpl/ngx_devel_kit/archive/v0.2.18.tar.gz –no-check-certificate
tar -zxvf  v0.2.18

4  下載nginx_lua_module解壓

https://github.com/chaoslawful/lua-nginx-module/tags

wget https://github.com/chaoslawful/lua-nginx-module/archive/v0.7.18rc2.tar.gz –no-check-certificate
tar -zxvf v0.7.18rc2

5 進入nginx源碼文件夾
cd nginx-1.2.7/

6 導入環境變量,編譯
export LUAJIT_LIB=/usr/local/lib    #這個很有可能不一樣
export LUAJIT_INC=/usr/local/include/luajit-2.0  #這個很有可能不一樣
./configure –prefix=/opt/nginx \    #nginx的安裝路徑
–add-module=/path/to/ngx_devel_kit \   #ngx_devel_kit 的源碼路徑
–add-module=/path/to/lua-nginx-module  #nginx_lua_module 的源碼路徑

例子:
./configure –prefix=/usr/local/nginx-help –add-module=/root/jiangbin/ngx_devel_kit-0.2.18 –add-module=/root/jiangbin/lua-nginx-module-0.7.18rc2 –with-ld-opt=”-Wl,-rpath,$LUAJIT_LIB”
make -j2
make install

安裝lua模塊發現的問題:
我在編譯安裝 Nginx 的第三方模塊時,碰到一個錯誤:
view plaincopyprint?
/usr/local/nginx/sbin/ngxin -s reload
/usr/local/nginx/sbin/nginx: error while loading shared libraries: libluajit-5.1.so.2: cannot open shared object file: No such file or directory
百事不得其解,后來Google之,發現了解決辦法。
在 Nginx 編譯時,需要指定 RPATH,加入下面選項即可:
view plaincopyprint?
./configure –with-ld-opt=”-Wl,-rpath,$LUAJIT_LIB”
或者
export LD_LIBRARY_PATH=/usr/local/lib/:$LD_LIBRARY_PATH

7 請提前新建/data/logs/hack/目錄攻擊日志,並賦予nginx用戶對該目錄的寫入權限。
mkdir -p /data/logs/hack/
www賬戶是跑nginx和php-fpm
chown -R www:www /data/logs/hack/
chmod -R 755 /data/logs/hack/

8 安裝ngx_lua_waf模塊
wget https://github.com/loveshell/ngx_lua_waf/archive/master.zip –no-check-certificate
把這個文件解壓到
nginx的conf目錄下.
然后在nginx.conf里的http配置里添加
http {
lua_need_request_body on;
access_by_lua_file /usr/local/nginx-help/conf/waf.lua;
注意:waf.lua一定要放在/usr/local/nginx-help/conf/waf.lua 已經他的子目錄.否則會報500錯誤.

最后用/usr/local/nginx-help/sbin/nginx -V和/usr/local/nginx-help/sbin/nginx -t 驗證一下
[root@platinum conf]# /usr/local/nginx-help/sbin/nginx -V
nginx version: nginx/1.2.7
built by gcc 4.1.2 20080704 (Red Hat 4.1.2-48)
configure arguments: –prefix=/usr/local/nginx-help –add-module=/root/jiangbin/ngx_devel_kit-0.2.18 –add-module=/root/jiangbin/lua-nginx-module-0.7.18rc2 –with-ld-opt=-Wl,-rpath,/usr/local/lib

[root@platinum conf]# /usr/local/nginx-help/sbin/nginx -t
nginx: the configuration file /usr/local/nginx-help/conf/nginx.conf syntax is ok


nginx: configuration file /usr/local/nginx-help/conf/nginx.conf test is successful

9 過濾配置說明:
過濾規則在wafconf下,可根據需求自行調整,每條規則需換行,或者用|分割
global是全局過濾文件,里面的規則對post和get都過濾
get是只在get請求過濾的規則
post是只在post請求過濾的規則
whitelist是白名單,里面的url匹配到不做過濾
user-agent是對user-agent的過濾規則

為了不返回一些無用給用戶直接把注入測試防護返回信息改為http 403狀態,修改/usr/local/nginx-help/conf/waf.lua
71 function check()
72     ngx.header.content_type = “text/html”
73     –ngx.print(“403″)
74     ngx.exit(403)
75 end

注意:每次更改waf.lua代碼需要把nginx reload一下!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM