標題:開源nginx_lua_waf部署安裝

taibeihacker

Moderator

0x01 前言​

ngx_lua_waf實現WAF一句話描述,就是解析HTTP請求(協議解析模塊),規則檢測(規則模塊),做不同的防禦動作(動作模塊),並將防禦過程(日誌模塊)記錄下來。所以本文中的WAF的實現由五個模塊(配置模塊、協議解析模塊、規則模塊、動作模塊、錯誤處理模塊)組成。
原版本主要的功能如下:
1.防止sql注入,本地包含,部分溢出,fuzzing測試,xss,SSRF等web攻擊
2.防止svn/備份之類文件洩漏
3.防止ApacheBench之類壓力測試工具的攻擊
4.屏蔽常見的掃描黑客工具,掃描器
5.屏蔽異常的網絡請求
6.屏蔽圖片附件類目錄php執行權限
7.防止webshell上傳
二次改造後的規則攔截功能:
1.支持IP白名單和黑名單功能,直接將黑名單的IP訪問拒絕。
2.支持URL白名單,將不需要過濾的URL進行定義。
3.支持User-Agent的過濾,匹配自定義規則中的條目,然後進行處理(返回403)。
4.支持CC攻擊防護,單個URL指定時間的訪問次數,超過設定值,直接返回403。
5.支持Cookie過濾,匹配自定義規則中的條目,然後進行處理(返回403)。
6.支持URL過濾,匹配自定義規則中的條目,如果用戶請求的URL包含這些,返回403。
7.支持URL參數過濾,原理同上。
8.支持日誌記錄,將所有拒絕的操作,記錄到日誌中去。
9.日誌記錄為JSON格式,便於日誌分析,例如使用ELKStack進行攻擊日誌收集、存儲、搜索和展示

0x02 Nginx + Lua部署​

系統環境:centos7.0x64
1.進入到/usr/local/src目錄下
[root@localhost src]# cd /usr/local/src
2.分別下載Nginx安裝必備的Nginx和PCRE軟件包以及當前最新的luajit和ngx_devel_kit (NDK)軟件包和春哥編寫的lua-nginx-module。
[root@localhost src]# wget http://nginx.org/download/nginx-1.9.4.tar.gz
[root@localhost src]#wget https://ftp.pcre.org/pub/pcre/pcre-8.37.tar.gz --no-check-certificate
t4pwyvhkovg23637.jpg

bbkaopxie0q23639.jpg

[root@localhost src]#wget http://luajit.org/download/LuaJIT-2.0.4.tar.gz
[root@localhost src]#
wget https://github.com/openresty/lua-nginx-module/archive/v0.9.16.tar.gz --no-check-certificate
[root@localhost src]#
wget https://github.com/simpl/ngx_devel_kit/archive/v0.2.19.tar.gz --no-check-certificate
kjtw1sah2oz23640.jpg

kbnr1wecb2z23641.jpg

w5yrplnd33w23642.jpg

3. 創建Nginx運行的普通用戶
[root@nginx-lua src]# useradd -s /sbin/nologin -M www
4.分別在當前目錄下解壓已下載的軟件包
[root@localhost src]# tar zxvf v0.2.19.tar.gz
[root@localhost src]# tar zxvf v0.9.16.tar.gz
knumxer5smo23644.jpg

hiidq4stkei23645.jpg

[root@localhost src]# tar zxvf pcre-8.37.tar.gz
gdutgvfczof23646.jpg

[root@localhost src]# tar zxvf LuaJIT-2.0.4.tar.gz
5. 安裝Luajit以及需要編譯的gcc編譯環境。
[root@localhost src]# cd LuaJIT-2.0.3
[root@localhost src]#yum install gcc
[root@localhost src]# make make install
nachk212cmf23647.jpg

3ea4g24dwsc23648.jpg

mq0zq0p0fpw23650.jpg

6. 安裝Nginx並加載模塊以及需要編譯的openssl模塊和c++模塊。
[root@localhost LuaJIT-2.0.4]# cd .
[root@localhost src]# tar zxvfnginx-1.9.4.tar.gz
xuynljlf3rm23651.jpg

[root@localhost src]# export LUAJIT_LIB=/usr/local/lib
[root@localhost src]# export LUAJIT_INC=/usr/local/include/luajit-2.0
35x1tv3aogx23652.jpg

[root@localhost nginx-1.9.4]# yum -y install openssl openssl-devel
4zxu34gr3gs23653.jpg

[root@localhost nginx-1.9.4]# ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-http_stub_status_module --with-file-aio --with-http_dav_module --add-module=./ngx_devel_kit-0.2.19/--add-module=./lua-nginx-module-0.9.16/--with-pcre=/usr/local/src/pcre-8.37/
rlizjskrzjt23655.jpg

[root@localhost nginx-1.9.4]# yum -y install gcc-c++
aged5qsuhf323656.jpg

[root@localhost nginx-1.9.4]# make -j2 make install
bjduivp3rmc23657.jpg

7. 創建軟連接動態庫連接
[root@localhost nginx-1.9.4]# ln -s /usr/local/lib/libluajit-5.1.so.2 /lib64/libluajit-5.1.so.2
1loh2ocfaq223658.jpg

