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,那就只有專案中的這個域名會命中條件。
請求表頭組
可以包含多個「請求表頭」。在同一個組裡,不同的請求表頭之間是 AND 判斷,必須全部符合才會觸發。
Tips:
請求表頭 (OR 判斷):將多個條件寫在同一個請求表頭輸入框裡,用換行區隔。
條件 A:Content-Type = application/json
條件 B:Content-Type = text/xml
-> 只要符合其中一個,就通過。請求表頭組 (AND 判斷):將條件分別寫在
多個請求表頭輸入框裡
條件 A:Content-Type = application/json
條件 B:Authorization header 必須存在
-> 兩個條件都符合,才通過。
Request Headers Not Exist
請求沒有包含哪些表頭時觸發該條件,此條件換行設定多項時判斷為 and。
假設今天設定了 user-agent 以及 host 兩項條件時,請求表頭只要缺少 user-agent 或者 host 其中之一就會觸發該條件
國家
請求使用者的所屬國家,可複選。
線路商
請求使用者的線路商提供者,如果線路商名稱有包含特殊符號需使用跳脫符號。
例如線路商名稱為 example (demo),那設定時就須填寫 example \(demo\) 才會正常觸發。
Proxy Type
使用了 ip2proxy 的資料庫判斷請求的代理類型。
Proxy Type,可以透過輸入請求的 IP 來判斷其代理類型
JA3 指紋雜湊
JA3 指紋是一種透過分析 TLS 握手階段中用戶端所發送的特定參數(如支援的加密套件、擴充選項等),來產生可辨識用戶端特徵的方法,可讓伺服器區分不同裝置或應用程式類型。此處可搭配事件查詢的「JA3 指紋 Hash」填寫。
請求方法
HTTP 請求當中的 Method 屬性,支援「GET」、「POST」、「PURGE」、「PUT」、「HEAD」、「OPTIONS」、「DELETE」與「PATCH」。
請求速率
當「同一個使用者(IP)」在一定時間內存取次數超過 N 次時觸發條件。填寫方式為 <請求次數>/時間(秒);比如我們填寫 5/2,代表同一個使用者在 2 秒內存取 5 次 則會觸發條件。
請求速率令牌
EDGE 會根據令牌(token)組成來判斷請求是否觸發 WAF 規則。例如,若請求速率設定為 200/1,表示在 1 秒內,具有相同特徵的請求訪問該域名超過 200 次,就會觸發 WAF 動作。
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
為了防止偽裝成瀏覽器的機器人來請求,可以進行圖片驗證,來確保用戶是正常用戶
Hotlink
檢查動態簽名 URL,以確保頻寬不被其他網站濫用,並維護內容的合法使用權
其他
以下會介紹跟 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 次以上也不會被阻擋。