轉(zhuǎn)載https://github.com/unixhot/waf
WAF
使用Nginx+Lua實現(xiàn)自定義WAF(Web application firewall)
功能列表:
支持IP白名單和黑名單功能,直接將黑名單的IP訪問拒絕。
支持URL白名單,將不需要過濾的URL進行定義。
支持User-Agent的過濾,匹配自定義規(guī)則中的條目,然后進行處理(返回403)。
支持CC攻擊防護,單個URL指定時間的訪問次數(shù),超過設(shè)定值,直接返回403。
支持Cookie過濾,匹配自定義規(guī)則中的條目,然后進行處理(返回403)。
支持URL過濾,匹配自定義規(guī)則中的條目,如果用戶請求的URL包含這些,返回403。
支持URL參數(shù)過濾,原理同上。
支持日志記錄,將所有拒絕的操作,記錄到日志中去。
日志記錄為JSON格式,便于日志分析,例如使用ELK進行攻擊日志收集、存儲、搜索和展示。
WAF實現(xiàn)
WAF一句話描述,就是解析HTTP請求(協(xié)議解析模塊),規(guī)則檢測(規(guī)則模塊),做不同的防御動作(動作模塊),并將防御過程(日志模塊)記錄下來。所以本文中的WAF的實現(xiàn)由五個模塊(配置模塊、協(xié)議解析模塊、規(guī)則模塊、動作模塊、錯誤處理模塊)組成。
安裝部署
以下方案選擇其中之一即可:
選擇1: 可以選擇使用原生的Nginx,增加Lua模塊實現(xiàn)部署。
選擇2: 直接使用OpenResty
OpenResty安裝
1 Yum安裝OpenResty(推薦)
源碼安裝和Yum安裝選擇其一即可,默認均安裝在/usr/local/openresty目錄下。
[root@opsany ~]# wget https://openresty.org/package/centos/openresty.repo
[root@opsany ~]# sudo mv openresty.repo /etc/yum.repos.d/
[root@opsany ~]# sudo yum install -y openresty
測試OpenResty和運行Lua
[root@opsany ~]# vim /usr/local/openresty/nginx/conf/nginx.conf
#在默認的server配置中增加
location /hello {
default_type text/html;
content_by_lua_block {
ngx.say("<p>hello, world</p>")
}
}
[root@opsany ~]# /usr/local/openresty/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/openresty-1.17.8.2/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/openresty-1.17.8.2/nginx/conf/nginx.conf test is successful
[root@opsany ~]# /usr/local/openresty/nginx/sbin/nginx
測試訪問
[root@opsany ~]# curl http://127.0.0.1/hello
<p>hello, world</p>
WAF部署
[root@opsany ~]# git clone https://github.com/unixhot/waf.git
[root@opsany ~]# cp -r ./waf/waf /usr/local/openresty/nginx/conf/
[root@opsany ~]# vim /usr/local/openresty/nginx/conf/nginx.conf
#在http{}中增加,注意路徑,同時WAF日志默認存放在/tmp/日期_waf.log
#WAF
lua_shared_dict limit 50m;
lua_package_path "/usr/local/openresty/nginx/conf/waf/?.lua";
init_by_lua_file "/usr/local/openresty/nginx/conf/waf/init.lua";
access_by_lua_file "/usr/local/openresty/nginx/conf/waf/access.lua";
[root@opsany ~]# ln -s /usr/local/openresty/lualib/resty/ /usr/local/openresty/nginx/conf/waf/resty
[root@opsany ~]# /usr/local/openresty/nginx/sbin/nginx -t
[root@opsany ~]# /usr/local/openresty/nginx/sbin/nginx -s reload
Nginx反向代理
Nginx+Lua WAF很重要的一個基礎(chǔ)功能,即反向代理功能,通過代理的方式保護網(wǎng)站:
在nginx.conf配置文件倒數(shù)第二行處添加一行,增加www.douwaf.com的反向代理配置,保護的網(wǎng)站多了以后會導致nginx.conf太大難以維護,所以通常會把不同服務的配置文件獨立組成文件。
include "/usr/local/openresty/nginx/conf/www.douwaf.com.conf";
include指令也支持通配符,所以更常見的做法是:
include "/home/maidou/opt/openresty/nginx/conf/*.conf";
編輯www.douwaf.com.conf,定義upstream組,對應是后端真實提供服務的服務器地址和端口,192.168.1.222:80
upstream xi{
server 192.168.1.222:80;
}
server {
listen 80;
server_name www.test.com;
location / {
proxy_pass http://xi;
index index.html index.htm;
}
}
使用頁面訪問,可以正常使用,說明反向代理配置生效。測試階段也可以不進行DNS切換,修改/etc/hosts文件也可以達到同樣效果
基于Nginx+Lua的WAF
1)WAF配置。WAF的配置在config.lua文件中完成,其中比較重要的幾個配置內(nèi)容如下所示。
● config_waf_enable:表明WAF是否攔截,on表明檢測并攔截,off表明檢測不攔截
● config_log_dir:表明WAF日志對應的路徑
● config_rule_dir:表明WAF規(guī)則對應的路徑
● config_url_check:表明是否對URL進行檢測
● config_user_agent_check:表明是否對user_agent進行檢測
● config_cookie_check:表明是否對cookie進行檢測
● config_post_check:表明是否對post內(nèi)容進行檢測
● config_output_html:表明檢測到攻擊后返回給用戶的頁面內(nèi)容
Lua環(huán)境初始化:Lua的初始化是在init.lua文件中完成的,根據(jù)配置分別加載不同的規(guī)則文件。比如在函數(shù)url_attack_check中,首先判斷配置文件中是否配置需要檢測URL:
function url_attack_check()
if config_url_check == "on" then
如果配置了該選項,則加載對應的檢測規(guī)則:
local URL_RULES = get_rule('url.rule')
其他檢測URL參數(shù)、cookie以及post內(nèi)容都類似。
Lua處理HTTP協(xié)議:
這個是整個WAF最核心的部分,流程如圖2-8所示,Nginx處理HTTP協(xié)議的請求內(nèi)容,將HTTP協(xié)議解析成URL、URL參數(shù)、post內(nèi)容、cookie、user-agent等字段,Lua針對這些字段進行檢測,判斷攻擊類型。處理應答內(nèi)容類似,不再贅述。整個處理過程體現(xiàn)在access.lua文件,可以看出一個HTTP請求會如圖2-9所示,串行經(jīng)過各種檢測:文章來源:http://www.zghlxwxcb.cn/news/detail-513511.html
function waf_main()
if white_ip_check() then
elseif black_ip_check() then
elseif user_agent_attack_check() then
elseif cc_attack_check() then
elseif cookie_attack_check() then
elseif url_attack_check() then
elseif url_args_attack_check()
Lua的檢測規(guī)則在rule-config目錄,不同檢測內(nèi)容保存在不同文件中文章來源地址http://www.zghlxwxcb.cn/news/detail-513511.html
到了這里,關(guān)于使用Nginx+Lua實現(xiàn)自定義WAF(Web application firewall)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!