INODENINJA WAF物件說明
WAF物件用途
使用WAF(Web Application Firewall, 網站應用程式防火牆)來控制網站的存取限制,舉凡最常使用的黑白名單,甚至跳轉、速度限制等都可以使用WAF來配置。
「WAF物件」則可以想像成
規則組
,您只要撰寫一次WAF物件,便可以套用在多個域名(或專案)之中使用,此種方式能夠讓您的配置更靈活。
WAF物件組成
INODENINJA的WAF物件可以分為「條件」與「動作」兩個部份,使用起來也很容易,只要符合「條件」,便會採取「動作」。
比如條件設定「IP 1.2.3.4」且動作為「阻擋」,那就代表只要符合IP 1.2.3.4
就會採取阻擋
的動作。
預設(沒使用任何WAF)的情況是所有請求都可以存取的哦
條件(Conditions)
- 各個條件之間的判斷方式為and.
假設在一條WAF中同時設定了IP地址: 1.1.1.1以及請求URI: /example兩項條件,並且動作為阻擋,那請求來時就必須要達到ip = 1.1.1.1
以及uri = /example
兩項條件才會觸發阻擋. - 一個條件中可以透過換行的方式表示不同的條件內容,這個時候判斷的條件就為or,假設在IP地址中設定了1.1.1.1/32以及2.2.2.2/32.這時請求的IP只要是1.1.1.1或者是2.2.2.2都會觸發該條件.
IP地址
使用者的IP地址, 填寫格式為<IP>/<netmask>
。比如1.2.3.4/32
代表單一個IP;1.2.3.0/24
則代表1.2.3.0 - 1.2.3.255整段IP。
請求URI
當使用者請求網站的URI「包含」填寫的內容會觸發條件。比如我們填寫/image
,那麼預期符合的URI如下:
- /image/a.png <-- 包含
/image
,所以符合條件 - /image/b.png <-- 包含
/image
,所以符合條件 - /assets/image/c.jpeg 包含
/image
,所以符合條件
此項條件設定支援變數
以及正則表達,不過如果設定的條件中包含非英文字母時,會需要將該段文字進行URL編碼後填入才能正常判斷.
假設我們的判斷條件中需包含/測試
時,就會需要先將測試
進行URL編碼成%E6%B8%AC%E8%A9%A6
之後填入/%E6%B8%AC%E8%A9%A6
才能正確判斷.
Tips: 如果我們只需要
/image
在URI開頭的話, 我們可以這樣去配置^/image
;而如果需要指定URI在結尾的話,我們可以使用/image$
URL編碼網站
請求表頭
此項條件設定同樣支援變數
以及正則表達,需要注意的是空格也是包含在判斷條件內的.
例如test:blank
跟test: blank
就是不一樣的條件.
另外如果該項條件需要判斷非英文字母時,只需直接將其填入即可正常判斷.
假設我們的判斷條件中需包含test:測試
表頭時,只需直接填入test:測試
即可.
Tips: 如果將WAF套入至專案(APP Profile)中,裡面的域名都會享有相同設定;此時如果需要針對特定域名做配置,可以使用
Host
標頭來指定,比如配置Host:inodeninja.net
,那就只有專案中的這個域名會命中條件。
Request Headers Not Exist
請求沒有包含哪些表頭時觸發該條件,此條件換行設定多項時判斷為and.
假設今天設定了user-agent
以及host
兩項條件時,請求表頭只要缺少user-agent
或者host
其中之一就會觸發該條件
國家
請求使用者的所屬國家,可複選。
線路商
請求使用者的線路商提供者,如果線路商名稱有包含特殊符號需使用跳脫符號.
例如線路商名稱為example (demo)
,那設定時就須填寫example \(demo\)
才會正常觸發.
Proxy Type
使用了ip2proxy的資料庫判斷請求的代理類型.
Proxy Type,可以透過輸入請求的ip來判斷其代理類型
請求方法
HTTP請求當中的Method屬性,支援「GET」、「POST」、「PURGE」、「PUT」、「HEAD」、「OPTIONS」、「DELETE」與「PATCH」。
請求速率
當「同一個使用者(IP)」在一定時間內存取次數超過N次時觸發條件。填寫方式為<請求次數>/時間(秒)
;比如我們填寫5/2
,代表同一個使用者在2秒內存取5次
則會觸發條件。
OWASP
針對OWASP組織列出的Web應用程式中常見的安全漏洞攻擊方式,提供了幾種判斷方式應對不同的攻擊手段
支援的判斷方式:
- http_violation:利用違反HTTP協議規範的方式,對Web應用程序進行攻擊
- http_anomaly:利用HTTP協議中的異常行為來攻擊Web應用程序.
- user_agent:利用HTTP協議中的User-Agent頭部欄位進行攻擊.
- generic_attack:例如未修复的漏洞或容易受到攻击的網路協議.
- sqli:利用 Web 應用程式的漏洞,向資料庫伺服器發送惡意的 SQL 查詢語句,以獲取未經授權的資料或執行非法操作.
- xss:利用在網頁中插入惡意的腳本,使得被攻擊的網頁在用戶瀏覽時,載入這些惡意腳本並執行,從而導致用戶受到攻擊。
Not Source IP
當請求的IP不等於設定的條件時觸發
Not Request URI
當請求的URI不等於設定的條件時觸發,此項條件設定支援方式跟請求URI
相同.
Not Request Headers
當請求的表頭不等於設定的條件時觸發,此項條件設定支援方式跟請求表頭
相同.
動作(Actions)
Allow
允許您設定的條件正常訪問源站.當用戶的請求達到此條件時,後續的動作就不會再判斷,在配置順序
中會更詳細的說明.如果只想讓特定對象訪問,需搭配Deny
使用,在示範
中會更詳細的說明.
Deny
根據設定條件進行阻擋.
- 阻擋頁面:用戶觸發時看到的頁面,您可以選擇預設的頁面或者自行上傳客製頁面.
將觸發Period阻擋
的開關打開時,有更多進一步的功能可以設定:
- 觸發Period阻擋頻率: 與
請求速率
的判斷方式相同 - 阻擋時間: 進入
Block Period
的時間 - 群組設定: 是否要阻擋整個群組或者只阻擋有設定此動作的域名
- 使用L3阻擋: 要在SLB(L3)就直接阻擋,還是透過EDGE(L7)阻擋
開啟L3阻擋並且觸發條件之後約需兩分鐘才會生效在SLB阻擋,關閉也是需要兩分鐘
Speed Limit
限制用戶帶寬(流量)
- 您可以在限速的欄位設定限制的流量,至少要大於0
Redirect
跳轉您設定的網址,並且可以依據跳轉的原因設定HTTP 301 / HTTP 302 / HTTP 307
Cookie / JS Challenge
可以在用戶訪問時就分辨出是否為瀏覽器發出的請求
Gesture Challenge
為了防止偽裝成瀏覽器的機器人來請求,可以進行手勢驗證,來確保用戶是正常用戶
Log
只會記錄在事件查詢中,不會有其他的動作(觀察模式)
Block Period
阻擋用戶一段時間
- 阻擋時間: 進入
Block Period
的時間 - 群組設定: 是否要阻擋整個群組或者只阻擋有設定的域名
- 使用L3阻擋: 要在SLB(L3)就直接阻擋,還是透過EDGE(L7)阻擋
開啟L3阻擋並且觸發條件之後約需兩分鐘才會生效在SLB阻擋,關閉也是需要兩分鐘
Set Request Headers
設定用戶請求到源站的表頭,可以使用預設的變數
來添加相關資訊.
Set Response Headers
設定源站回傳的表頭,較常使用在跨源資源共享(CORS)的情況
Custom Page
根據設定條件返回客製化頁面,返回內容能夠自行設計
Origin Policy
根據設定條件進行回源請求,回源方式能夠自行配置
Smart Captcha
為了防止偽裝成瀏覽器的機器人來請求,可以進行圖片驗證,來確保用戶是正常用戶
Scroll (Functions)
其他
以下會介紹跟WAF條件以及動作無關,但對於完整WAF運作中重要的功能說明,依序有WAF規則的配置順序
以及設定WAF條件時可以使用的變數
,最後會針對幾種情境示範設定WAF的方法.
配置順序
以上圖為例,域名下套用了四條規則,判斷的順序就為allow->deny->captcha->redirect,換言之當請求來的時候會先判斷allow規則中的條件有沒有觸發,如果觸發的話就會執行allow的動作,如果沒有觸發才會接續判斷deny中設定的條件有沒有觸發...
變數
在設定條件時提供了幾種變數可以使用,以下為各個變數的介紹
- $host: 請求訪問的域名
- $request_uri: 請求的uri
- $rip: 請求的ip位置
- $dstport: 請求訪問的port號
- $scheme: 請求使用的協議
- $rootdomain:請求訪問的
二級域名
以及根域名
以https://waf.example.com/test?variable=all
為例:
- $host: waf.example.com
- $request_uri: /test?variable=all
- $rip: 1.1.1.1
- $dstport: 443
- $scheme: https
- $rootdomain:example.com
示範
情境一:設定白名單
假設只想要允許1.2.3.0 - 1.2.3.255整段IP可以訪問源站,其他的ip都直接阻擋在edge時,可以這樣做:
- 設定allow規則,並且在來源IP中填寫1.2.3.0/24
- 設定deny規則,並且在來源IP中填寫0.0.0.0/0
這樣請求的ip如果屬於1.2.3.0 - 1.2.3.255網段時觸發allow規則進而可以訪問到源站,而如果請求的ip不屬於該網段時不會觸發allow規則,而會觸發deny的規則進而被阻擋.
因此可以有效地達成除了特定ip可以訪問源站,其餘都會被阻擋的效果.
情境二:需要進行圖片驗證,並且只允許中國地區的用戶訪問
假設只希望中國地區的用戶可以訪問,並且在訪問前可以先通過圖片驗證,可以這樣做:
- 設定smart captcha規則,在國家選擇中國
- 設定allow規則,在國家選擇中國
- 設定deny規則,並且在來源IP中填寫0.0.0.0/0
這樣中國的用戶訪問時會先觸發圖片驗證,驗證通過以後再通過allow規則訪問到源站.
而其他國家的用戶訪問時不會觸發smart captcha規則以及allow規則,而會直接觸發deny規則而被阻擋.
情境三:需要限制特定請求IP,如1.2.3.0/24的訪問速度。若每秒超過200次,需先通過圖片驗證。同時,請求IP為2.2.2.2的用戶,不受訪問速度的限制。
- 設定smart captcha規則,並在請求IP中填寫1.2.3.0/24
- 在請求速率填寫200/1
如此一來,請求IP是1.2.3.0的用戶,每秒訪問第201次開始,即會觸發圖片驗證,而請求IP為2.2.2.2的用戶,每秒訪問200次以上也不會被阻擋。