X-WAF 是一款方便易用的雲WAF,使用反向代理的方式介入Web服務器和訪問者之間,不需要像 modSecurity 和 Naxsin 那樣作為nginx的模塊,需要進行編譯安裝
X-WAF使用 OpenResty 作為反向代理軟件,並借助 OpenResty 的 Lua 作為防御腳本的編寫和運作工具
所以,實際上X-WAF就是一個運行在 OpenResty 上的 Lua 腳本,並借助了 OpenResty(nginx) 的多平台適用性,可以在各種操作系統運行
部署X-WAF的過程時間是就是安裝 OpenResty,加載Lua腳本,然后建立虛擬主機,並把虛擬主機的訪問直接發送給原本的php、tomcat或者nginx的過程
如果是已經有基於nginx+php構建的站點,就需要把網站配置到 OpenResty 上(80或443端口),把原來的nginx里的虛擬主機的端口改為其他端口比如8080,為防止用戶通過原有IP或域名+8080端口訪問,甚至原有nginx主機配置里面IP都可以直接修改為127.0.0.1。而OpenResty的虛擬主機配置上就通過proxy_pass把訪問發送到127.0.0.1:8080的原有nginx上
項目地址:
https://waf.xsec.io/
github:
https://github.com/xsec-lab/x-waf
管理后台
https://github.com/xsec-lab/x-waf-admin
主要特性
- 支持對常見WEB攻擊的防御,如sql注入、xss、路徑穿越,阻斷掃描器的掃描等
- 對持對CC攻擊的防御
- waf為反向模式,后端保護的服務器可直接用內網IP,不需暴露在公網中
- 支持IP、URL、Referer、User-Agent、Get、Post、Cookies參數型的防御策略
- 安裝、部署與維護非常簡單
- 支持在線管理waf規則
- 支持在線管理后端服務器
- 多台waf的配置可自動同步
- 跨平台,支持在linux、unix、mac和windows操作系統中部署
安裝過程:
1、下載安裝 OpenResty http://openresty.org/cn/,即可以用源碼編譯安裝,也可以使用yum安裝,這樣用源碼編譯安裝的方式
yum -y install pcre pcre-devel
wget https://openresty.org/download/openresty-1.15.8.1.tar.gz
tar -zxvf openresty-1.15.8.1.tar.gz
cd openresty-1.15.8.1
./configure
gmake && gmake install
把openresty加入環境變量,以便可以只用調用openresty命令,實際上 /usr/local/openresty/bin/openresty 是指向 /usr/local/openresty/nginx/sbin/nginx 的一個鏈接,但我們把環境變量指向openresty,以便和系統已有的 nginx 相區別
export PATH=/usr/local/openresty/bin:$PATH
為了下次用戶登錄頁可以正常調用命令,建議把變量寫入到用戶環境變量的配置文件里面
vi ~/.bash_profile
export PATH=/usr/local/openresty/bin:$PATH # 添加到最后
2、修改原有nginx服務器的虛擬主機IP和端口,還要修改(或者刪除)nginx默認虛擬主機的IP和端口,否則啟動 openresty 時就是會因為 80 或者 443 端口被占用而無法啟動。
3、啟動openresty
--啟動
openresty
--停止
openresty -s stop
--重啟
openresty -s reload
--檢驗 openresty (nginx)配置是否正確
openresty -t
因為openresty的默認啟動用戶是nginx,如果系統沒有這個用戶就需要新建,或者使用系統原有nginx服務器的用戶也可以,比如lnmp的nginx默認用戶就是www。否則啟動openresty會報錯
nginx: [emerg] getpwnam("nginx") failed in /usr/local/openresty/nginx/conf/nginx.conf
這個時候就需要新建nginx用戶,或者修改nginx.conf里面的配置文件里的nginx啟動用戶
4、下載x-waf的配置文件和規則包
切換到openresty配置文件目錄
cd /usr/local/openresty/nginx/conf/
下載x-waf配置文件和規則文件
git clone https://github.com/xsec-lab/x-waf
下載下來是一個x-waf 的文件夾,里面的 nginx_conf/nginx.conf 文件是一個配置好了lua和x-waf規則目錄的模板文件,可以拷貝到 /usr/local/openresty/nginx/conf/nginx.conf 直接覆蓋原有openresty的配置文件
cp /usr/local/openresty/nginx/conf/x-waf/nginx_conf/nginx.conf /usr/local/openresty/nginx/conf/nginx.conf
作者的代碼里面url白名單部分有個錯誤,需要修正一下,否則會因為找不到url白名單文件,而導致白名單失效
vi /usr/local/openresty/nginx/conf/x-waf/waf.lua
找到 writeurl.rule,替換為 whiteUrl.rule
建立虛擬主機配置文件目錄
mkdir -p /usr/local/openresty/nginx/conf/vhosts
修改配置文件
vi /usr/local/openresty/nginx/conf/x-waf/config.lua
local _M = {
-- 開啟WAF
config_waf_enable = "on",
-- WAF防護日志目錄,需要保證openresty的運行用戶對該目錄有訪問權限,可通過修改目錄的所有者為openresty的運行用戶來實現,或者修改權限為777
config_log_dir = "/data/waf",
-- rule setting
config_rule_dir = "/usr/local/openresty/nginx/conf/x-waf/rules",
-- 啟用網址白名單過濾
config_white_url_check = "on",
-- 啟用IP白名單過濾
config_white_ip_check = "on",
-- 啟用IP黑名單過濾
config_black_ip_check = "on",
-- 啟用url過濾
config_url_check = "on",
-- 啟用url參數過濾
config_url_args_check = "on",
-- 啟用瀏覽器用戶代理過濾
config_user_agent_check = "on",
-- 啟用cookie過濾
config_cookie_check = "on",
-- 啟用CC攻擊檢測
config_cc_check = "on",
-- CC攻擊檢測閾值,10次/60秒
config_cc_rate = "10/60",
-- enable/disable post filtering
config_post_check = "on",
-- 檢測攻擊后給攻擊者的輸出,默認html文本串,通過config_output_html配置,或者設置為url,則通過config_waf_redirect_url配置
config_waf_model = "html",
-- if config_waf_output ,setting url
config_waf_redirect_url = "http://xxx.com",
config_expire_time = 600,
config_output_html = [[
<html>
<head>
<meta charset="UTF-8">
<title>非法訪問</title>
</head>
<body>
<div>
<div class="table">
<div>
<div class="cell">
非法訪問,您的IP為: %s
</div>
<div class="cell">
如需幫助請聯系客服
</div>
</div>
</div>
</div>
</body>
</html>
]],
}
5、管理后台安裝,管理后台使用GO語言編寫,可以直接下載編譯好的版本直接運行即可
https://github.com/xsec-lab/x-waf-admin/releases/download/x-waf-admin0.1/x-waf-admin0.1-linux-amd64.tar.gz
解壓
tar -xzf x-waf-admin0.1-linux-amd64.tar.gz
進入目錄
cd x-waf-admin
編輯配置文件
vi conf/app.ini
RUN_MODE = dev #開發環境使用
;RUN_MODE = prod #生產環境使用
[server]
HTTP_PORT = 5000 #管理后台端口
API_KEY = xsec.io||secdevops.cn
NGINX_BIN = /usr/local/openresty/nginx/sbin/nginx #指定openresty可執行文件位置
NGINX_VHOSTS = /usr/local/openresty/nginx/conf/vhosts/ #指定虛擬主機配置文件位置
API_SERVERS = 127.0.0.1, 你自己的IP #指定管理后台的IP地址,加上你自己的服務器IP即可
[database]
USER = 數據庫用戶名
PASSWD = 數據庫密碼
HOST = 127.0.0.1:3306 #數據庫地址和端口
NAME = waf #數據庫名
[waf]
RULE_PATH = /usr/local/openresty/nginx/conf/x-waf/rules/
已后台進程方式啟動管理后台,啟動后會自動往MySQL數據庫寫入配置表,如果沒有配置好MySQL,管理后台會因為找不到數據庫里面的用戶而無法登錄
nohup ./server >> x-waf.log 2>&1 &
tail -f x-waf.log 查看運行日志和啟動啟動
然后就可以訪問管理后台 http://ip:5000/login/ 了,默認的管理后台用戶是admin,密碼是 x@xsec.io,生產環境一點要修改賬戶密碼
6、通過管理后台添加站點,在Index頁面點擊新增后端站點
添加以后點擊同步按鈕,就會把配置寫入到openresty的虛擬主機配置文件目錄里面(/usr/local/openresty/nginx/conf/vhosts)
我們需要注意的時,管理后台實際是以 x-waf-admin/templates/proxy.tmpl 文件為模板生成虛擬主機配置文件的,所以如果生成的文件不符合要求,也可以修改這個模板文件
或者參考這個模板文件自行在 /usr/local/openresty/nginx/conf/vhosts 目錄建立虛擬主機配置文件
點擊同步按鈕后可能會提示同步失敗(實際上配置文件已經寫入,只是無法重啟openresty),那是因為通過proxy.tmpl生成的配置文件把日志目錄放到了 /var/log/nginx/ 里面,這個目錄可能不存在。
可以手動建立目錄或者修改目錄
特別需要注意的時,如果你手動修改了虛擬主機配置文件,就不要使用同步按鈕了,點擊同步按鈕將會用proxy.tmpl重新生成配置文件
7、測試waf是否生效
http://ip/\?id\=1%20union%20select%201,2,3 #應該會顯示“”歡迎在遵守白帽子道德准則的情況下進行安全測試“”等字樣
在WAF防護日志目錄,剛才我們配置的 /data/waf 目錄應該會出現相應的日志,應當經常檢查改目錄的日志,並作出相應的防護措施
8、檢查原有網站能否正常訪問
9、如果我們想修改waf的攔截提示信息,可以修改 /usr/local/openresty/nginx/conf/x-waf 文件里的 config_output_html 配置