ngx_waf:方便且高性能的 Nginx 防火墻模塊
緩存策略為 LRU,IP 檢查和 CC 防御花費(fèi)常數(shù)時(shí)間,其它的檢查花費(fèi) O(nm) 的時(shí)間,其中 n 是相關(guān)規(guī)則的條數(shù),m 為執(zhí)行正則匹配的時(shí)間復(fù)雜度,但是每次檢查過后會(huì)自動(dòng)緩存本次檢查的結(jié)果,下次檢查相同的目標(biāo)時(shí)就可以使用緩存而不是檢查全部的規(guī)則。不會(huì)緩存 POST 請(qǐng)求體的檢查結(jié)果。
1工具特點(diǎn)
介紹了該工具的主要特點(diǎn)以及核心功能!
該 Nginx 的第三方擴(kuò)展工具,可以防御 CC 攻擊(超出限制后自動(dòng)拉黑對(duì)應(yīng) IP 一段時(shí)間或者使用驗(yàn)證碼做人機(jī)識(shí)別),可以支持多種黑白名單(IP/POST/URL/UA等等),還可以提供防護(hù) SQL 注入和 XSS 工具。
使用簡(jiǎn)單
配置文件和規(guī)則文件書寫簡(jiǎn)單,可讀性強(qiáng)
基礎(chǔ)防護(hù)
如 IP 或 IP 網(wǎng)段的黑白名單、URI 黑白名單和請(qǐng)求體黑名單等
高性能
使用高效的 IP 檢查算法和緩存機(jī)制,支持 IPV4 和 IPV6
高級(jí)防護(hù)
兼容 ModSecurity 的規(guī)則,你可以使用 OWASP 的核心規(guī)則庫
友好爬蟲驗(yàn)證
支持驗(yàn)證 Google、Bing、Baidu 和 Yandex 的爬蟲并自動(dòng)放行,避免錯(cuò)誤攔截,主要是基于 User-Agent 和 IP 的識(shí)別規(guī)則
驗(yàn)證碼
支持三種驗(yàn)證碼:hCaptcha、reCAPTCHAv2 和 reCAPTCHAv3
2模塊安裝
第三方模塊我們應(yīng)該怎么安裝呢?
Nginx 提供兩種安裝模塊的方式,即「靜態(tài)鏈接」和「動(dòng)態(tài)加載」,通過兩種方式安裝的模塊也分別稱為「靜態(tài)模塊」和「動(dòng)態(tài)模塊」,可以通過運(yùn)行腳本 assets/guide.sh 來選擇使用靜態(tài)模塊還是動(dòng)態(tài)模塊。
#執(zhí)行如下命令 $shassets/guide.sh #如果輸出下面這行,則建議使用動(dòng)態(tài)模塊 #Itisrecommendedthatyouusedynamicmodules. #如果輸出下面這行,則建議使用靜態(tài)模塊 #Itisrecommendedthatyouusestaticmodules.
[1] 靜態(tài)模塊
編譯安裝一個(gè)新的模塊需要知道當(dāng)前的 Nginx 的 configure 腳本的參數(shù),您可以通過運(yùn)行 nginx -V 來獲取,務(wù)必記住 configure arguments: 后面的內(nèi)容。安裝靜態(tài)模塊需要重新編譯整個(gè) Nginx,花費(fèi)的時(shí)間相對(duì)于安裝動(dòng)態(tài)模塊比較長(zhǎng)。如果不想在替換二進(jìn)制文件時(shí),關(guān)閉 Nginx 服務(wù)的話,可以參考官方文檔的熱部署方案。
#下載對(duì)應(yīng)的Nginx版本 #http://nginx.org/en/download.html $cd/usr/local/src $wgethttps://nginx.org/download/nginx-1.20.1.tar.gz $tar-zxfnginx-1.20.1.tar.gz #使用穩(wěn)定版的源碼 $cd/usr/local/src $gitclone-bltshttps://github.com/ADD-SP/ngx_waf.git #運(yùn)行配置腳本 $cd/usr/local/src/nginx-1.20.1 $./configureARG--add-module=/usr/local/src/ngx_waf $sed-i's/^(CFLAGS.*)/1 -fstack-protector-strong-Wno-sign-compare/' objs/Makefile #編譯(非并行/并行) $make $make-j$(nproc) #替換Nginx二進(jìn)制文件(假設(shè)已經(jīng)安裝過) $cpobjs/nginx/usr/local/nginx/sbin/nginx
[2] 動(dòng)態(tài)模塊 - 下載預(yù)構(gòu)建的模塊
通過執(zhí)行腳本 assets/download.sh 來下載動(dòng)態(tài)模塊。
#用于nginx-1.20.1的LTS版的模塊 $shassets/download.sh1.20.1lts #用于nginx-1.20.1的最新版的模塊 $shassets/download.sh1.20.1current #執(zhí)行成功后會(huì)有如下輸出 checkingforcommand...yes checkingforlibcimplementation...yes +GNUClibary Pullingremoteimageaddsp/ngx_waf-prebuild:ngx-1.20.1-module-beta-glibc ...... Downloadcomplete!
如果看到 Download complete! 的話,則說明下載成功,模塊會(huì)被保存在當(dāng)前目錄下。你可以將其拷貝到一個(gè)目錄下,然后在 nginx.conf 的頂部添加一行。然后關(guān)閉 Nginx 服務(wù)并運(yùn)行 nginx -t。如果沒有出錯(cuò)則說明模塊被正常加載,反之則說明您的 Nginx 不支持預(yù)構(gòu)建的模塊,請(qǐng)編譯安裝模塊。
load_module"/path/to/ngx_http_waf_module.so";
[3] 動(dòng)態(tài)模塊 - 編譯動(dòng)態(tài)模塊
編譯安裝動(dòng)態(tài)模塊并不需要重新編譯整個(gè) Nginx,只需要重新編譯所有的模塊,所以速度相對(duì)靜態(tài)模塊快一些,這也是本文檔推薦的方式。
#下載對(duì)應(yīng)的Nginx版本 #http://nginx.org/en/download.html $cd/usr/local/src $wgethttps://nginx.org/download/nginx-1.20.1.tar.gz $tar-zxfnginx-1.20.1.tar.gz #使用穩(wěn)定版的源碼 $cd/usr/local/src $gitclone-bltshttps://github.com/ADD-SP/ngx_waf.git #運(yùn)行配置腳本 $cd/usr/local/src/nginx-1.20.1 $./configure--add-dynamic-module=/usr/local/src/ngx_waf--with-compat $sed-i's/^(CFLAGS.*)/1 -fstack-protector-strong-Wno-sign-compare/' objs/Makefile #開始編譯動(dòng)態(tài)模塊 $makemodules #將動(dòng)態(tài)模塊拷貝到模塊目錄(關(guān)閉服務(wù)) $cpobjs/*.so/usr/local/nginx/modules
最后,在 Nginx 的配置文件頂部添加一行,表示加載這個(gè)編譯好的模塊。
load_module"/usr/local/nginx/modules/ngx_http_waf_module.so";
3模塊使用
第三方模塊我們應(yīng)該怎么使用呢?更多參數(shù)參考 配置語法
現(xiàn)在就可以在 nginx.conf 內(nèi)的一個(gè) server 塊中添加配置來開啟 ngx_waf 模塊來配置服務(wù)的防火墻了,下面是一個(gè)例子。
[1] LTS 版本
http{ ... server{ ... #on/off表示啟用和關(guān)閉 wafon; #規(guī)則文件所在目錄的絕對(duì)路徑,必須以/結(jié)尾 waf_rule_path/usr/local/src/ngx_waf/assets/rules/; #防火墻工作模式,STD表示標(biāo)準(zhǔn)模式 waf_modeSTD; #CC防御參數(shù) #1000表示每分鐘請(qǐng)求次數(shù)上限,超出上限后封禁對(duì)應(yīng)ip地址60分鐘 waf_cc_denyrate=1000r/mduration=60m; #最多緩存50個(gè)檢測(cè)目標(biāo)的檢測(cè)結(jié)果 #對(duì)除了IP黑白名單檢測(cè)、CC防護(hù)和POST檢測(cè)以外的所有檢測(cè)生效 waf_cachecapacity=50; ... } ... }
[2] Current 版本
http{ #聲明一塊共享內(nèi)存 waf_zonename=wafsize=20m; ... server{ ... #on/off表示啟用和關(guān)閉 wafon; #規(guī)則文件所在目錄的絕對(duì)路徑,必須以/結(jié)尾 waf_rule_path/usr/local/src/ngx_waf/assets/rules/; #防火墻工作模式,STD表示標(biāo)準(zhǔn)模式 waf_modeSTD; #CC防御參數(shù) #1000表示每分鐘請(qǐng)求次數(shù)上限,超出上限后封禁對(duì)應(yīng)ip地址60分鐘 waf_cc_denyonrate=1000r/mduration=60mzone=waf:cc; #對(duì)除了IP黑白名單檢測(cè)、CC防護(hù)和POST檢測(cè)以外的所有檢測(cè)生效 waf_cacheoncapacity=50; ... } ... }
4常用設(shè)置
列出一些 常用的設(shè)置,拿來直接就可以使用!
因?yàn)槟K的配置比較復(fù)雜,為了降低使用難度,在這里列出了一些常見用法。
[1] 針對(duì)路徑或文件限流
有時(shí)你可能想要限制不同的路徑或文件的請(qǐng)求速率,比如靜態(tài)資源和動(dòng)態(tài)資源使用不同的速率限制。
#LTS #將靜態(tài)資源的請(qǐng)求速率限制到10,000次/分鐘 location/static/{ waf_cc_denyrate=10000r/mduration=1h; } #將動(dòng)態(tài)資源的請(qǐng)求速率限制到2,000次/分鐘 location/dynamic/{ waf_cc_denyrate=2000r/mduration=1h; }
#Current http{ waf_zonename=wafsize=20m; server{ #將靜態(tài)資源的請(qǐng)求速率限制到10,000次/分鐘 location/static/{ waf_cc_denyrate=10000r/mduration=1hzone=waf:cc_static; } #將動(dòng)態(tài)資源的請(qǐng)求速率限制到2,000次/分鐘 location/dynamic/{ waf_cc_denyrate=2000r/mduration=1hzone=waf:cc_dynamic; } } }
[2] 開啟驗(yàn)證碼
hCaptcha
reCAPTCHAv2
reCAPTCHAv3
當(dāng)你的站點(diǎn)受到 CC 攻擊時(shí)開啟驗(yàn)證碼是不錯(cuò)的選擇,因?yàn)轵?yàn)證碼可以幫助你進(jìn)行人機(jī)識(shí)別。本模塊目前支持三種驗(yàn)證碼,你應(yīng)該選擇一個(gè)并從其網(wǎng)站上申請(qǐng)到 Sitekey 和 Secret。配置完成之后,重啟 nginx 服務(wù)。
#整個(gè)站點(diǎn)開啟驗(yàn)證碼 server{ waf_captchaonprov=hCaptchasecret=your_secretsitekey=your_sitekey; }
#為某個(gè)路徑開啟驗(yàn)證碼 location{ waf_captchaonprov=hCaptchasecret=your_secretsitekey=your_sitekey; }
#當(dāng)訪問頻率過高時(shí)開啟驗(yàn)證碼 http{ waf_zonename=wafsize=20m; server{ waf_cc_denyonrate=1000r/mduration=1hzone=waf:cc; waf_captchaoffprov=hCaptchasecret=your_secretsitekey=your_sitekey; waf_actioncc_deny=CAPTCHAzone=waf:action; } }
[3] 攔截請(qǐng)求時(shí)啟用驗(yàn)證碼
如今,許多攻擊者都會(huì)使用自動(dòng)工具攻擊服務(wù)器,這些自動(dòng)工具會(huì)嘗試每一個(gè)漏洞,有的會(huì)被安全措施所攔截,有的則可以躲避檢測(cè)。如果攻擊者覺得你的價(jià)值比較高,可能會(huì)手動(dòng)攻擊你的服務(wù)。我們并不能完美地防御這些攻擊,但卻能很簡(jiǎn)單地提高攻擊的成本。
當(dāng)一個(gè)請(qǐng)求被攔截時(shí),ngx_waf 會(huì)對(duì)該 IP 啟用驗(yàn)證碼,此時(shí)該 IP 想要繼續(xù)訪問就必須完成驗(yàn)證碼。這基本可以廢掉多數(shù)的自動(dòng)攻擊工具,因?yàn)檫@些工具會(huì)嘗試每一個(gè)漏洞,而我們總能識(shí)別一些明顯的攻擊請(qǐng)求并啟用驗(yàn)證碼,而自動(dòng)工具時(shí)難以通過驗(yàn)證的。對(duì)于手動(dòng)攻擊者,這也能提高他們的時(shí)間成本。
http{ waf_zonename=wafsize=20m; server{ waf_captchaoffprov=xxxsitekey=xxxsecret=xxx; waf_actionblacklist=CAPTCHAzone=waf:action; } }
[4] 被攻擊時(shí)降低帶寬占用
當(dāng)你受到 CC 攻擊時(shí),攻擊者的 IP 已經(jīng)被 CC 防護(hù)拉黑,但是你的上下行帶寬依然很高, 這是因?yàn)?CC 防護(hù)會(huì)返回一個(gè) 503 狀態(tài)碼,因此占用了你的帶寬,你可以使用下面的配置來降低帶寬占用。
444 狀態(tài)碼是 nginx定義的一個(gè)非標(biāo)準(zhǔn)的 HTTP 狀態(tài)碼,其作用就是直接關(guān)閉連接,不再發(fā)送任何數(shù)據(jù)。如果你使用了 444 狀態(tài)碼,那么在用戶看來你的網(wǎng)站就像是不存在一樣。這是因?yàn)榫W(wǎng)站出錯(cuò)一般都會(huì)有 HTTP 狀態(tài)碼用來提示錯(cuò)誤, 如果訪問一個(gè)網(wǎng)站連錯(cuò)誤提示都沒有,那么大概率是這個(gè)網(wǎng)站不存在。
#LTS waf_http_statuscc_deny=444;
#Current waf_actioncc_deny=444;
[5] 抵御分布式 CC 攻擊
CC 攻擊(HTTP 洪水)是指發(fā)送大量的 HTTP 請(qǐng)求來耗盡服務(wù)器的資源。如果攻擊者使用的 IP 較少則防御較為簡(jiǎn)單,因?yàn)橹恍枰拗?IP 的請(qǐng)求頻率,但是如果攻擊者使用大量的 IP 進(jìn)行攻擊,僅僅限制 IP 的請(qǐng)求頻率是無濟(jì)于事的。這種使用大量 IP 進(jìn)行 CC 攻擊的方式稱為分布式 CC 攻擊或分布式 HTTP 洪水。
本模塊提供了一些緩解方式,第一種開啟驗(yàn)證碼來緩解,第二種使用降低帶寬占用,第三種使用五秒盾來緩解。你可能聽說過 Cloudflare 的五秒盾,本模塊的五秒盾和 Cloudflare 的完全不同。它的功能是檢測(cè)客戶端是否能夠正確地支持 Cookie,比如發(fā)送 Cookie 和正確地處理 Set-Cookie 響應(yīng)頭。你可以從本項(xiàng)目的 assets/ 目錄下找到 under-attack.html 并將其拷貝到某個(gè)路徑下,然后通過修改 nginx 的配置文件來開啟五秒盾。
#LTS #為整個(gè)網(wǎng)站開啟五秒盾 server{ waf_under_attackonfile=/path/to/under_attack.html; } #為某個(gè)路徑開啟五秒盾 location/path{ waf_under_attackonfile=/path/to/under_attack.html; }
#Current #為整個(gè)網(wǎng)站開啟五秒盾 server{ waf_under_attackon; } #為某個(gè)路徑開啟五秒盾 location/path{ waf_under_attackon; }
5效果測(cè)試
如需更多幫助,可以參考 如何測(cè)試!
當(dāng)我們部署和配置服務(wù)完成之后,需要測(cè)試下防火墻是否正常起作用了,可以通過如下方式進(jìn)行簡(jiǎn)單的測(cè)試來判斷規(guī)則是否正常運(yùn)行。
#測(cè)試時(shí)的配置 master_processon; worker_processes1; http{ server{ listen80; server_namelocalhost; access_logoff; wafon; waf_modeDYNAMIC!CC!POST; waf_rule_path/usr/local/src/ngx_waf/rules/; waf_cachecapacity=6000interval=1hpercent=50; location/{ default_typetext/html; return200'hello'; } } }
[1] 簡(jiǎn)易測(cè)試
運(yùn)行下列命令,如果輸出 403 則表示模塊正常工作
$curl-I-o/dev/null--user-agentbench -s-w"%{http_code}\n"https://example.com
[2] 自動(dòng)測(cè)試
項(xiàng)目附帶了許多測(cè)試用例,你可以通過下面的指令來運(yùn)行全部的用例
#這行命令的執(zhí)行時(shí)間比較長(zhǎng) $cpanTest::Nginx #如果目錄已經(jīng)存在則會(huì)先刪除再創(chuàng)建 $exportMODULE_TEST_PATH=/path/to/temp/dir #如果你安裝了動(dòng)態(tài)模塊則需要指定動(dòng)態(tài)模塊的絕對(duì)路徑,反之則無需執(zhí)行這行命令 $exportMODULE_PATH=/path/to/ngx_http_waf_module.so #自動(dòng)化測(cè)試 $cd./test/test-nginx $sh./init.sh $sh./start.sh./t/*.t
#可以使用WRK工具測(cè)試 $wrk-c100-d30m-t1-stest/wrk/rand.lua--latency http://localhost/--/path/to/rand-str.txt
6注意事項(xiàng)
如需更多幫助,可以參考 常見問題與解答!
本模塊只保證對(duì) nginx-1.18.0 或更新的版本的兼容性,且不保證與 Linux 以外的操作系統(tǒng)的兼容性。這里需要注意的是,模塊與 ngx_http_rewrite_module 存在兼容性問題。
當(dāng) return 指令生效時(shí),該模塊不會(huì)生效
當(dāng) rewrite 指令造成了返回(如 302 重定向)時(shí),該模塊不會(huì)生效
所以可以使用 try_files 代替 rewrite 指令,避免上述問題的出現(xiàn)
#rewrite if(!-e$request_filename){ rewrite(.*)/index.php } #try_files try_files$uri$uri//index.php;
7參考鏈接
Github 代碼倉庫
黑白名單規(guī)則說明
檢測(cè)項(xiàng)目規(guī)則優(yōu)先級(jí)
模塊的內(nèi)置變量
日志相關(guān)的配置說明
審核編輯:湯梓紅
-
模塊
+關(guān)注
關(guān)注
7文章
2785瀏覽量
50005 -
Web
+關(guān)注
關(guān)注
2文章
1286瀏覽量
71060 -
防火墻
+關(guān)注
關(guān)注
0文章
431瀏覽量
36133 -
SQL
+關(guān)注
關(guān)注
1文章
782瀏覽量
44955 -
nginx
+關(guān)注
關(guān)注
0文章
169瀏覽量
12539
原文標(biāo)題:使用 Nginx 三方擴(kuò)展 ngx_waf 快速實(shí)現(xiàn)一個(gè)高性能的 Web 應(yīng)用防火墻
文章出處:【微信號(hào):良許Linux,微信公眾號(hào):良許Linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
Linux如何關(guān)閉防火墻
談防火墻及防火墻的滲透技術(shù)
網(wǎng)站安全公司waf防火墻的基本概念介紹
WAF與防火墻:Web 應(yīng)用程序和網(wǎng)絡(luò)防火墻

Web 應(yīng)用程序防火墻 (WAF) 相關(guān)知識(shí)介紹

Web 應(yīng)用程序和網(wǎng)絡(luò)防火墻之間的異同

Web應(yīng)用防火墻的重要性及基本原理

如何利用Web應(yīng)用防火墻應(yīng)對(duì)未知威脅
Web應(yīng)用防火墻的性能優(yōu)化技術(shù)
Web應(yīng)用防火墻的重要性及基本原理

火傘云Web應(yīng)用防火墻的特點(diǎn)與優(yōu)勢(shì)

如何利用Web應(yīng)用防火墻應(yīng)對(duì)未知威脅

Web應(yīng)用防火墻的性能優(yōu)化技術(shù)

評(píng)論