8.啟動nginx服務
root@localhost nginx-1.9.4]# /usr/local/nginx/sbin/nginx-t
[root@localhost nginx-1.9.4]# /usr/local/nginx/sbin/nginx
c5kqw3jm4jn23660.jpg

9關閉centos7自帶的防火牆
[root@localhost nginx-1.9.4]# sed -i 7s/enforcing/disabled//etc/selinux/config
[root@localhost nginx-1.9.4]# systemctl stop firewalld.service
kjy0ovz4y2m23661.jpg

10.遠程訪問http://172.16.89.145,顯示頁面如下,表示已成功安裝nginx
54sedzkojbz23662.jpg

11.安裝git服務
[root@localhost src]# yum install git
fvk2x5f2vw123663.jpg

nqsauzq34bg23665.jpg

12.克隆下載ngx_lua_waf, nginx安裝路徑假設為:/usr/local/nginx/conf/
把ngx_lua_waf下載到conf目錄下,解壓命名為waf
[root@localhost src]# git clone https://github.com/loveshell/ngx_lua_waf.git
[root@localhost ngx_lua_waf]# cd /usr/local/nginx/conf/
[root@localhost conf]# mkdir waf
ozw0g5qc4cu23666.jpg

[root@localhost ngx_lua_waf]#cp -R /usr/local/src/ngx_lua_waf/* /usr/local/nginx/conf/waf/
ouf1uve3pps23667.jpg

vxu0fbgg1fm23668.jpg

注意,其主要目錄信息如下:
├── config.lua #waf的配置文件
├── init.lua #讀取waf的規則文件
├── install.sh #waf安裝文件,需要做修改
├── README.md #說明文檔
├── wafconf #規則庫
│ ├── args #get請求的參數過濾規則
│ ├── cookie #cookie過濾規則
│ ├── post #post請求過濾規則
│ ├── url #get請求的URL過濾規則
│ ├── user-agent #user-agent過濾規則
│ └── whiteurl #白名單
└── waf.lua #waf規則執行文件
13.在nginx.conf中的http段進行配置
[root@localhost waf]# vi /usr/local/nginx/conf/nginx.conf
大概的配置信息如下,Nginx.conf:
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;
cmeliqo2r3y23669.jpg

14.修改ngx_lua_waf下的config.lua文件
root@localhost waf]# vi /usr/local/nginx/conf/waf/config.lua
[root@localhost logs]# mkdir waf
2ulh3pxnfmh23670.jpg

1ksy4t5ivdu23671.jpg

配置詳細信息如下,config.lua:
RulePath='/usr/local/nginx/conf/waf/wafconf/'
--規則存放目錄
attacklog='off'
--是否開啟攻擊信息記錄,需要配置logdir
logdir='/usr/local/nginx/logs/waf/'
--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~~]]
--警告內容,可在中括號內自定義
備註:不要亂動雙引號,區分大小寫
15.重啟nginx服務
/usr/local/nginx/sbin/nginx -s reload
16.訪問帶惡意的連接地址,出現如下信息表示ngx_lua_waf已部署成功。
cjakyligak223673.jpg

0x03 记录WAF日志拦截记录​

1.給logs日誌記錄添加授權用戶www(該用戶是nginx運行的用戶)。
[root@localhost waf]# chown -R www.www /usr/local/nginx/logs/waf/
2.給logs目錄進行添加寫入權限。
[root@localhost waf]# chmod 700/usr/local/nginx/logs/waf/
3.可查看WAF記錄的日誌信息
[root@localhost waf]# cat localhost_2018-06-05_sec.log
sih4l5ctmu223674.jpg

0x04 其他规则说明​

過濾規則在wafconf下,可根據需求自行調整,每條規則需換行,或者用|分割
args裡面的規則get參數進行過濾的
url是只在get請求url過濾的規則
post是只在post請求過濾的規則
whitelist是白名單,裡面的url匹配到不做過濾
user-agent是對user-agent的過濾規則
默認開啟了get和post過濾,需要開啟cookie過濾的,編輯waf.lua取消部分--註釋即可日誌文件名稱格式如下:虛擬主機名_sec.log

0x05 总结​

1.Nginx_lua_waf總體來說功能強大,相比其他軟件防火牆Modsecurity還稍微簡單點。
2.Ngx_lua_waf的bug主要就是防火牆策略寫的不嚴謹導致的,會造成兩種結果:一是部分***通過偽裝繞過防火牆;二是防火牆策略配置不當會造成誤殺。
3.另外根據站點的類型需要配置不同的策略,默認配置後全局生效。比如論壇等比較特殊允許很多html插入,這樣的策略需要更寬鬆。
4.最後生成的hack記錄日誌可以通過ELK分析,ELK這邊需要根據日誌格式製作特殊模版,此模版能兼容大部分日誌類型,還有少部分完全沒有規律的日誌分析不了。
5.最後ELK能展示日誌分析結果分類,但是還不能區分各種ruletag類型***屬於哪一種直白的表示出來。
6.最後建議ngx_lua_waf如果真的要用可以考慮在部分源站站點少量試用,前端站點不建議使用,等對該軟件理解深入後才可線上使用。
7.補充:目前對ngx_lua_waf拒絕特定的user agent、拒絕特定後綴文件訪問、防止sql注入三大類比較熟悉。
計劃大概實施步驟:
1.不要一次性部署上線,先部署後,只
 
返回
上方