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:blanktest: 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應用程式中常見的安全漏洞攻擊方式,提供了幾種判斷方式應對不同的攻擊手段
支援的判斷方式:

  1. http_violation:利用違反HTTP協議規範的方式,對Web應用程序進行攻擊
  2. http_anomaly:利用HTTP協議中的異常行為來攻擊Web應用程序.
  3. user_agent:利用HTTP協議中的User-Agent頭部欄位進行攻擊.
  4. generic_attack:例如未修复的漏洞或容易受到攻击的網路協議.
  5. sqli:利用 Web 應用程式的漏洞,向資料庫伺服器發送惡意的 SQL 查詢語句,以獲取未經授權的資料或執行非法操作.
  6. 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

可以在用戶訪問時就分辨出是否為瀏覽器發出的請求

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的方法.

配置順序

---2023-03-23---1.34.19
以上圖為例,域名下套用了四條規則,判斷的順序就為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時,可以這樣做:

  1. 設定allow規則,並且在來源IP中填寫1.2.3.0/24
  2. 設定deny規則,並且在來源IP中填寫0.0.0.0/0
    這樣請求的ip如果屬於1.2.3.0 - 1.2.3.255網段時觸發allow規則進而可以訪問到源站,而如果請求的ip不屬於該網段時不會觸發allow規則,而會觸發deny的規則進而被阻擋.
    因此可以有效地達成除了特定ip可以訪問源站,其餘都會被阻擋的效果.

情境二:需要進行圖片驗證,並且只允許中國地區的用戶訪問
假設只希望中國地區的用戶可以訪問,並且在訪問前可以先通過圖片驗證,可以這樣做:

  1. 設定smart captcha規則,在國家選擇中國
  2. 設定allow規則,在國家選擇中國
  3. 設定deny規則,並且在來源IP中填寫0.0.0.0/0
    這樣中國的用戶訪問時會先觸發圖片驗證,驗證通過以後再通過allow規則訪問到源站.
    而其他國家的用戶訪問時不會觸發smart captcha規則以及allow規則,而會直接觸發deny規則而被阻擋.

情境三:需要限制特定請求IP,如1.2.3.0/24的訪問速度。若每秒超過200次,需先通過圖片驗證。同時,請求IP為2.2.2.2的用戶,不受訪問速度的限制。

  1. 設定smart captcha規則,並在請求IP中填寫1.2.3.0/24
  2. 請求速率填寫200/1
    如此一來,請求IP是1.2.3.0的用戶,每秒訪問第201次開始,即會觸發圖片驗證,而請求IP為2.2.2.2的用戶,每秒訪問200次以上也不會被阻擋。
補充情境三,請求 IP 的欄位不同時,在計算請求速率時的方式會有些微差異